2016-09-23 64 views
3

我學習Metal現在,並試圖瞭解以下行:爲line 1金屬 - 線程和線程組

let threadGroupCount = MTLSizeMake(8, 8, 1) ///line 1 
let threadGroups = MTLSizeMake(drawable.texture.width/threadGroupCount.width, drawable.texture.height/threadGroupCount.height, 1) ///line 2 

command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) ///line 3 
  1. ,什麼是3點的整數代表什麼?我的猜測是分配要在過程中使用的線程數量,但哪個是哪個?

  2. line 1和'line 2'之間有什麼不同?我的猜測再次是線程和線程組之間的差異。但我不確定什麼是根本區別,什麼時候使用什麼。

回答

5

將工作項的網格分派給計算內核時,您有責任將網格劃分成子集,稱爲線程組,其中每個線程的總線程數(寬*高*深)爲小於相應計算流水線狀態的maxTotalThreadsPerThreadgroup

尺寸threadsPerThreadgroup指示網格的每個子集的「形狀」(即每個網格維度中的線程的數量)。 threadgroupsPerGrid參數指示有多少個線程組組成整個網格。就像你的代碼一樣,它通常是紋理的尺寸除以你選擇的線程組大小的尺寸。

一個性能說明:每個計算管道狀態都有一個threadExecutionWidth值,表示線程組的多個線程將由GPU一起調度和執行。因此,最佳線程組大小將始終爲threadExecutionWidth的倍數。在開發過程中,只需發送一個小方格即可,完全可以接受。

1

第一行給出每組線程數(在本例中爲二維8x8),而第二行給出每個網格的組數。然後第三行上的dispatchThreadgroups(_:threadsPerThreadgroup:)函數使用這兩個數字。在這種情況下,組的數量可以省略,默認使用一個組。