Đồng bộ hóa các lệnh gọi Shader OpenGL liên tiếp


12

Tôi có một vài shader tính toán cần được thực hiện theo một thứ tự nhất định và đầu ra của nó phụ thuộc vào đầu vào trước đó. Lý tưởng nhất là tôi sẽ không bao giờ cần sao chép phía máy khách đệm và thực hiện tất cả công việc của mình trên GPU.

Hãy xem xét tôi có hai shader shute được biên dịch và liên kết là program_oneprogram_two. Giả sử tôi cũng có một GL_SHADER_STORAGE_BUFFERdữ liệu chứa dữ liệu được ghi bởi program_onevà đọc bởi program_two. Tôi có thể chỉ cần làm như sau:

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);

Có đảm bảo rằng tất cả các lệnh của trình đổ bóng tính toán đầu tiên sẽ kết thúc trước bất kỳ lệnh nào của lần thứ hai (để tránh các cuộc đua dữ liệu giữa đọc và viết buffer) không? Nếu không, làm thế nào để tôi đồng bộ hóa chúng?

Câu trả lời:


12

Không, nó không được bảo đảm, vì đặc tả OpenGL cho phép hai Compute Shader chạy đồng thời hoặc thậm chí theo thứ tự khác nhau.

Bạn cần gọi glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)trước lần thứ hai glDispatchComputeđể đảm bảo khả năng hiển thị của ghi từ program_one.


Từ bài viết wiki OpenGL.org về mô hình bộ nhớ :

[...] Yêu cầu giữa các giai đoạn có thể được thực hiện theo bất kỳ thứ tự nào. Điều này bao gồm các lệnh được khởi chạy bởi các lệnh kết xuất khác nhau. Mặc dù có thể không chắc chắn rằng hai trình tạo bóng đỉnh từ các hoạt động kết xuất khác nhau có thể chạy cùng một lúc, nhưng điều đó cũng có thể xảy ra, do đó OpenGL không đảm bảo .

Từ bài viết wiki Opengl.org về Bộ đệm lưu trữ Shader :

Các SSBO đọc và ghi sử dụng các truy cập bộ nhớ không liên tục, do đó chúng cần các rào cản thích hợp, giống như các hoạt động của Image Load Store.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.