CUDA编程
host:主机端CPU
device:设备端GPU
kernels:核函数
- global:定义一个kernel函数
- 入口函数,CPU调用,GPU执行,返回void
- 线程层次
grid-> block -> threads : 找到一个线程:需要每个线程的编号(threadIdx)和对应的block
- <<<1个block,block的索引是2维的>>>
- int i 获取索引的下标
- 块索引 blockIdx
- 块维度 blockDim
- 上面的代码可以只用了一个block,可使用多个block
- 线程的全局位置更改(int i)
- 定义每个线程块空间大小(16,16)
- 需要多少个block(N/16,N/16)
- 例如N=32
- 每块16×16个线程(
threadIdx([0,15],[0,15]
)) - Grid有2×2个线程块Block(
blockIdx([0,1],[0,1])
blockDim = 16
) - 那么int i = blockIdx.x * blockDim.x + threadIdx.x
- 线程同步:
- Host与device数据传输
- global memory 全局存储器
- Constant memory 常量存储器
- cudaMalloc() global memory分配
- cudaFree()释放空间
- 拷贝
cudaMmcpy(目的地址,原地址,size, cudaMemcpyHostToDevice)
例如矩阵相乘,每个元素互不影响
-
cpu实现:
-
gpu实现:
- 对输入和输出数据内存进行管理,分配内存
- 并行处理
- 拷贝回cpu,释放内存
- 伪代码
- cuda核函数实现:
- 调用
线程同步
每一个块block可以使用__syncthreads()
等待上面程序所有线程都执行完成调用下面方法。
参考
图片来源
很老的一个视频但是入门确实是够了,推荐~