연속적인 OpenGL Compute Shader 호출 동기화


12

특정 순서로 실행해야하고 출력이 이전 입력에 의존하는 두 개의 컴퓨팅 쉐이더가 있습니다. 이상적으로는 버퍼 클라이언트 측을 복사 할 필요가 없으며 GPU에 대한 모든 작업을 수행 할 필요가 없습니다.

나는 두 개의 컴퓨 트 셰이더 컴파일로 연결이 고려 program_oneprogram_two. GL_SHADER_STORAGE_BUFFER에 의해 쓰여지고 program_one읽은 데이터가 포함되어 있다고 가정 해보 십시오 program_two. 간단히 다음을 수행 할 수 있습니까?

glUseProgram(program_one);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

glUseProgram(program_two);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

읽기와 쓰기 사이의 데이터 경쟁을 피하기 위해 첫 번째 컴퓨팅 셰이더의 모든 호출이 두 번째 호출의 호출 전에 완료되는 것이 보장 buffer됩니까? 그렇지 않은 경우 어떻게 동기화합니까?

답변:


12

OpenGL 사양에서는 두 개의 Compute Shader가 동시에 또는 다른 순서로 실행될 수 있으므로 보장되지 않습니다.

의 쓰기 가시성을 보장 glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)하려면 초 전에 호출 해야합니다 .glDispatchComputeprogram_one


메모리 모델에 관한 OpenGL.org 위키 기사에서 :

스테이지 사이의 [...] 호출은 임의의 순서로 실행될 수 있습니다. 여기에는 다른 렌더링 명령으로 시작된 호출이 포함됩니다. 다른 렌더링 작업에서 두 ​​개의 정점 셰이더가 동시에 실행될 가능성은 없지만 OpenGL은 보장 할없습니다 .

Shader Storage Buffer에 대한 Opengl.org 위키 기사에서 :

SSBO는 비 일관적인 메모리 액세스를 사용하여 읽고 쓰기 때문에 이미지로드 저장소 작업과 마찬가지로 적절한 장벽이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.