คำถามติดแท็ก compute-shader

3
ตัวประมวลผลที่มีประสิทธิภาพสูงกว่าตัวกรองพิกเซลสำหรับการกรองภาพเมื่อใด
การดำเนินการกรองภาพเช่น blurs, SSAO, บลูมและอื่น ๆ มักจะทำโดยใช้ shaders พิกเซลและการดำเนินการ "รวบรวม" โดยที่การเรียกพิกเซล shader แต่ละครั้งจะมีปัญหาจำนวนเนื้อเรียกเพื่อเข้าถึงค่าพิกเซลที่อยู่ใกล้เคียงและคำนวณมูลค่าพิกเซลเดียว ผลลัพธ์. วิธีการนี้มีความไร้ประสิทธิภาพทางทฤษฎีในการดึงข้อมูลซ้ำซ้อนจำนวนมาก: การเรียกใช้ shader ที่อยู่ใกล้เคียงจะดึงข้อความเดียวกันซ้ำหลาย ๆ ข้อความ อีกวิธีที่จะทำคือการคำนวณด้วยเฉดสี สิ่งเหล่านี้มีข้อได้เปรียบที่เป็นไปได้ในการแบ่งปันหน่วยความจำจำนวนเล็กน้อยในกลุ่มการเรียกใช้ shader ตัวอย่างเช่นคุณสามารถให้แต่ละการเรียกใช้หนึ่ง Texel และเก็บไว้ในหน่วยความจำที่ใช้ร่วมกันจากนั้นคำนวณผลลัพธ์จากที่นั่น นี่อาจจะเร็วกว่าหรือไม่ก็ได้ คำถามอยู่ภายใต้สถานการณ์ใด (ถ้าเคย) เป็นวิธีการคำนวณ - shader จริงเร็วกว่าวิธีพิกเซล -shader? มันขึ้นอยู่กับขนาดของเคอร์เนลการดำเนินการกรองแบบไหน ฯลฯ เห็นได้ชัดว่าคำตอบจะแตกต่างจาก GPU รุ่นหนึ่งไปยังอีกรุ่นหนึ่ง แต่ฉันสนใจที่จะได้ยินหากมีแนวโน้มทั่วไป

1
เหตุใดจึงต้องการประสิทธิภาพการทำงานในการเขียนโปรแกรม GPU?
ฉันได้อ่านบทความต่อไปนี้เกี่ยวกับวิธีการสแกนแบบขนานใน CUDA: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html ในบทความมีความสำคัญในการทำให้การสแกน "ทำงานมีประสิทธิภาพ" กล่าวอีกนัยหนึ่งอัลกอริทึม GPU ไม่ควรทำการเพิ่มเติมนอกเหนือจากอัลกอริทึมของ CPU, O (n) ผู้แต่งนำเสนออัลกอริทึมสองอันหนึ่ง "ไร้เดียงสา" ที่เพิ่ม O (nlogn) และอีกหนึ่งพวกเขาคิดว่า "มีประสิทธิภาพในการทำงาน" อย่างไรก็ตามอัลกอริทึมที่มีประสิทธิภาพในการทำงานทำซ้ำสองเท่าของลูป จากความเข้าใจของฉัน GPUs เป็นเพียงโปรเซสเซอร์ SIMD ขนาดใหญ่และควรทำงานในขั้นตอนล็อค การวนซ้ำหลายครั้งในอัลกอริทึม "ประสิทธิภาพในการทำงาน" ดูเหมือนจะบอกเป็นนัยว่าเธรดจำนวนมากจะไม่ได้ทำงานและลดประสิทธิภาพในระยะยาว ฉันกำลังคิดถึงอะไร

1
การซิงโครไนซ์การเรียกใช้ OpenGL Compute Shader อย่างต่อเนื่อง
ฉันมีตัวประมวลผลสองตัวที่ต้องดำเนินการในลำดับที่แน่นอนและเอาต์พุตที่ขึ้นอยู่กับอินพุตก่อนหน้า เป็นการดีที่ฉันจะไม่ต้องคัดลอกบัฟเฟอร์ฝั่งไคลเอ็นต์และทำงานทั้งหมดของฉันบน 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)? ถ้าไม่ฉันจะซิงโครไนซ์มันได้อย่างไร?

1
การสร้างบรรทัดฐานยอดที่ใช้ร่วมกันบน GPU
ฉันส่วนใหญ่ประสบความสำเร็จในการย้ายการดำเนินการของ Marching Cubes จากซีพียูไปสู่การคำนวณด้วย OpenGL แต่ฉันยังไม่ได้แก้ไขกฎเกณฑ์บรรทัดฐานและสงสัยว่าวิธีที่ดีที่สุดจะไปเกี่ยวกับเรื่องนี้ ข้อตกลงการใช้งานของฉันเป็นการเฉพาะกับเขตข้อมูลมูลค่าไบนารี (ฉันกำลังพยายามจำลองฟังก์ชันเศษส่วน 3 มิติที่ยังไม่มีเครื่องมือประมาณระยะทาง) ดังนั้นวิธีการไล่ระดับสีและการส่งต่อความแตกต่างจะไม่ทำงาน ฉันใช้จุดสูงสุดร่วมกันและการใช้งาน CPU ของฉันใช้วิธีของ Quilez ตามที่อธิบายไว้ที่นี่เพื่อรวบรวมหน้าตามาตรฐานลงบนจุดสุดยอดแต่ละแห่ง ฉันสามารถนำการติดตั้งนี้ไปใช้กับ shader อื่นได้ แต่ปัญหาที่ฉันเห็นด้วยนี่คืออะตอมมิกจำนวนมากที่ต้องการ เนื่องจากเราสามารถใช้ atomics กับชนิดจำนวนเต็มสเกลาร์เท่านั้นและฉันไม่สามารถคิดวิธีที่จะแพ็ค 3 ลงนาม ints เป็น 1 ในทางที่สรุปได้ซึ่งหมายความว่า 3 แกน * 3 จุดยอด = 9 อะตอมเพิ่มการเรียกต่อ shader แน่นอนว่ามันจะกระจายไปทั่วหน่วยความจำดังนั้นจึงไม่เหมือนกับการกดอะตอมมิกเคาน์เตอร์เดียว 9 ครั้ง แต่มันก็ดูเหมือนว่าจะเป็นนรกมาก อีกทางเลือกหนึ่งคือการเรียกใช้ shader ต่อรูปหลายเหลี่ยมและสร้างรายการปกติของใบหน้า (ฉันอาจแพ็ค x10y10z10 ด้วยวิธีนี้) จากนั้น shader …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.