簡體   English   中英

OpenGL計算着色器中線程的執行順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM