จอห์นได้เขียนคำตอบที่ดีเยี่ยมแล้วดังนั้นให้พิจารณาคำตอบนี้เป็นส่วนขยายของเขา
ตอนนี้ฉันทำงานมากด้วยการคำนวณเฉดสีสำหรับอัลกอริทึมที่แตกต่างกัน โดยทั่วไปแล้วฉันพบว่าการคำนวณเฉดสีสามารถเร็วกว่าพิกเซลแชเดอร์ที่เท่ากันหรือแปลงทางเลือกตามความคิดเห็นได้
เมื่อคุณพันศีรษะของคุณเพื่อดูว่าคอมพิวเตอร์เชดเดอร์ทำงานอย่างไรพวกเขาก็มีเหตุผลมากกว่านี้ในหลาย ๆ กรณี การใช้พิกเซลเชดเดอร์ในการกรองภาพจำเป็นต้องมีการตั้งค่าเฟรมเฟรมการส่งจุดยอดโดยใช้หลายขั้นตอนแชเดอร์และอื่น ๆ เหตุใดจึงต้องทำการกรองภาพ การใช้การแสดงผลแบบเต็มหน้าจอสำหรับการประมวลผลภาพเป็นเหตุผลเดียวที่ "ถูกต้อง" ในการใช้งานต่อไปในความคิดของฉัน ฉันเชื่อว่าผู้ที่เพิ่งเข้ามาใหม่ในเขตข้อมูลการคำนวณจะพบว่าตัวประมวลผลที่ได้นั้นมีความเป็นธรรมชาติมากขึ้นสำหรับการประมวลผลภาพมากกว่าที่จะแสดงให้เห็นถึงพื้นผิว
คำถามของคุณอ้างถึงการกรองภาพโดยเฉพาะดังนั้นฉันจะไม่อธิบายรายละเอียดมากเกินไปในหัวข้ออื่น ๆ ในการทดสอบของเราเพียงแค่ตั้งค่าการป้อนกลับการแปลงหรือการสลับวัตถุเฟรมเฟรมเพื่อแสดงผลให้กับพื้นผิวอาจต้องเสียค่าใช้จ่ายประมาณ 0.2ms โปรดทราบว่าสิ่งนี้ไม่รวมการแสดงผลใด ๆ ! ในกรณีหนึ่งเราเก็บอัลกอริทึมที่แน่นอนเดียวกันไว้ในพอร์ตเพื่อคำนวณเฉดสีและเห็นการเพิ่มประสิทธิภาพที่เห็นได้ชัดเจน
เมื่อใช้ตัวประมวลผลร่วมจะสามารถใช้ซิลิคอนใน GPU มากขึ้นในการทำงานจริง จำเป็นต้องใช้ขั้นตอนเพิ่มเติมทั้งหมดเหล่านี้เมื่อใช้เส้นทาง Pixel Shader:
- แอสเซมบลีจุดยอด (อ่านแอตทริบิวต์จุดสุดยอด, ตัวหารจุดสุดยอด, การแปลงชนิดขยายไปสู่ vec4 เป็นต้น)
- จุดสุดยอด shader จะต้องมีการกำหนดไม่ว่ามันจะน้อยที่สุด
- แรสเตอร์เซอร์ต้องคำนวณรายการของพิกเซลเพื่อแรเงาและแก้ไขเอาต์พุตจุดสุดยอด (อาจเป็นเพียง coords พื้นผิวสำหรับการประมวลผลภาพ)
- ต้องตั้งค่าและจัดการสถานะที่แตกต่างกันทั้งหมด (การทดสอบเชิงลึก, การทดสอบอัลฟา, กรรไกร, การผสม)
คุณสามารถยืนยันว่าข้อได้เปรียบด้านประสิทธิภาพที่กล่าวถึงก่อนหน้านี้ทั้งหมดอาจถูกทำให้ไร้ผลโดยไดรเวอร์อัจฉริยะ คุณจะถูกต้อง ไดรเวอร์ดังกล่าวสามารถระบุว่าคุณกำลังแสดงผลสี่เหลี่ยมเต็มหน้าจอโดยไม่ต้องทำการทดสอบเชิงลึก ฯลฯ และกำหนดค่า "เส้นทางลัด" ที่ข้ามงานไร้ประโยชน์ทั้งหมดที่ทำเพื่อรองรับพิกเซลที่น่ากลัว ฉันจะไม่แปลกใจถ้าบางคนขับทำเช่นนี้เพื่อเร่งการโพสต์การประมวลผลในเกม AAA บางเกมสำหรับ GPU เฉพาะของพวกเขา แน่นอนคุณสามารถลืมเกี่ยวกับการรักษาใด ๆ หากคุณไม่ได้ทำงานในเกม AAA
สิ่งที่ผู้ขับขี่ไม่สามารถทำได้คือการหาโอกาสในการขนานที่ดีขึ้นโดยไปป์คำนวณ shader นำตัวอย่างคลาสสิกของตัวกรอง Gaussian ใช้การคำนวณเฉดสีคุณสามารถทำสิ่งนี้ (แยกตัวกรองหรือไม่):
- สำหรับแต่ละกลุ่มงานให้แบ่งการสุ่มตัวอย่างของอิมเมจต้นฉบับในขนาดกลุ่มงานและเก็บผลลัพธ์ไว้ในหน่วยความจำที่ใช้ร่วมกันของกลุ่ม
- คำนวณผลลัพธ์ตัวกรองโดยใช้ผลลัพธ์ตัวอย่างที่เก็บไว้ในหน่วยความจำที่ใช้ร่วมกัน
- เขียนลงบนพื้นผิวเอาต์พุต
ขั้นตอนที่ 1 คือกุญแจสำคัญที่นี่ ในเวอร์ชัน shader พิกเซลรูปภาพต้นฉบับจะถูกสุ่มตัวอย่างหลายครั้งต่อพิกเซล ในเวอร์ชันการคำนวณ shader เท็กซัสแต่ละแหล่งจะอ่านได้เพียงครั้งเดียวภายในกลุ่มงาน การอ่านพื้นผิวมักจะใช้แคชแบบเรียงต่อกัน แต่แคชนี้ยังช้ากว่าหน่วยความจำที่แชร์
ตัวกรอง Gaussian เป็นหนึ่งในตัวอย่างที่ง่ายกว่า อัลกอริธึมการกรองอื่นเสนอโอกาสอื่น ๆ ในการแบ่งปันผลลัพธ์ตัวกลางภายในกลุ่มงานโดยใช้หน่วยความจำที่แชร์
อย่างไรก็ตามมีการจับ การคำนวณเฉดสีจำเป็นต้องมีอุปสรรคหน่วยความจำอย่างชัดเจนเพื่อซิงโครไนซ์เอาต์พุต นอกจากนี้ยังมีการป้องกันน้อยลงเพื่อป้องกันการเข้าถึงหน่วยความจำที่ผิดพลาด สำหรับโปรแกรมเมอร์ที่มีความรู้ด้านการเขียนโปรแกรมแบบขนานที่ดีตัวคำนวณจะให้ความยืดหยุ่นมากกว่า อย่างไรก็ตามความยืดหยุ่นนี้หมายความว่ายังง่ายต่อการปฏิบัติกับตัวประมวลผลเช่นรหัส C ++ ทั่วไปและเขียนรหัสที่ช้าหรือไม่ถูกต้อง
อ้างอิง
- หน้า wiki ของ Compute Shaders
- DirectCompute: การเพิ่มประสิทธิภาพและแนวทางปฏิบัติที่ดีที่สุด, Eric Young, NVIDIA Corporation, 2010 [pdf]
- Praderam Shader Compute ที่มีประสิทธิภาพ, Bill Bilodeau, AMD, 2011? [PPS]
- DirectCompute สำหรับการเล่นเกม - เพิ่มพลังให้เครื่องยนต์ของคุณด้วย Compute Shaders, Layla Mah & Stephan Hodes, AMD, 2013, [pps]
- คำนวณการเพิ่มประสิทธิภาพ Shader สำหรับ GPU AMD: การลดแบบขนาน, Wolfgang Engel, 2014