การนำอัลกอริธึมมาใช้ผ่านการคำนวณเฉดสีกับค่าเฉดสีไปป์ไลน์


10

ด้วยความพร้อมของการคำนวณเฉดสีสำหรับ DirectX และ OpenGL ตอนนี้เป็นไปได้ที่จะใช้อัลกอริธึมมากมายโดยไม่ต้องผ่านขั้นตอนการแรสเตอร์และแทนที่จะใช้การคำนวณเอนกประสงค์บน GPU เพื่อแก้ปัญหา

สำหรับอัลกอริธึมบางสิ่งนี้ดูเหมือนจะเป็นวิธีแก้ปัญหาแบบ canonical ที่ใช้งานง่ายเพราะพวกมันไม่ใช่ rasterization based และ shaders ที่ใช้ rasterization ดูเหมือนจะเป็นวิธีแก้ปัญหาในการควบคุมพลังงาน GPU (ตัวอย่างง่าย ๆ : การสร้างพื้นผิวของเสียง )

มีอัลกอริทึมที่สามารถใช้งานได้ทั้งสองวิธีมีประโยชน์ด้านประสิทธิภาพการทำงานทั่วไป (ที่มีศักยภาพ) มากกว่าการใช้ตัวประมวลผลร่วมกับเส้นทางปกติหรือไม่ มีข้อเสียที่เราควรระวัง (ตัวอย่างเช่นมีค่าใช้จ่ายที่ผิดปกติบางอย่างเพื่อเปลี่ยนจาก / เป็นคำนวณเฉดสีที่รันไทม์)?

อาจมีประโยชน์หรือข้อเสียอื่น ๆ ที่ควรพิจารณาเมื่อเลือกระหว่างสองรายการนี้หรือไม่?


หากแท็กผลการดำเนินงานที่มีความเกี่ยวข้องจริง ๆ แล้วพิจารณาดูวิดีโอนี้จากเครื่องยนต์อัญมณีเกม "ผ้าจำลอง" บทความจาก Marco Fratarcangeli: youtube.com/watch?v=anNClcux4JQ คุณสามารถอ่านความคิดเห็นและค้นหาสิ่งที่น่าอึดอัดใจ: การใช้งานตาม GLSL / shader นั้นเร็วกว่าการใช้ CUDA หรือ OpenCL (อันหลังเนื่องจากการสนับสนุนไดรเวอร์ที่ไม่ดีในเวลาในปี 2010) มีความแตกต่างระดับต่ำบางอย่างที่ .. สร้างความแตกต่าง
Teodron

@teodron ฉันไม่มี GPU Gems และฉันไม่สามารถหาซอร์สโค้ดได้ ผู้แต่งใช้จุดยอด GLSL + พิกเซลจริง ๆ หรือว่าเขาใช้ตัวคำนวณคำนวณ GLSL
TravisG

ใช่ ก่อน CUDA นั้นเป็นวิธีที่ชุมชนใช้คุณสมบัติ GPGPU นี่คือการเชื่อมโยงไปยัง OpenCloth เพื่อดูวิธีการหนึ่งที่อาจจะประสบความสำเร็จเพียงแค่ว่าการใช้ GLSL บริสุทธิ์หรือ Cuda: code.google.com/p/opencloth/source/browse/trunk/...
teodron

คำตอบ:


7

