CUDA程序编写具体参数设置

介绍了GPU的结构以及资源的控制要素GPU硬件结构和程序具体参数设置_yu132563的专栏-CSDN博客)以及编程过程中的一些需要注意的问题(CUDA程序性能调优_yu132563的专栏-CSDN博客),下面就需要对程序进行具体参数的设置,让程序跑起来。

1、BlocksNum, ThreadsNumPerBlock的设置

BlocksNumThreadsNumPerBlock是执行kernel function时配置的值。这两个值通常都是经验求解,很难找到最优值。总体上来讲,这两个参数的设计主要通过下面两点进行考虑:

  • ThreadsNumPerBlock受限于device property的MaxThreadsPerBlock,经验取值为512/1024。
  • BlocksNum最大无限制,常见求解公式为:

2、ThreadNumPerBlock

对于ThreadNumPerBlock而言,其上限由硬件限制,有两个因素

  • 一个是  MaxthreadsPerBlock
  • 一个  MaxRegisterPerBlock/RegisterPerThread

 写好了Kernel后,其RegisterPerThread是固定值。该值由编译器确定可由nvcc的--ptxas-options=-v得出。ThreadNumPerBlock通常取值是256/512/1024(经验而谈,值越大越好)。但有时预先选好的值达不到100% Occupancy,所以选取可以达到最高Occupancy的最大值。那么,什么是Occupancy?

Occupancy:一个SM上active warp 比上 该SM最大的active warps的数量的比值。Low Occupancy会导致较低的instruction issue effiency(参考1.4节所说的关于latency的定义),因为没有足够多的可用warp来掩盖互相依赖的instruction之间的延迟。所以我们需要尽可能让Occupancy更大。Occupancy分为两种【Theoretical Occupancy】和【Achieved Occupancy】。Achieved Occupancy受制于Theoretical Occupancy。

Theoretical Occupancy, ThreadsPerBlock与RegisterPerThread

首先,如何根据ThreadsPerBlockRegisterPerThread计算Theoretical Occupancy?

  • 假设预先设置ThreadsPerBlock,可以得到WarpPerBlock
  • 计算  (注意整数相除,下取整)
  • 计算  ,对比该值与MaxWarpsPerSM,是否达到100%

上述计算中,RegisterPerSMRegisterPerThread都是常量。如未达到100%,则可以尝试更改ThreadsPerBlock看是否能达到更高Occupancy。

 Achieved Occupancy

 Achieved Occupancy无法高于Theoretical Occupancy,但有时会达不到理论值,具体如何见Achieved Occupancy

 BlockNum

BlocksNum的取值则更有讲究,  ,我们只需要求解BlocksPerSM即可。因为GPU执行机制的原因,理论上BlocksPerSM可以很大。因为如果每个SM平均很多Blocks,但SM每次只能并发执行两个Block,那后面的Block会放到stream里等到前面的Block执行完毕才能被SM执行。但通常来说,在占满SM资源的情况下,BlocksPerSM越小越好。结合CUDA_1D_LOOP来看,BlocksPerSM越小,总的Block数量就少,每个thread所处理的任务量多,可以减少一些创建Block的资源开销,如shared memory的初始化。针对于一个SM最大可以【并发concurrently】执行多少个Block,有如下几个因素限制上限:

因此,我们取这三个值的最小值作为BlocksPerSM即可。

参考文献:

CUDA程序调优指南(三):BlockNum和ThreadNumPerBlock - 知乎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值