2016-02-27 19 views
2

我的問題涉及ComputeShader,特別是HLSL代碼。因此,DeviceContext.Dispath(X, Y, Z)產生了X * Y * Z組,每個組都有屬性[numthreads(x,y,z)]中設置的x * y * z個別線程。問題是,我怎樣才能獲得分派的ThreadGroups總數和一個組中的線程數?讓我解釋爲什麼我需要它 - 我打算處理的數據量可能差別很大,所以我的方法應該適應輸入數組的大小。當然,我可以在常量緩衝區中發送Dispath參數以使其可以從HLSL代碼中獲得,但是對於組中的線程數呢?我正在尋找像GetThreadGroupNumber()GetThreadNumberInGroup()這樣的方法。我感謝任何幫助。HLSL獲取代碼中的threadGroups和numthreads的數量

回答

2

組中的線程數只是numthreads尺寸的乘積。例如,numthreads(32,8,4)將每個組有32*8*4 = 1024個線程。這可以在編譯時靜態確定。

可以通過將uint3輸入參數與SV_GroupId語義相加來確定特定線程組的ID。

一個線程組內一個特定的線程的ID可以通過添加與SV_GroupThreadID語義,或uintSV_GroupIndex一個uint3輸入參數,如果你喜歡的扁平版本來確定。

至於爲每個線程提供有關調度總大小的信息,使用常量緩衝區是最佳選擇。這類似於圖形管線,其中像素着色器不自然地知道視口尺寸。

還值得一提的是,如果你發現自己處於每個線程都需要知道整體分派大小的位置,那麼應該考慮重構你的算法。一般來說,最好分派可變數量的線程組,每個線程組都有固定的工作量,而不是派發固定數量的線程來完成可變的工作量。當然也有例外,但這往往會提供更好的硬件利用率。

+0

好吧,我明白了,ty回覆 – Ilia