ไม่มีคำตอบที่ถูกต้องหากคุณจะได้รับประโยชน์โดยตรงจากการคำนวณ shadrs / GPGPU การประเมินนี่ขึ้นอยู่กับประเภทของอัลกอริทึมที่คุณใช้งานการคำนวณเฉดสีและ CUDA / OpenCL เป็นวิธีการทั่วไปที่จะเอาชนะข้อ จำกัด บางประการ ของการแฮ็กภาษาที่เก่าแก่นั้น ประโยชน์ที่สำคัญที่สุดที่คุณจะได้รับ:

  • การเข้าถึงข้อมูลเชิงพื้นที่ ในการแฮ็ค GLSL แบบเก่า (ก็เป็นแฮ็ค!) ให้ข้อมูลเพียงเล็กน้อยเกี่ยวกับชิ้นส่วนเพื่อนบ้านเนื่องจากมันใช้พิกัดพื้นผิว ในการคำนวณเฉดสี / CUDA / OpenCL การเข้าถึงข้อมูลพื้นที่มีความยืดหยุ่นมากขึ้นตอนนี้คุณสามารถใช้อัลกอริทึมเช่นการทำให้เท่าเทียมกันฮิสโตแกรมบน GPU ที่มีการเข้าถึงพื้นผิว / บัฟเฟอร์ที่ไม่ได้รับคำสั่ง
  • จะช่วยให้คุณด้ายประสานและอะตอม
  • คำนวณพื้นที่:การแฮ็ก GLSL แบบเก่าจะทำให้การคำนวณพื้นที่จุดสุดยอด / ส่วนแฟรกเมนต์ของคุณเป็นไปอย่างยากลำบาก แฟรกเมนต์ shader จะทำงานตามจำนวนแฟรกเมนต์และเวอร์เท็กซ์ shader จะทำงานตามจำนวนของจุดยอด ในการคำนวณ shader คุณกำหนดพื้นที่ของคุณเอง
  • ความสามารถในการปรับขนาด : คอมพิวเตอร์คำนวณของคุณ / CUDA / OpenCL สามารถปรับขนาดได้ถึงจำนวนของ GPU SM (Streaming Multiprocessor) ที่มีให้ซึ่งแตกต่างจาก GLSL แบบเดิมที่ควรใช้กับ SM เดียวกัน (ตามความเห็นของนาธานรีดเขาบอกว่าไม่เป็นความจริงและคนที่น่ารักควรจะปรับขนาดให้ดีเท่าที่ควรจะเป็นในขณะนี้ฉันยังไม่แน่ใจว่าจะต้องตรวจสอบเอกสาร)
  • การสลับบริบท : ควรมีการสลับบริบท แต่ฉันจะบอกว่าขึ้นอยู่กับแอปพลิเคชันดังนั้นทางออกที่ดีที่สุดของคุณคือโปรไฟล์แอปพลิเคชันของคุณ

ในความคิดของฉันถ้าคุณต้องการไปเส้นทางคำนวณเฉดสีแม้ว่าอัลกอริทึมบางอย่างอาจจะเหมาะสมกว่ามีข้อควรพิจารณาบางประการที่คุณต้องคำนึงถึง:

  1. ฮาร์ดแวร์และเข้ากันได้ย้อนหลัง ตัวประมวลผลแบบ Compute มีเฉพาะในฮาร์ดแวร์รุ่นใหม่เท่านั้นและหากคุณกำลังมองหาผลิตภัณฑ์เชิงพาณิชย์ (เช่นเกม) คุณต้องคาดหวังว่าผู้ใช้จำนวนมากอาจไม่สามารถเรียกใช้ผลิตภัณฑ์ของคุณได้
  2. คุณมักจะต้องมีความรู้พิเศษในการ GPU / ซีพียูสถาปัตยกรรม , การเขียนโปรแกรมแบบขนานและ multithreading (เช่นการแชร์หน่วยความจำหน่วยความจำการเชื่อมโยงกันประสานด้ายอะตอมและมันมีผลต่อประสิทธิภาพการทำงาน) ที่คุณมักจะไม่จำเป็นต้องใช้ปกติ shaders rounte
  3. ทรัพยากรการเรียนรู้จากประสบการณ์มีทรัพยากรการเรียนรู้น้อยกว่ามากสำหรับ Compute shadrs, OpenCL และ CUDA (ซึ่งยังมีการทำงานร่วมกันของ OpenGL) กว่าเส้นทาง shaders ปกติ
  4. เครื่องมือแก้จุดบกพร่องด้วยการขาดการดีบักที่เหมาะสมการพัฒนาเครื่องมืออาจกลายเป็นเรื่องที่ยากกว่าตัวเคลือบเงาส่วนใหญ่
  5. ฉันคาดว่าการคำนวณเฉดสีจะให้ประสิทธิภาพที่ดีกว่าอัลกอริทึมแบบเดียวกันในตัวเฉดสีอื่น หากพวกเขาทำถูกต้องโดยคำนึงถึงสิ่งต่าง ๆ จากจุดที่ 2 เนื่องจากพวกเขาถูกออกแบบมาเพื่อหลีกเลี่ยงขั้นตอนพิเศษสำหรับการเรนเดอร์กราฟิก แต่ฉันไม่มีหลักฐานชัดเจนที่สนับสนุนข้อเรียกร้องของฉัน
  6. คุณควรพิจารณา CUUDA / OpenCL สำหรับ GPGPU หากคุณไปเส้นทางนั้น

