2016-10-22 2 views
1

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을 공유 배열에 작성한 다음 배열에 대해 명시 적 축소 알고리즘을 실행하는 것입니다.) 내 직관은 그것이 위의 것보다 느릴 것이라고 천천히 말합니다. 하지만 어쨌든 ... 어쨌든, 나는 효율성에 관계없이 위의 내용이 올바른지 여부를 묻는 것입니다.)

답변

0

공유 메모리는 항상 비쌉니다. 당신은 왜 false sharing 기사에서 꽤 좋은 설명을 볼 수 있습니다.

하지만 여전히 공유 메모리를 사용하려는 경우 지원됩니다. 그들과 관련된 문제는 일관성없는 메모리와 실행 순서 뿐이다. 그러나 당신의 예제는 메모리 장벽과 실행 장벽으로 해결됩니다. 공유 메모리로보다 복잡한 연산을 수행하려면 atomic 내장 함수를 사용해야합니다. 자세한 내용은 OGL wiki에서 찾을 수 있습니다.