bool
변수 (배열이 아님)를 사용하여 계산 쉐이더에서 부울 감소를 시뮬레이트하려면 모든 스레드가 볼 수있는 false
값으로 변수를 초기화 한 다음 각 스레드가 true
값을 변수에 기록하여 값을 줄이거 나 아무 것도하지 않음으로써 false
값을 제공하십시오.컴퓨팅 쉐이더가 많은 스레드로부터 동일한 공유 메모리로 동일한 값을 쓸 수 있습니까?
예 :
shared bool someNumberIsBig;
// ...
void main()
{
uint id = gl_LocalInvocationID.x;
uint gid = gl_GlobalInvocationID.x;
if (id == 0) someNumberIsBig = false;
memoryBarrierShared();
barrier();
uint oneNumber = someBuffer[gid];
if (oneNumber > 5) someNumberIsBig = true; // WOW that's big
memoryBarrierShared();
barrier();
if (someNumberIsBig)
{
// do some work, with dynamic uniformity even, and with an
// assurance that at least one number was indeed big... or not??
}
}
그것은 나에게 간단 보인다,하지만 어쩌면 경쟁 어떻게 든 문제가 발생할 수있는 동일한 위치에 기록합니다. 여기에 정의되지 않은 구현 특정 동작에 의존하고 있습니까?
(내가하고 싶은 일을하는 또 다른 방법은 모든 bool을 공유 배열에 작성한 다음 배열에 대해 명시 적 축소 알고리즘을 실행하는 것입니다.) 내 직관은 그것이 위의 것보다 느릴 것이라고 천천히 말합니다. 하지만 어쨌든 ... 어쨌든, 나는 효율성에 관계없이 위의 내용이 올바른지 여부를 묻는 것입니다.)