CUDA程序编写具体参数设置
介紹了GPU的結(jié)構(gòu)以及資源的控制要素(GPU硬件結(jié)構(gòu)和程序具體參數(shù)設(shè)置_yu132563的專欄-CSDN博客)以及編程過(guò)程中的一些需要注意的問(wèn)題(CUDA程序性能調(diào)優(yōu)_yu132563的專欄-CSDN博客),下面就需要對(duì)程序進(jìn)行具體參數(shù)的設(shè)置,讓程序跑起來(lái)。
1、BlocksNum, ThreadsNumPerBlock的設(shè)置
BlocksNum和ThreadsNumPerBlock是執(zhí)行kernel function時(shí)配置的值。這兩個(gè)值通常都是經(jīng)驗(yàn)求解,很難找到最優(yōu)值??傮w上來(lái)講,這兩個(gè)參數(shù)的設(shè)計(jì)主要通過(guò)下面兩點(diǎn)進(jìn)行考慮:
- ThreadsNumPerBlock受限于device property的MaxThreadsPerBlock,經(jīng)驗(yàn)取值為512/1024。
- BlocksNum最大無(wú)限制,常見(jiàn)求解公式為:
2、ThreadNumPerBlock
對(duì)于ThreadNumPerBlock而言,其上限由硬件限制,有兩個(gè)因素
- 一個(gè)是? MaxthreadsPerBlock
- 一個(gè)? MaxRegisterPerBlock/RegisterPerThread
?寫好了Kernel后,其RegisterPerThread是固定值。該值由編譯器確定,可由nvcc的--ptxas-options=-v得出。ThreadNumPerBlock通常取值是256/512/1024(經(jīng)驗(yàn)而談,值越大越好)。但有時(shí)預(yù)先選好的值達(dá)不到100%?Occupancy,所以選取可以達(dá)到最高Occupancy的最大值。那么,什么是Occupancy?
Occupancy:一個(gè)SM上active warp 比上 該SM最大的active warps的數(shù)量的比值。Low Occupancy會(huì)導(dǎo)致較低的instruction issue effiency(參考1.4節(jié)所說(shuō)的關(guān)于latency的定義),因?yàn)闆](méi)有足夠多的可用warp來(lái)掩蓋互相依賴的instruction之間的延遲。所以我們需要盡可能讓Occupancy更大。Occupancy分為兩種【Theoretical Occupancy】和【Achieved Occupancy】。Achieved Occupancy受制于Theoretical Occupancy。
Theoretical Occupancy, ThreadsPerBlock與RegisterPerThread
首先,如何根據(jù)ThreadsPerBlock和RegisterPerThread計(jì)算Theoretical Occupancy?
- 假設(shè)預(yù)先設(shè)置ThreadsPerBlock,可以得到WarpPerBlock
- 計(jì)算??(注意整數(shù)相除,下取整)
- 計(jì)算??,對(duì)比該值與MaxWarpsPerSM,是否達(dá)到100%
上述計(jì)算中,RegisterPerSM和RegisterPerThread都是常量。如未達(dá)到100%,則可以嘗試更改ThreadsPerBlock看是否能達(dá)到更高Occupancy。
?Achieved Occupancy
?Achieved Occupancy無(wú)法高于Theoretical Occupancy,但有時(shí)會(huì)達(dá)不到理論值,具體如何見(jiàn)Achieved Occupancy。
?BlockNum
BlocksNum的取值則更有講究,??,我們只需要求解BlocksPerSM即可。因?yàn)镚PU執(zhí)行機(jī)制的原因,理論上BlocksPerSM可以很大。因?yàn)槿绻總€(gè)SM平均很多Blocks,但SM每次只能并發(fā)執(zhí)行兩個(gè)Block,那后面的Block會(huì)放到stream里等到前面的Block執(zhí)行完畢才能被SM執(zhí)行。但通常來(lái)說(shuō),在占滿SM資源的情況下,BlocksPerSM越小越好。結(jié)合CUDA_1D_LOOP來(lái)看,BlocksPerSM越小,總的Block數(shù)量就少,每個(gè)thread所處理的任務(wù)量多,可以減少一些創(chuàng)建Block的資源開(kāi)銷,如shared memory的初始化。針對(duì)于一個(gè)SM最大可以【并發(fā)concurrently】執(zhí)行多少個(gè)Block,有如下幾個(gè)因素限制上限:
因此,我們?nèi)∵@三個(gè)值的最小值作為BlocksPerSM即可。
參考文獻(xiàn):
CUDA程序調(diào)優(yōu)指南(三):BlockNum和ThreadNumPerBlock - 知乎
總結(jié)
以上是生活随笔為你收集整理的CUDA程序编写具体参数设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机数据结构英语作文,数据结构学习心得
- 下一篇: 提升CUDA程序运行效率的几个关键点