【C++】基础:CUDA并行编程入门

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍cuda入门。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

😏1. cuda并行编程介绍

当使用CUDA(Compute Unified Device Architecture)进行并行计算时,我们可以利用GPU(图形处理器)的强大性能来加速各种应用程序。

😊2. cuda向量加法示例

下面演示一下用cuda在GPU上执行向量加法:

// vector_add.cu
#include <stdio.h>

// CUDA核函数,用于在GPU上执行向量加法
__global__ void vectorAdd(int *a, int *b, int *c, int size) {
    // 获取当前线程的索引
    int tid = blockIdx.x * blockDim.x + threadIdx.x;

    // 确保线程索引在向量大小范围内
    if (tid < size) {
        // 计算向量元素相加结果
        c[tid] = a[tid] + b[tid];
    }
}

int main() {
    int size = 1000;
    int a[size], b[size], c[size];

    // 在设备上分配内存空间
    int *dev_a, *dev_b, *dev_c;
    cudaMalloc((void**)&dev_a, size * sizeof(int));
    cudaMalloc((void**)&dev_b, size * sizeof(int));
    cudaMalloc((void**)&dev_c, size * sizeof(int));

    // 初始化输入向量 a 和 b
    for (int i = 0; i < size; ++i) {
        a[i] = i;
        b[i] = i * 2;
    }

    // 将输入向量 a 和 b 复制到设备内存
    cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);

    // 定义每个块中的线程数和块数
    int threadsPerBlock = 256;
    int blocksPerGrid = (size + threadsPerBlock - 1) / threadsPerBlock;

    // 调用 CUDA 核函数执行向量加法
    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(dev_a, dev_b, dev_c, size);

    // 将计算结果从设备复制到主机内存
    cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);

    // 打印结果向量 c 的前10个元素
    for (int i = 0; i < 10; ++i) {
        printf("%d ", c[i]);
    }
    printf("\n");

    // 释放设备上的内存空间
    cudaFree(dev_a);
    cudaFree(dev_b);
    cudaFree(dev_c);

    return 0;
}

例程中,首先在主机内存中定义输入向量 a 和 b,并分配设备内存空间来存储输入和输出向量。然后,使用 cudaMemcpy 函数将输入向量从主机内存复制到设备内存。

接下来,定义了每个块中的线程数和块数,并调用了CUDA核函数 vectorAdd 来执行向量加法。该核函数使用线程索引来确定每个线程要处理的向量元素,并将加法结果存储在输出向量 c 中。

最后,使用 cudaMemcpy 函数将输出向量从设备内存复制回主机内存,并打印输出向量的前10个元素。最后,释放在设备上分配的内存空间。

用NVCC编译器编译cu程序:nvcc vector_add.cu -o vector_add

😆3. 将cuda高性能运算嵌入c++程序

在大型C++程序中,可以使用CUDA来加速特定的计算任务。下面演示一个程序:

// main.cpp
// 包含必要的头文件和声明CUDA函数
#include <iostream>

// CUDA函数声明
extern "C" void cudaFunction();

int main() {
    std::cout << "Running C++ code..." << std::endl;

    // 调用CUDA函数
    cudaFunction();

    std::cout << "C++ code completed." << std::endl;

    return 0;
}

// cuda_code.cu
#include <stdio.h>

// CUDA函数定义
__global__ void kernelFunction() {
    printf("Running CUDA code...\n");
}

extern "C" void cudaFunction() {
    // 设置GPU设备并在设备上执行CUDA核函数
    cudaSetDevice(0);
    // cuda_kernel<<<nBlock,nThread>>>();
    kernelFunction<<<1, 1>>>();
    cudaDeviceSynchronize();
}

编译步骤如下:

nvcc -c cuda_code.cu -o cuda_code.o
g++ -c main.cpp -o main.o
g++ cuda_code.o main.o -o cuda_cpp -lcudart -L/usr/local/cuda/lib64

这样,就可以将CUDA函数嵌入到C++程序中,并在运行时通过调用C++代码来触发CUDA函数的执行。
在这里插入图片描述

以上。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DevFrank

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值