CUDA中確定你顯卡的thread和block數


CUDA中確定你顯卡的thread和block數

在進行並行計算時, 你的顯卡所支持創建的thread數與block數是有限制的, 因此, 需要自己提前確定夠用, 再進行計算, 否則, 你需要改進你的算法, 或者, 更新你的硬件了.

硬件方面總結

  1. 首先你需要知道你的顯卡的Compute Capability , 在目前市面上絕大多數的都是支持1024 threads , 只有一些非常早期(Compute 1.x)的只是支持 512 threads. 如果是非常早期的一些顯卡的話可以參閱這個WebPage
  2. 在你確定完你的Compute Capability 后, 根據此, 你的顯卡的Compute Capability 如果是 1.x的話, Grid 支持的只有 1D 和 2D , 2.x 及以上才支持 3D 的 Grid , 而 block 則在1.x和2.x及更新的版本都支持3D , 在1.x / 2.x+的情況下, 每個block的最大支持分別是[512,512,64] / [1024,1024,64] ,現代顯卡的Grid的size已經可以支持到[2^31-1,65535,65535]
  3. 每個block中的寄存器, 在Compute Capability為1.0,1.1/1.2,1.3/2.x-/3.0/3.2/3.5-5.2/5.3/6-6.1/6.2/7.0的情況下, 對應的寄存器總量不超過8k/16k/32k/64k/32k/64k/32k/64k/32k/64k .
  4. 每個Block中 , 在Compute Capability為1.x/2.x-6.2/7.0的情況下, 對應的 share memery不能超過 16kb/48kb/96kb .
  5. 你的block的數量,前面已經說了,現在的顯卡Grid的size一般最大支持[65535,65535,1],因此,當你需要的block小於65535時,使用1D即可,如果你的Compute Capability 大於3.0的話,同樣是1D,你的Grid最大可以支持231-1個block,2D或者3D時,你的grid最大可以支持[231-1,65535,65535]
  6. 如果你超過了你的顯卡的硬件限制, 它會自動停止工作.

經驗總結

實際上, 你想要充分利用你的顯卡的性能, 就需要對你的代碼仔細分析, 然后才能夠 充分利用, 而不是每一條都照着官方給的標准進行. 簡單總結下 :

  1. 每個 block 上的 threads 數都應該是warp大小的四舍五入,在所有當前硬件上都是32。
  2. 充分利用streaming multiprocessor unit, 使得你的 warp 始終都在運行, 從而來隱藏一些內存讀取的時間, 簡單說就是, 讓你的所有warp始終都在計算, 這樣子的話, 你的內存讀取時間就可以基本被忽略(隱藏) .
  3. 利用好你的share memery 以及 sync .

參考

https://stackoverflow.com/questions/9985912/how-do-i-choose-grid-and-block-dimensions-for-cuda-kernels
https://en.wikipedia.org/wiki/CUDA


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM