OpenGLのスレッドの実行順序が不思議です。OpenGL計算シェーダでのスレッドの実行順序
私は、しばしばn_cores
から8 ... 32のモバイルGPUを持っているとします(たとえば、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)
)の実行とは異なることが起こります。ワークグループ内のスレッドが本当に並行しているかどうかはわかりません(ストリーミングマルチプロセッサのワープ)。
また、いくつのコアがワークグループ/シェーダにマッピングされていますか?
あなたの考えは?おかげで