จนถึงตอนนี้ฉันสามารถค้นพบว่ามีการย้ายจาก circuritry พิเศษที่ใช้ขั้นตอนต่าง ๆ ของไปป์ไลน์กราฟิกไปยังแนวทางทั่วไปเพิ่มเติม การเปลี่ยนแปลงครั้งนี้สะท้อนให้เห็นบางส่วนใน 3D API ในรูปแบบของโปรแกรมที่น่าเชื่อถือ ทรานซิสเตอร์ส่วนใหญ่ดูเหมือนจะถูกนำไปใช้กับหน่วย SIMD แบบขนานขนาดใหญ่ที่ทำงานตามคำสั่ง shader จริง
แก้ไข. โดยทั่วไปเนื่องจากขนาดฟีเจอร์ที่ค่อนข้างใหญ่ใน GPU รุ่นเก่าวิธีเดียวที่จะใช้สิ่งต่าง ๆ ได้อย่างมีประสิทธิภาพเช่นการให้แสงพื้นฐานการลดรอยหยักการจับคู่พื้นผิวเรขาคณิต ฯลฯ คือการใช้ฟังก์ชัน "คงที่" พวกเขาเสียสละความยืดหยุ่นเพื่อประสิทธิภาพเนื่องจากพวกเขามีความหนาแน่นของชิปไม่เพียงพอที่จะใช้งานได้โดยใช้สถาปัตยกรรม SIMD แบบขนานที่หนาแน่นกว่าเช่น GPU ในปัจจุบัน
เป็น GPU ที่ทันสมัย (คิดว่า Nvidia Fermi) เป็นชุดของ "SIMD" อาร์เรย์ SIMD ที่ "โง่" ที่ป้อนด้วยคำแนะนำและข้อมูลจาก CPU และแคชต่างๆและตรรกะจริงทั้งหมดที่แมปไปป์ไลน์กราฟิกกับคำแนะนำเหล่านั้นเกิดขึ้นในไดรเวอร์กราฟิก ?
บางสิ่งยังคงทำในฮาร์ดแวร์ คนอื่นไม่ได้ ตัวอย่างเช่นROPsยังคงใช้ในขั้นตอนสุดท้ายเพื่อส่งข้อมูลพิกเซลเข้าสู่ชิปเซ็ต VGA หมายเหตุฉันใช้ "VGA chipset" ที่นี่เป็นคำทั่วไปเพื่ออ้างถึงกลไกที่ส่งสัญญาณวิดีโอไปยังจอภาพของคุณโดยไม่คำนึงว่าเป็น "VGA" อย่างแท้จริงหรือไม่
โดยทั่วไปแล้วสถาปัตยกรรม GPU ในปัจจุบันเช่น Nvidia Fermi และ AMD Islands Islands นั้นส่วนใหญ่แล้วจะมีซีพียูแบบขนานขนาดใหญ่ที่มีชุดคำสั่งที่กำหนดเองและ "คอร์" แต่ละตัวนั้นอ่อนแอมาก แต่มีทั้งจำนวนมากของแกน (บางครั้งหลายพัน) แต่ยังมีฮาร์ดแวร์เฉพาะกราฟิกอยู่ในนั้น:
การถอดรหัสวิดีโอฮาร์ดแวร์มักจะทำในส่วนใหญ่โดยใช้ฟังก์ชั่นชิปคงที่ นี่เป็นเรื่องจริงโดยเฉพาะเมื่อเกี่ยวข้องกับ DRM (การจัดการข้อ จำกัด ดิจิทัล) บางครั้งการถอดรหัสวิดีโอ "ฮาร์ดแวร์" จริง ๆ แล้วหมายถึงชุดคำแนะนำที่แนะนำเฟิร์มแวร์ซึ่งเพิ่งทำหน้าที่เป็นงานเก่าตามปกติสำหรับแกน SIMD มันขึ้นอยู่กับ
ยกเว้นบอร์ด Nvidia (เทสลา) เฉพาะสำหรับการคำนวณเท่านั้นการ์ดกราฟิก "ทั่วไป SIMD" เกือบทั้งหมดจะมีฮาร์ดแวร์ที่ครบถ้วนสำหรับการส่งสัญญาณวิดีโอ เอาต์พุตวิดีโอไม่เหมือนกับการเรนเดอร์ องค์ประกอบเอาท์พุทฟังก์ชั่นคงที่ประกอบด้วยตัวแปลงสัญญาณ LVDS / TMDS / HDMI / DisplayPort, HDCP และแม้แต่การประมวลผลเสียง (โดยทั่วไปคือ DSP เล็กน้อย) เนื่องจาก HDMI รองรับเสียง
"หน่วยความจำกราฟิก" ยังคงถูกจัดเก็บไว้บนเมนบอร์ดด้วย GPU ดังนั้นพวกเขาจึงไม่จำเป็นต้องผ่านการแชทและบัส PCIe latency ค่อนข้างสูงเพื่อเข้าชมแรมระบบซึ่งตัวมันเองช้ากว่าและใช้เวลาตอบสนองนานกว่าแพงกว่า คุณภาพที่สูงขึ้นหน่วยความจำกราฟิกที่เร็วขึ้น (เช่น GDDR5) ซึ่งมีขนาดเล็กลง แต่มีความเร็วสูงกว่าหน่วยความจำระบบ กระบวนการจัดเก็บข้อมูลในหน่วยความจำกราฟิกและการเรียกคืนจากที่นั่นไปยัง GPU หรือไปยัง CPU นั้นยังคงเป็นฟังก์ชั่นการใช้งานที่แน่นอน GPU บางตัวมี "IOMMU" ของตัวเอง แต่หน่วยการจัดการหน่วยความจำนี้แตกต่าง (แยกต่างหาก) จาก CPU สิ่งนี้ไม่เป็นความจริง แต่สำหรับ GPU ล่าสุดของ Intel ที่รวมอยู่ในโปรเซสเซอร์ (Sandy และ Ivy Bridge) ซึ่งสถาปัตยกรรมหน่วยความจำเกือบทั้งหมด "สอดคล้องกัน" หน่วยความจำระบบ) และการอ่านจากหน่วยความจำกราฟิกนั้นราคาถูกสำหรับ CPU เช่นเดียวกับ GPU
หรือมีหน่วยควบคุมบางแห่งใน GPU ที่แปลคำสั่งระดับสูงที่เข้ามาและสตรีมข้อมูล (โปรแกรม shader ที่รวบรวมข้อมูลจุดสุดยอดและคุณลักษณะและพื้นผิว) เป็นคำสั่ง SIMD จริงและดูแลการซิงโครไนซ์
ภาษา "ดั้งเดิม" ของ SIMDs นั้นสร้างขึ้นโดยคนขับรถในซอฟท์แวร์เกือบทุกครั้งและไม่ใช่โดยเฟิร์มแวร์ของ GPU สิ่งนี้เป็นจริงสำหรับคุณสมบัติระดับ DirectX 9 / OpenGL 2.x Shaders ที่เขียนด้วยภาษาระดับสูงเช่น HLSL, GLSL หรือแอสเซมเบลอร์ OpenGL ARB shader ได้รับการแปลในที่สุดโดยคนขับเข้าไปในคำสั่ง GPU โดยการต่อสู้กับการลงทะเบียนบางอย่างและทำการ PCIe hoops ที่ต้องการเพื่อส่งบัฟเฟอร์ชุดประมวลผล คำสั่ง
บางสิ่งเช่นฮาร์ดแวร์ tessellation (DirectX 11 / OpenGL 4.0) ถูกส่งเข้าไปในฮาร์ดแวร์อีกครั้งในลักษณะที่มีฟังก์ชั่นคงที่คล้ายกับวิธีที่พวกเขาเคยทำเกือบทุกอย่างในสมัยก่อน เนื่องจากข้อ จำกัด ด้านประสิทธิภาพนั้นต้องการวิธีที่มีประสิทธิภาพมากที่สุดในการคำนวณเหล่านี้คือต้องมีวงจรเฉพาะสำหรับมันแทนที่จะมีเฟิร์มแวร์หรือไดรเวอร์ "โปรแกรม" SIMD ที่จะทำ
ฉันสงสัยว่าความเป็นจริงอยู่ที่ไหนสักแห่งระหว่างทั้งสองขั้วและคำตอบนั้นค่อนข้างยาวและอิงจากการเก็งกำไรจำนวนมาก (ต้องมีเหตุผลที่ผู้จำหน่าย GPU บางรายปฏิเสธที่จะเผยแพร่เอกสารใด ๆ ในผลิตภัณฑ์ของพวกเขา ซอร์สโค้ด ... ) แต่คำแนะนำใด ๆ ในทิศทางที่ถูกต้องและทรัพยากรที่มีประโยชน์จะได้รับการชื่นชมอย่างมาก
AMD และ Intel มีเอกสารที่แข็งแกร่งมากในช่วงเปิดตัวเกี่ยวกับ GPU ล่าสุดของพวกเขารวมถึงไดรเวอร์กราฟิกโอเพ่นซอร์สสำหรับ Linux (ดูโครงการ Mesa และ Direct Rendering Manager) หากคุณดูรหัสบางส่วนในไดรเวอร์เหล่านี้คุณจะหัวเราะเพราะนักเขียนไดรเวอร์กราฟิกต้องใช้รูปทรงเรขาคณิตของสิ่งต่าง ๆ เช่นการวาดรูปทรงหรือรูปแบบต่าง ๆ ใน "ซอฟต์แวร์" (แต่ใช้คำสั่งฮาร์ดแวร์เพื่อส่งของจริง legwork กับฮาร์ดแวร์สำหรับการประมวลผล), เพราะทั้ง GPU เฟิร์มแวร์และฟังก์ชั่นคงที่ไม่ได้มีอยู่อีกต่อไปในการประมวลผลอย่างเต็มที่ในฮาร์ดแวร์ :) มันเป็นเรื่องตลกที่พวกเขาต้องทำเพื่อสนับสนุน OpenGL 1.x / 2.x ฮาร์ดแวร์.
วิวัฒนาการเป็นไปอย่างนี้:
- นานมาแล้ว (ก่อนที่จะทำการเรนเดอร์ 3d แบบเรียลไทม์ถือว่าเป็นไปได้): การติดตามเรย์บน CPU เป็นเรื่องปกติสำหรับการเรนเดอร์แบบเรียลไทม์ สำหรับกราฟิกที่เรียบง่ายอย่างที่คุณเห็นใน Windows รุ่นแรก CPU นั้นเร็วพอที่จะวาดรูปทรงที่เรียบง่าย (สี่เหลี่ยมตัวอักษรของแบบอักษรรูปแบบการแรเงา ฯลฯ ) โดยไม่ต้องใช้ฮาร์ดแวร์ที่ทำงานตายตัว แต่ไม่สามารถวาดสิ่งที่ซับซ้อนเกินไปได้
- นานมาแล้ว (OpenGL 1.x): เกือบทุกอย่างถูกใช้งานโดยโซลิดสเตตฮาร์ดแวร์ ฟังก์ชั่นคงที่ "ทางไฟฟ้า" เป็นบรรทัดฐานแม้กระทั่งสำหรับการทำงานพื้นฐาน
- เมื่อสักครู่ที่ผ่านมา (OpenGL 2.x): ช่วงการเปลี่ยนภาพเพื่อทำให้ GPU สามารถตั้งโปรแกรมได้มากขึ้น "ตัวแบ่งส่วน" (aka pixel shaders) บนฮาร์ดแวร์อายุ 5 ปีเกือบจะสามารถทำการคำนวณโดยพลการเช่น CPU แต่มันถูก จำกัด โดยสถาปัตยกรรมซึ่งยังคงมุ่งเน้นไปที่กราฟิกมาก ดังนั้น OpenCL / DirectCompute จึงไม่สามารถใช้ได้กับฮาร์ดแวร์นี้
- เมื่อเร็ว ๆ นี้ (OpenGL 3.x): การเปลี่ยนไปใช้ GPU เพื่อวัตถุประสงค์ทั่วไปนั้นส่วนใหญ่จะเสร็จสมบูรณ์ แต่แน่นอนว่าเหมาะสำหรับเวิร์กโหลดที่เกี่ยวข้องกับเมทริกซ์ขนาดใหญ่ของข้อมูล (คิดว่าพีชคณิตเชิงเส้น) ถูกส่งเป็นแบทช์ ลำดับยาวของข้อมูลขนาดเล็กมาก (1 + 1, 2 * 4, 5 * 6 ตามลำดับ ฯลฯ ) การคำนวณเพื่อวัตถุประสงค์ทั่วไปมีให้บริการผ่าน OpenCL, CUDA และอื่น ๆ แต่ฮาร์ดแวร์ยังไม่เต็ม "ตัวประมวลผลร่วม SIMD" เพราะ (a) คุณยังคงต้องค้อนลงทะเบียนเฉพาะฮาร์ดแวร์เพื่อใช้งาน GPU; (b) การอ่านจาก GPU VRAM ช้ามากเนื่องจาก PCIe bus โอเวอร์เฮด (การอ่านจาก GPU นั้นไม่ได้รับการปรับให้เหมาะสมกับสถาปัตยกรรมปัจจุบัน) (c) สถาปัตยกรรมหน่วยความจำและแคชไม่สอดคล้องกับ CPU ฮาร์ดแวร์ฟังก์ชั่นคงที่จำนวนมากแบบดั้งเดิมยังคงวางอยู่
- ปัจจุบัน (OpenGL 4.x): กำจัดฮาร์ดแวร์ฟังก์ชั่นคงที่ดั้งเดิมจำนวนมาก ปรับปรุง GPU อ่านเวลาในการตอบสนองค่อนข้างดี IOMMUsอนุญาตให้ทำการแมป (แปล) ฮาร์ดแวร์ช่วยระหว่าง VRAM และหน่วยความจำระบบ ยังแนะนำฮาร์ดแวร์ tessellation นำองค์ประกอบกลับมาของฟังก์ชั่นคงที่
- อนาคต ( HSA)): GPU นั้นเป็นโปรเซสเซอร์ร่วม มันคือทั้งหมด แต่บูรณาการอย่างเต็มที่กับซีพียูที่มีความต้านทานน้อยมาก (สำหรับการอ่าน / เขียน) ระหว่าง GPU และ CPU แม้สำหรับ GPU โดยเฉพาะบน PCIe บัส สถาปัตยกรรมหน่วยความจำที่เชื่อมโยงกันอย่างเต็มที่ - "mi memoria es su memoria" (หน่วยความจำของฉันคือหน่วยความจำของคุณ) โปรแกรม Userspace สามารถอ่านได้จาก "VRAM" เช่นเดียวกับที่พวกเขาอ่านจากหน่วยความจำระบบโดยไม่ต้องใช้ไดรเวอร์ใด ๆ และฮาร์ดแวร์จะดูแลมัน คุณมีซีพียูสำหรับการประมวลผลแบบ "อนุกรม" (ทำสิ่งนี้จากนั้นทำสิ่งนี้จากนั้นทำเช่นนั้น) สำหรับปริมาณข้อมูลที่น้อยและ GPU สำหรับการประมวลผลแบบ "ขนาน" (ดำเนินการนี้กับชุดข้อมูลขนาดใหญ่นี้ ขึ้นอยู่กับว่าคุณเห็นว่าเหมาะสม) บอร์ดที่ GPU ตั้งอยู่อาจยังมี ROPs, ตัวแปลงสัญญาณ HDMI ฯลฯ แต่สิ่งนี้จำเป็นสำหรับการแสดงผล