日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CUDA程序编写具体参数设置

發(fā)布時(shí)間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CUDA程序编写具体参数设置 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹了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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。