क्रमिक रूप से OpenGL कंप्यूट शेडर इनवॉइस को सिंक्रनाइज़ करना


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

नहीं, इसकी गारंटी नहीं है, क्योंकि ओपनजीएल विनिर्देश अनुमति देता है कि दो कम्प्यूटरी शेडर समवर्ती या अलग-अलग क्रम में भी चले।

राइट्स की दृश्यता सुनिश्चित करने के लिए आपको glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)दूसरे glDispatchComputeसे पहले कॉल करना होगा program_one


मेमोरी मॉडल पर OpenGL.org विकि लेख से :

[...] चरणों के बीच के चालान को किसी भी क्रम में निष्पादित किया जा सकता है। इसमें विभिन्न रेंडरिंग कमांड द्वारा लॉन्च किए गए इनवोकेशन शामिल हैं। हालांकि यह संभव नहीं है कि अलग-अलग रेंडरिंग ऑपरेशंस से दो वर्टेक्स शेड्स एक ही समय में चल रहे हों, यह भी संभव है, इसलिए ओपनजीएल कोई गारंटी नहीं देता है

Shader Storage Buffer पर Opengl.org विकि लेख से :

SSBOs असंगत मेमोरी एक्सेस का उपयोग करते हुए पढ़ते और लिखते हैं, इसलिए उन्हें इमेज लोड स्टोर संचालन के रूप में उपयुक्त बाधाओं की आवश्यकता होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.