CUDA编程

CUDA编程和C++:线程协作

//适量相加,核函数调用时
add<<<N,1>>>(...);

尖括号中第一个元素为开辟的线程块个数,第二个元素为每个线程块中并发的线程数目。
总共启动的线程数目计算:
N 个线程块 ∗ 1 个并发线程数 = N 个线程 N个线程块 * 1个并发线程数=N个线程 N个线程块1个并发线程数=N个线程

对于线程块的索引:

int blockid=blockIdx.x;

对于并发线程的索引:

int threadid=threadIdx.x;

设备的最大线程块数目、单块最多并发线程数目


常见显卡计算能力8.x。
在这里插入图片描述
CUDA编程时,单块的并发线程数目不能超过maxThreadsPerBlock的值。

cuda的线程结构(grid;block;thread)

在这里插入图片描述

grid用来划分block(尖括号第一个参数);每个block都在一个SM单元上运行;每个线程在core上运行。
来源:https://zhuanlan.zhihu.com/p/544864997
一个grid包含多个block,grid最多三个维度;(蓝色)
一个block包含多个thread,block最多三个维度;(绿色)

gridDim用于对block的维度信息进行记录,便于索引。

//如上图:
gridDim.x=3;
gridDim.y=3;
gridDim.z=3;
//x,y,z:x维度优先(索引时有用)

假设某block在某grid位置为(a,b,c)
blockid=a+b*gridDim.x+c*gridDim.x*gridDim.y;

blockDim用于对thread的维度信息进行记录,便于索引。

//如上图
blockDim.x=4;
blockDim.y=4;
blockDim.z=4;
//x,y,z:x维度优先

假设某thread在某个block位置为(a,b,c)
threadid=a+b*blockDim.x+c*blockDim.x*blockDim.y;

当前进程的索引:


int threadNumPerBlock=blockDim.x*blockDim.x*blockDim.z;
int idx=threadid+threadNumPerBlock*blockid;

参考文献:
https://zhuanlan.zhihu.com/p/544864997
https://zhuanlan.zhihu.com/p/123170285

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值