การแปลงรูปทรงเรขาคณิตบน CPU vs GPU


9

ฉันได้สังเกตเห็นว่าโปรแกรม 3d หลายทำตามปกติเวกเตอร์การคำนวณ / เมทริกซ์เช่นเดียวกับการแปลงทางเรขาคณิตบน CPU มีใครพบความได้เปรียบในการเคลื่อนย้ายการคำนวณเหล่านี้เป็น shaders จุดสุดยอดใน GPU หรือไม่

คำตอบ:


3

พูดโดยทั่วไป: แปลงตาข่ายจะทำในที่ GPU คุณส่งเมทริกซ์การแปลงไปยัง GPU และ shader ใช้กับทุกส่วนของตาข่าย

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


เขียนส่วน "ช้าลงจริง ๆ บน GPU" นี่เป็นคำพูดที่กว้างมาก หากคุณกำลังพูดถึงการสร้างเมทริกซ์สำหรับแต่ละจุดสุดยอดของ GPU ประสิทธิภาพของคุณจะขึ้นอยู่กับคอขวดของคุณ คุณจะได้รับประสิทธิภาพที่ลดลงหากคุณมี ALU / ลงทะเบียนที่ถูกผูกไว้บน GPU ซึ่งเป็นกรณีที่ไม่จำเป็น ทำสิ่งเดียวกันบน CPU ก็จะช้าลงภายใต้สถานการณ์คอขวดเหล่านี้ ตัวอย่างที่นี้จะทำโดยทั่วไปบน GPU: เมทริกซ์พื้นที่ยอด shaders สร้างยอดสัมผัสได้ทันทีที่จะบันทึกยอดดึงข้อมูลแบนด์วิดธ์ อีกครั้งขึ้นอยู่กับคอขวดของคุณดังนั้น YMMV
jpaver

ฉันไม่สามารถลงคะแนนได้ แต่คำตอบนี้ควรจะลดลง มันผิดมากที่จะพูดว่า "ช้าลงจริง ๆ กับ GPU"
อดัม

3

การแปลงรูปทรงเรขาคณิตจำนวนมากสามารถทำได้บนโปรเซสเซอร์ที่ไม่ใช่ GPU แต่ต้องพิจารณาแพลตฟอร์มเป้าหมาย ระยะของคุณจะแตกต่างกันไปตามแพลตฟอร์มที่คุณกำหนดเป้าหมายและคอขวดของแพลตฟอร์มนั้น

สิ่งหนึ่งที่ต้องพิจารณาคือแบนด์วิดท์บัสระหว่างอุปกรณ์ที่สร้างรูปทรงเรขาคณิตและอุปกรณ์ที่แสดงผลรูปทรงเรขาคณิต

