[英]Execution order of threads in OpenGL compute shader
我想知道OpenGL中線程的執行順序。
假設我有一個移動GPU,其n_cores
通常在8到32之間(例如ARM Mali )。 這意味着它們與Nvidia(AMD)扭曲(波陣面)不同。
我問的原因是由於以下玩具示例
layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in;
shared float a[16];
void main() {
uint tid = gl_GlobalInvocationID.x; // <-- thread id
// set all a to 0
if (tid < 16) {
a[tid] = 0;
}
barrier();
memoryBarrierShared();
a[tid % 16] += 1;
barrier();
memoryBarrierShared();
float b = 0;
b = REDUCE(a); // <-- reduction of a array a
}
碰巧b
在執行之間是不同的( glDispatchCompute(1, 100, 1)
( glDispatchCompute(1, 100, 1)
),就好像存在某種競爭條件一樣。
我不確定工作組中的線程是否真的是並發的(就像流式多處理器中的扭曲一樣)。
還有多少個核心映射到工作組/着色器?
您對此有何看法? 謝謝
碰巧
b
在執行之間是不同的(glDispatchCompute(1, 100, 1)
(glDispatchCompute(1, 100, 1)
),就好像存在某種競爭條件一樣。
那是因為有一個:
a[tid % 16] += 1;
對於本地大小為256的工作組,該工作組中將至少有兩個調用的tid % 16
值相同。 因此,這些調用將試圖操縱同一索引a
。
由於沒有障礙或任何其他機制,以防止這種情況,那么這是對的元素的競爭條件a
。 因此,您得到未定義的行為。
現在,您可以通過原子操作來操縱a
:
atomicAdd(a[tid % 16], 1);
這是定義明確的行為。
我不確定工作組中的線程是否真的是並發的(就像流式多處理器中的扭曲一樣)。
這無關緊要。 您必須將它們視為同時執行。
還有多少個核心映射到工作組/着色器?
再次,本質上無關緊要。 這在性能方面很重要,但這主要是關於使本地小組規模變大。 但是就您的代碼是否有效而言,這無關緊要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.