การซิงโครไนซ์การเรียกใช้ OpenGL Compute Shader อย่างต่อเนื่อง


12

ฉันมีตัวประมวลผลสองตัวที่ต้องดำเนินการในลำดับที่แน่นอนและเอาต์พุตที่ขึ้นอยู่กับอินพุตก่อนหน้า เป็นการดีที่ฉันจะไม่ต้องคัดลอกบัฟเฟอร์ฝั่งไคลเอ็นต์และทำงานทั้งหมดของฉันบน GPU

พิจารณาฉันมีสองเฉดสีประมวลรวบรวมและเชื่อมโยงเป็นและprogram_one program_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);

มันรับประกันได้หรือไม่ว่าการร้องขอทั้งหมดของ shader การคำนวณแรกจะเสร็จสิ้นก่อนที่จะมีการร้องขอที่สอง (เพื่อหลีกเลี่ยงการแย่งข้อมูลระหว่างการอ่านและการเขียนbuffer)? ถ้าไม่ฉันจะซิงโครไนซ์มันได้อย่างไร?

คำตอบ:


12

ไม่ไม่รับประกันเนื่องจากข้อกำหนด OpenGL อนุญาตให้ Compute Shader สองรายการรันพร้อมกันหรือแม้กระทั่งในลำดับที่แตกต่างกัน

คุณจำเป็นต้องโทรglMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)ก่อนที่สองเพื่อให้แน่ใจว่าการแสดงผลของการเขียนจากglDispatchComputeprogram_one


จากบทความ wiki ของ OpenGL.org ในรูปแบบหน่วยความจำ :

[... ] การเรียกใช้ระหว่างขั้นตอนอาจดำเนินการในลำดับใดก็ได้ ซึ่งรวมถึงการเรียกใช้ที่เรียกใช้โดยคำสั่งการแสดงผลที่แตกต่างกัน ในขณะที่มันอาจจะไม่น่าที่สอง shaders จุดสุดยอดจากการดำเนินงานการแสดงผลที่แตกต่างกันอาจจะทำงานในเวลาเดียวกันก็ยังเป็นไปได้เพื่อให้ OpenGL ไม่รับประกัน

จากบทความ wiki ของ Opengl.org เกี่ยวกับ Shader Storage Buffer :

SSBOs อ่านและเขียนใช้การเข้าถึงหน่วยความจำที่ไม่ต่อเนื่องกันดังนั้นพวกเขาต้องการอุปสรรคที่เหมาะสมเช่นเดียวกับการทำงานของ Image Load Store

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.