CUDA程序如何選擇最優的grid和block size


CUDA程序如何選擇最優的grid和block size

fantasy5328
0.0762020.07.26 00:32:15字數 435閱讀 940

疑問

之前一直不太明白的一點:在thread總數確定的情況下,grid size(block number) 和block size(thread number per block)如何組合?
比如說想在8個SM上跑10248個thread,那可以81024,也可以16512,或32256,如何選擇最佳?

Background

首先明確GPU軟硬件的一些情況:

  • 計算engine中有很多SM,每個SM有很多core。
  • cuda程序中的每個block是跑在GPU中的一個SM上的,一個SM可以同時跑多個block。
  • 由於GPU的SIMT架構,每個core都采用流水線機制,處理多個thread才能隱藏延遲,達到最大性能。
  • 所以一個SM處理的thread數量往往大於core的數量。
  • 每個SM有最大thread數量限制,每個block也有最大block數量。
  • thread以warp(32個thread)為單位跑在SM上。
  • 在硬件限制條件下,跑越多thread,Occupancy()越高,吞吐量應該就越高。
  • 硬件限制包括線程數、維度、共享內存、寄存器等。

一些發現

  • GPU中一般SM的最大thread數量限制會大於每個block的最大block數量。
  • 根據網上的一些帖子,滿足SM最大thread數量的條件下,block數量少一些比較好。

總結

在需要滿足最高的吞吐量時,盡量滿足SM的最大thread數量,同時block數量盡量少。
舉例:SM最大thread:2048;block最大thread:1024.
這時就盡量安排每個SM 2個block,每個block1024個線程。當然還要滿足register、shared memory的要求。

 

轉自https://www.jianshu.com/p/11e75686892a


免責聲明!

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



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