CUDA程序编写具体参数设置
介紹了GPU的結構以及資源的控制要素(GPU硬件結構和程序具體參數設置_yu132563的專欄-CSDN博客)以及編程過程中的一些需要注意的問題(CUDA程序性能調優_yu132563的專欄-CSDN博客),下面就需要對程序進行具體參數的設置,讓程序跑起來。
1、BlocksNum, ThreadsNumPerBlock的設置
BlocksNum和ThreadsNumPerBlock是執行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
首先,如何根據ThreadsPerBlock和RegisterPerThread計算Theoretical Occupancy?
- 假設預先設置ThreadsPerBlock,可以得到WarpPerBlock
- 計算??(注意整數相除,下取整)
- 計算??,對比該值與MaxWarpsPerSM,是否達到100%
上述計算中,RegisterPerSM和RegisterPerThread都是常量。如未達到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 - 知乎
總結
以上是生活随笔為你收集整理的CUDA程序编写具体参数设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机数据结构英语作文,数据结构学习心得
- 下一篇: java升级菜单切换_java 关于系统