【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
      ...
相关推荐
2501_944521594 小时前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
行思理4 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
青瓦梦滋4 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
wangchunyu1146 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck6 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir6 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人7 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_944521597 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
meiying88388 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
@大迁世界9 小时前
告别 Go,拥抱 Rust
开发语言·golang·rust