前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】基础:CUDA并行编程入门

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

作者头像
DevFrank
发布2024-07-24 15:33:07
5010
发布2024-07-24 15:33:07
举报
文章被收录于专栏:C++开发学习交流

😏1. cuda并行编程介绍

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

😊2. cuda向量加法示例

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

代码语言:javascript
复制
// 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来加速特定的计算任务。下面演示一个程序:

代码语言:javascript
复制
// 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;
}
代码语言:javascript
复制
// 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();
}

编译步骤如下:

代码语言:javascript
复制
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函数的执行。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 😏1. cuda并行编程介绍
  • 😊2. cuda向量加法示例
  • 😆3. 将cuda高性能运算嵌入c++程序
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档