【CUDA8】第一个CUDA C++ Kernel --vector add

我们今天写一个最简单的GPU程序:

Ci = Ai + Bi

c++ 复制代码
for (int i = 0; i < N; i++) {
    C[i] = A[i] + B[i];
}

CUDA一个thread负责一个元素

first CUDA kernel

c++ 复制代码
__global__ void vector_add(
    float* A,
    float* B,
    float* C,
    int N
) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;

    if (i < N) {
        C[i] = A[i] + B[i];
    }
}

//__global__ 表示这是一个CUDA kernel,可以有CPU发起,然后再GPU上执行.还需要告诉GPU启动多少个block,每个block多少个thread,CUDA有一种非常特殊的调用语句vector_add<<<blocks, threads>>>(A, B, C, N);,代表blocks个blocks,每个block有threads个threads。

//参数AB为输入数组,C为输出数组 N为数组数量

//i负责计算当前thread到底应该处理哪个元素

完整的CUDA程序

c++ 复制代码
#include <iostream>
#include <cuda_runtime.h>

__global__ void vector_add(
    float* A,
    float* B,
    float* C,
    int N
) {

	//GPU程序
    int i = blockIdx.x * blockDim.x + threadIdx.x;//Thread  Block block中thread数

    if (i < N) {
        C[i] = A[i] + B[i];
    }
}

int main() {

    int N = 1000;

    size_t size = N * sizeof(float);

    float* A;
    float* B;
    float* C;

    cudaMalloc(&A, size);
    //在pytorch中直接torch。rnadn(N,device="cuda"),pytorch帮我们做了大量底层工作,在cuda c++中,我们自己申请GPU memory,cudaMalloc(&A,size),意思是在GPU global memory中分配一块内存,
    cudaMalloc(&B, size);
    cudaMalloc(&C, size);

    vector_add<<<
        (N + 255) / 256,
        256
    >>>(A, B, C, N);//grid

    cudaDeviceSynchronize();
    //CPU等待GPU完成,和torch.cuda.synchronize()同源

    cudaFree(A);
    cudaFree(B);
    cudaFree(C);

    return 0;
}

实现流程:

复制代码
CPU
 │
 │ vector_add<<<blocks, threads>>>
 ▼
CUDA Runtime
 │
 ▼
GPU
 │
 ├── Block 0
 │    ├── Thread 0 → C[0]
 │    ├── Thread 1 → C[1]
 │    ├── Thread 2 → C[2]
 │    └── ...
 │
 ├── Block 1
 │    ├── Thread 0 → C[256]
 │    ├── Thread 1 → C[257]
 │    └── ...
 │
 └── Block 2
      ...
相关推荐
-Marks-1 小时前
【C++编程】STL容器(二)--- vector底层模拟实现(常用接口实现 | 扩容机制 | 深浅拷贝 | 迭代器失效)
开发语言·c++·vector·内存管理·迭代器失效·vector底层模拟实现
Shadow(⊙o⊙)2 小时前
C++11并发支持库
开发语言·c++
一技安身2 小时前
【java】JDK8 + JDK17 绿色解压共存方案-全程不修改任何系统环境变量
java·开发语言
ShineWinsu2 小时前
对于Redis:主从复制的解析
linux·数据库·c++·redis·缓存·面试·主从复制
java、iOS、Vue2 小时前
Maven antrun vs Jenkins 脚本组装 deb的优缺点、适用场景
java·jenkins·maven
hudd6682 小时前
JavaEE 初阶 - 多线程(初阶)
java·开发语言·java-ee
I Am a robert girl3 小时前
稀有事件估计的迭代去对齐:从源码视角拆解重要性采样新范式
开发语言·python·机器学习·重要性采样·蒙特卡洛方法·稀有事件估计
CarIise3 小时前
Java实训阶段查漏补缺复习笔记2
java·linux·算法
Wang's Blog3 小时前
Java框架 SpringCloud 快速入门: Feign 的性能优化
java·spring cloud·性能优化