2016-09-08 1 views
6

저는 memoryBarrierShared의 유용성에 대해 궁금합니다. 내가 읽은 : 내가 장벽 기능에 대한 문서를 찾고 있어요 실제로glsl memoryBarrierShared usefulness

, 어떤이 전에 연산 쉐이더에서 장벽의 특정 정적 예를 들어

, 하나의 작업 그룹 내의 모든 호출은 암호를 입력해야합니다 그 너머 계속할 수 있습니다. 이것에 의해, 지정된 static 인스턴스의 barrier보다 전에 호출 한 값이, 같은 정적 인스턴스의 barrier 에의 호출 후에, 다른 호출에 의해 안전하게 읽어 낼 수가 있습니다. 호출은 이러한 장벽 호출간에 정의되지 않은 순서로 실행될 수 있기 때문에 정점 별 또는 패치 별 출력 변수 또는 공유 변수의 값은 여러 경우에 정의되지 않습니다. 우리가 안전하게 장벽을 사용한 후 값을 읽을 수 있는지

따라서는, 왜 우리는

memoryBarrierShared(); 
barrier(); 

정도

barrier(); 
memoryBarrierShared(); 

같은 뭔가 잘못, 내 질문은 몇 가지 코드에서 볼 수 있습니까 : 무엇 장벽이 충분하다면 memoryBarrier {Shared, ...}의 목적은 무엇입니까? 우리는 여러 단계를 사용하는 경우

는 memoryBarrierBuffer/이미지에 대한 이해 할 수 있지만, 공유, 나는이 현재 경합 실제로

답변

7

... 어떤 생각이 없습니다.

GLSL 4.50은 명시적인 메모리 장벽이 불필요하다는 것을 분명히합니다. 컴퓨팅 쉐이더의 barrier에는 모든 메모리 장벽이 포함됩니다.

그러나, GLSL ES는 3.20 barrier이 어떤 종류의 메모리 장벽을 포함하지 않는 것이 동등하게 풍부하게 명확하게 : 컴퓨 트 쉐이더

을, 장벽은 제어 흐름에 영향을 미치고 그 자체로하지 않습니다 메모리 액세스를 동기화하십시오. 특히, 주어진 정적 인스턴스 barrier() 이전에 하나의 호출로 작성된 값이 동일한 정적 인스턴스 barrier()을 호출 한 후에 다른 호출에 의해 안전하게 읽을 수있는 것은 아닙니다. 이를 위해서는 barrier()과 메모리 장벽을 모두 사용해야합니다.

은 특히 오프라인 glslang 컴파일러는 항상은 GLSL ES의 표현을 사용합니다. 따라서 Vulkan을 먹이로하기 위해 SPIR-V를 생성한다면 ES의 규칙을 따라야합니다. 글쎄, until they get that fixed, one way or another.

그런데, ES의 표현은 에 대한 전체 메모리 장벽으로 훨씬 더 의미가 있습니다.은 상당히 비쌉니다. 특히 공유 변수에 대한 액세스를 동기화하려는 경우에만 가능합니다.

barrier 호출과 함께 메모리 장벽을 사용하는 것이 좋습니다. 그렇게하면 일부 구현에서 약간 느려지더라도 쉐이더가 정확합니다.그러나 barrier 호출과 함께 메모리 장벽을 사용하려는 경우 메모리 장벽 은 먼저이되어야합니다. 실행을 동기화 한 후 메모리 장벽을 실행하는 것이 올바르지 않습니다.