2013-04-09 88 views
1

我正在嘗試優化NVIDIA GeForce 9800 GT圖形卡的OpenCL矩陣乘法程序。我將兩個512x512矩陣相乘,但我不確定我應該使用的全局和本地工作組大小。任何人都可以將我指向正確的方向嗎?理想的全球/本地工作組大小(OpenCL)

+1

只要不需要中斷計算以添加或修改輸入,全局大小理想情況下應儘可能高,如果是這樣,那麼沒有遞減的回報來使用足夠大的全局大小。儘管在實踐中,如果您使用的是GPU,但它們中的大多數不支持任務併發性,因此運行內核的GPU將僅執行此操作。所以如果你使用它作爲主顯卡,你的屏幕將會凍結。至於本地工作的規模,它取決於內核和設備,你可以讓OpenCL嘗試並優化它(查看clGetKernelWorkGroupInfo) – Thomas 2013-04-10 00:43:01

+0

請記住,Nvidia GPU將線程分組爲32個線程(一個warp),因此對於合併內存訪問時,您希望本地工作組大小的一個維度爲32的整數倍。 – chippies 2013-04-10 12:02:16

回答

3

由於512是兩個一個電源,你可以嘗試以下尺寸:

size_t global_work_size[2] = {512, 512}; 
size_t local_work_size[2] = {2^p, 2^n}; 

其中:

  • (2^m + 2^n) % 32 = 032一定是你數的分隔線程,作爲包裝將包含32線程

  • 兩個的功率需要爲當地工作尺寸必須是分壓器全球工作尺寸

  • 大小爲512,它肯定不會是一個問題,但你必須考慮到CL_DEVICE_MAX_WORK_GROUP_SIZE(由clGetDeviceInfo()給出)參數。對於更大的矩陣,您將不得不使用多於2的尺寸。

  • 維度的數量本身有限CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS ...

事實上,最好的選擇是算法依賴,並且依賴於所要執行的那種矩陣乘法。

3

如果您需要峯值性能,請將其與各種本地工作組大小進行基準比較,然後使用最佳值。您可能會驚訝地發現,最快的並不總是與實現的提供者給出的指導相匹配的那個!

1

同意Dithermaster,我想補充一點,如果GPU不是同一型號/代,即使來自同一供應商的GPU可能具有不同的最佳工作組大小,峯值性能也是高度依賴於平臺的。

爲了獲得最佳性能,您需要在目標平臺上進行實驗(預執行培訓)並找到最佳配置。請記住,不僅工作組的大小,而且工作組的形狀可能會顯着影響性能。這就是說,你真的需要嘗試所有的組合如下。假設內核的最大工作組大小爲1024,這意味着對於2-D工作組,您可以具有以下組合:(1,1024),(2,512),(4,256),(8, (128,68),(16,64),(32,32),(64,16),(128,8),(256,4),(512,2)和(1024,1)。

由於內存架構,緩存架構和波形安排等方式,請注意(1,1024)和(1024,1)可能會導致完全不同的性能。

是的,當然,您還需要考慮波/扭曲大小以及合併的內存訪問。在這裏,我只是談論一般的OpenCL工作負載,特別是當工作負載不顯示任何結構模式時,最好嘗試多種組合以確保您不會錯過任何內容。

+1

準確無誤。實際上,最大尺寸通常不是最大尺寸(基於寄存器文件大小),所以像(8,16),(32,4)和其他所有WIDTH * HEIGHT <= MAX的尺寸也應該被測試。 – Dithermaster 2016-04-19 16:13:32