片段着色器使用兩個原子計數器。它可能會或不會增加第一個,也可能不會增加第二個(但從來都不是)。然而,在修改計數器之前,它們的當前值總是被讀取,然後 - 如果計數器稍後被修改 - 那些先前讀取用於某些自定義邏輯的值。所有這些都發生在一個(很可能無法展開的)循環中。片段着色器中的GLSL原子計數器(和分支)
設想一個流程大致是這樣的:在一些小unrollable環
- ,說0-20(編譯時解析常數)...
- 爲AC1和AC2 獲取計數器值
- 檢查某個值:
- 如果x:在指數AC1,增量AC1
- 在其他設置uimage1D_A紋理像素:在uimage1D_B設置在紋素指數(imgwidth-AC2-1),增量AC2
問題:着色器查詢當前計數器值 - 它是否始終獲得「最新」值?我在這裏丟失了片段着色器的大規模並行性(僅針對當前代和未來的GPU和驅動程序)?
至於分支(如果x) - 我在另一個(readonly restrict uniform
)uimage1D
紋素比作(uniform
)uint
。所以一個操作數絕對是一個統一的標量,但另一個操作數是一個imageLoad().x
,儘管圖像是統一的 - 這種分支仍然是「完全並行化」的嗎?你可以看到兩個分支都是兩個完全相同的指令。假設一個「完美優化」的GLSL編譯器,這種分支可能引入一個失速?
謝謝你的澄清和警告:) – metaleap 2012-03-18 23:11:22