ไม่น้อยฉันมั่นใจว่ามันยอดเยี่ยมสำหรับอนาคตและจะเป็นประสบการณ์การเรียนรู้ที่ยอดเยี่ยม โชคดี!


ฉันคิดว่า OP อาจจะถามสิ่งนี้: ทำไมต้องแก้ปัญหาด้วยการใช้ GLSL บริสุทธิ์กับการเข้ารหัสใน CUDA มีบทความเกี่ยวกับ Game Programming Gems เกี่ยวกับการจำลองผ้าซึ่งผู้เขียนทำเช่นนั้น และวิธีเก่า ๆ ของ GLSL นั้นดีกว่าวิธี CUDA ในแง่ของประสิทธิภาพ คุณอาจจะชี้ให้เห็นว่าทำไมถ้าคุณมีความคิดว่าทำไม
Teodron

2
ฉันไม่คิดว่าจุดขยายความสามารถของคุณนั้นถูกต้อง - จุดสุดยอดและตัวแบ่งส่วนเป็นเพียงความสามารถในการปรับข้าม GPU ทั้งหมดตามที่ตัวคำนวณคำนวณ ที่จริงแล้วการคำนวณเฉดสีนั้นยากต่อการปรับขนาดเนื่องจากขนาดของกลุ่มเธรดและการใช้หน่วยความจำแบบแบ่งใช้สามารถเพิ่มข้อ จำกัด เพิ่มเติมเกี่ยวกับจำนวนเธรดที่สามารถใช้งานได้ในแต่ละครั้ง
นาธานรีด

2
นอกจากนี้หากคุณกำลังสร้างพื้นผิว (เช่นการสร้างเสียงรบกวนหรือทำอัลกอริทึมขั้นตอนอื่น ๆ ) ในประสบการณ์ของฉันชิ้นส่วน shader จะเร็วกว่าตัวประมวลผลถ้าคุณเพียงแค่ประเมินสูตรในแต่ละพิกเซล ฉันเดาว่าเป็นเพราะลำดับแฟรกเมนต์ตรงกับการเรียงลำดับพิกเซลภายใน / สวิซช์พิกเซลดังนั้นจึงได้รับตำแหน่งหน่วยความจำที่ดีกว่าตัวประมวลผลที่ไม่รู้คำสั่งนี้ การคำนวณเฉดสีจะเร็วขึ้นเฉพาะในกรณีที่คุณสามารถใช้คุณสมบัติพิเศษเช่นหน่วยความจำที่ใช้ร่วมกันเพื่อเร่งความเร็วสิ่งต่าง ๆ ที่เกี่ยวข้องกับส่วนที่แตกออก
นาธานรีด

2
ตกลงความคิดเห็นล่าสุด :) ฉันคิดว่า GPU ในปัจจุบันส่วนใหญ่มีสวิทช์บริบทหรือสวิตช์โหมดบางประเภทเมื่อเปลี่ยนจากกราฟิกไปสู่การคำนวณและในทางกลับกัน ดังนั้นหากคุณเรียกใช้กราฟิกเชดเดอร์บางส่วนจากนั้นส่งเดอร์การคำนวณแล้วเรียกใช้กราฟิกเชดเดอร์อื่น ๆ อีกมากมายคุณจะพบกับประสิทธิภาพการทำงานบางอย่างเมื่อเปลี่ยนไปมา นั่นเป็นสิ่งที่คุณต้องทำการโพรไฟล์ แต่อาจเป็นอีกเหตุผลที่จะใช้กราฟิคในบางกรณี
นาธานรีด

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