ในระบบพีซีทั่วไปที่ทันสมัยซีพียูอยู่ด้านหนึ่งของ PCIe บัส (http://en.wikipedia.org/wiki/PCI_Express) และ GPU อยู่อีกด้านหนึ่ง วิธีเดียวที่คุณสามารถถ่ายโอนข้อมูลที่สร้างต่อเฟรมจาก CPU ไปยัง GPU (และในทางกลับกัน) คือผ่านบัสนี้ ซึ่งหมายความว่าคุณสามารถถูก จำกัด ด้วยความเร็วในการถ่ายโอนของรถบัสนี้ หากแพลตฟอร์มเป้าหมายของคุณมี PCIe 2.x พร้อม 16 เลนคุณมีแบนด์วิดธ์ 8GB / s ในทางปฏิบัติการถ่ายโอนข้าม PCIe นั้นไม่ได้มีประสิทธิภาพ 100% เนื่องจากแบนด์วิดท์บางส่วนใช้สำหรับโปรโตคอลในระหว่างการถ่ายโอนของคุณ ขึ้นอยู่กับขนาดของการถ่ายโอนของคุณคุณอาจสูญเสียแบนด์วิดท์ของคุณได้ 5-10% เฉพาะค่าใช้จ่ายต่อแพ็คเก็ต

เช่น. ด้วยแพลตฟอร์มพีซีที่ใช้ PCIe 2.x พร้อม 16 เลนคุณสามารถสร้างข้อมูลได้มากเท่าใดต่อเฟรมเพื่อป้อนเข้าสู่ GPU สมมติว่าคุณต้องการรันที่ 60fps นี่แปลเป็น 8GB / 60 = 136MB ต่อเฟรมสำหรับ PCIe 2.x คูณด้วยบางส่วน (แขกรับเชิญ) 90% ปัจจัยที่จะบัญชีสำหรับค่าใช้จ่ายในการสื่อสารไดรเวอร์และค่าใช้จ่ายในการถ่ายโอนโปรโตคอล PCIe คุณสามารถสร้างข้อมูลประมาณ 120Mb ต่อเฟรมโดยไม่ถูก จำกัด โดยแบนด์วิดท์ PCIe 2.x

คำถามอื่นที่คุณต้องตอบ: การสร้างข้อมูล 120Mb นี้จะสามารถทำได้ง่ายใน 1/60 ของวินาทีใน CPU เป้าหมายของคุณหรือไม่ จำไว้ว่าคุณต้องทำงานเกมอื่น ๆ จำนวนมากบน CPU ของคุณคุณสามารถใช้เวลาในการสร้างข้อมูลที่ถูกแปลง ในแง่ของปริมาณ ALU ที่บริสุทธิ์เพียงอย่างเดียวสิ่งนี้สามารถ จำกัด คุณบน CPU ในแง่ของซีพียูถึง sysmem บัสคุณสามารถถูก จำกัด ด้วยแบนด์วิดท์ (ซึ่งแตกต่างกันไป แต่อยู่ที่ประมาณ ~ 8.5GB / s ในซีพียูล่าสุด)

เอาล่ะปัจจัยอะไรที่ทำให้มันมีศักยภาพในการทำ GPU มากกว่า? ปัจจัยหนึ่งคือแบนด์วิดท์หน่วยความจำ GPU ซึ่งเป็นแบนด์วิดธ์ระหว่าง GPU และหน่วยความจำวิดีโอท้องถิ่น สำหรับ GPU ระดับกลางร่วมสมัยแบนด์วิดท์หน่วยความจำวิดีโอนี้สามารถสูงถึง 200GB / s (ใช่นั่นคือ 25x ของแบนด์วิดท์ PCIe 2.x) อีกปัจจัยหนึ่งคือ GPU นั้นขนานกันอย่างหนาแน่นมี ALU นับร้อยและสามารถซ่อนเวลาแฝงในการเข้าถึงหน่วยความจำได้ด้วยการรันเธรดหลายพันรายการพร้อมกัน

ปัจจัยทั้งหมดเหล่านี้สามารถนำไปสู่การชนะอย่างชัดเจนในการผลักดันงาน GPU ให้มากขึ้น แต่ YMMV ขึ้นอยู่กับแพลตฟอร์มเป้าหมายของคุณอีกครั้ง


1

คุณหมายถึงอะไรโดย "การแปลงรูปแบบตาข่าย"? การแปลงรูปเรขาคณิตด้วยชุดเมทริกซ์บางชุด? เกมส่วนใหญ่ในปัจจุบันจะให้ GPU จัดการกับการเปลี่ยนแปลงอย่างง่ายสกินเนสและอื่น ๆ ส่วนใหญ่จะใช้จุดยอดเพื่อทำสิ่งนั้น ในบางแพลตฟอร์มคุณอาจไม่มีเงาหรือมีข้อดีอื่น ๆ ในการทำสิ่งเหล่านี้บน CPU ตัวอย่างเช่นบน PS3 คุณสามารถนำ RSX ออกได้โดยให้ SPU จัดการกับสกินและการแปลงสภาพ หากคุณกำลังทำแสงสว่างแบบมัลติพาสแล้วการสร้างสกินบน CPU นั้นมีประโยชน์เนื่องจากคุณต้องทำเพียงครั้งเดียวและส่งผลลัพธ์ที่จะดึงสำหรับแต่ละเรนเดอร์พาส ดังนั้นจึงมีข้อยกเว้น แต่โดยทั่วไปแล้วเกมส่วนใหญ่กำลังทำสิ่งเหล่านี้บน GPU และในเฉดสี

หรือคุณหมายถึงบางสิ่งที่นักเล่นชอบใช้ GPU สำหรับคณิตศาสตร์เวกเตอร์ทั่วไป วันนี้เรามี GPU ที่ใช้งานทั่วไปที่สามารถเรียกใช้รหัส C ที่ค่อนข้างทั่วไปผ่านระบบเช่น CUDA มันเป็นไปได้ที่จะใช้ประโยชน์จากสิ่งนี้สำหรับคณิตศาสตร์เวกเตอร์หนักและฉันรู้ว่ามีโปรแกรมที่ทำเช่นนี้ ฉันไม่มีประสบการณ์ใด ๆ กับมันเป็นการส่วนตัว


เปลี่ยน "การแปลงตาข่าย" เป็น "การแปลงรูปเรขาคณิต" เพื่อช่วยให้ชัดเจนขึ้น ฉันกำลังรอ opencl es อยู่ซึ่งจะวางจำหน่ายในต้นปีหน้า
zmdat

0

มีสถานการณ์ที่มีทุกอย่างที่แสดงผลบน GPU อาจสมเหตุสมผล แต่คุณไม่สามารถตั้งค่าคงที่ภายใน shader และไม่มีที่อื่นใดที่จะตั้งค่าเหล่านั้นยกเว้นด้าน CPU ก่อนการเรียกสาย

แม้ว่าคุณสามารถคำนวณค่าคงที่ของคุณเช่นเมทริกซ์การแปลงมวลกระดูกบน GPU ด้วยโปรแกรมกำหนดค่าเริ่มต้นที่กำหนดเองคุณอาจไม่ต้องการ GPU นั้นดีในการประมวลผลแบบขนาน แต่มีความเร็วสัญญาณนาฬิกาที่ช้ากว่ามาก

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

กฎทั่วไปคือ:

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