ฉันจะควบคุมการคำนวณใดที่ทำบน CPU และที่จะทำบน GPU ได้อย่างไร


14

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

นี่เป็นคำอธิบายที่ถูกต้องหรือไม่?


2
คุณสามารถคำนวณบน GPU โดยใช้บางอย่างเช่นOpenCLซึ่งช่วยให้คุณสามารถเรียกใช้รหัสบน GPU ได้
สบู่

คำตอบ:


20

นั่นคือส่วนสำคัญของมัน

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

แต่จริงๆสิ่งที่คุณเพิ่งอธิบายคือสิ่งที่เกิดขึ้น


5
IIRC ส่วนที่รวบรวมไว้ในซีพียูก่อนถูกส่งไปยัง GPU และนั่นทำโดยไดรเวอร์ GPU ที่ไม่มีระบบปฏิบัติการ
MSalters

จริง ฉันได้จัดการกับข้อผิดพลาดในการคอมไพล์หลายครั้งในระหว่างที่โปรแกรมทำงานในตัวแปลงข้อมูลแม้ว่าโค้ดจาวาได้ถูกคอมไพล์แล้ว
Bassinator

1
ในทางทฤษฎี: สมมุติว่าฉันมีโปรแกรมที่ใช้ CPU มาก แต่เป็นเพียงอินเตอร์เฟสบรรทัดคำสั่ง (ไม่มีงานกราฟิก) ฉันจะลดการทำงานของ GPU ลงได้ไหม? จริง ๆ แล้วฉันไม่ได้วางแผนที่จะทำสิ่งนี้มันเป็นเพียงสิ่งที่มีแนวคิดที่ฉันสนใจ
Bassinator

2
ใช่ ลิงค์ที่ @return true โพสต์ไว้สำหรับไลบรารี Java ที่ทำเช่นนั้น โดยทั่วไปคุณสามารถเขียน "compute shader" ใน OpenGL หรือใช้ OpenCL ในทุกกรณีคุณจำเป็นต้องแยกส่วนของรหัสของคุณซึ่งขนานได้และส่งผ่านข้อมูลเข้าและออกจากมัน (GPU ส่วนใหญ่ยอดเยี่ยมสำหรับงาน "ขนานที่น่าอับอาย")
david van brink

1
เครื่องหมายดอกจันหนึ่งที่เพิ่มในคำตอบนี้คือการใช้งานบางอย่างสนับสนุนแนวคิดของ "preshader" - นั่นคือรหัสที่เป็นส่วนหนึ่งของ shader แต่ผลลัพธ์จะคงที่ตลอดการเรียกใช้ทั้งหมดในการเรียกที่กำหนด & เมทริกซ์การฉายภาพ) คอมไพเลอร์ shader ดังนั้นเอียงสามารถระบุบิตของรหัสเช่นนี้และยกพวกเขาออกไปดำเนินการเมื่อด้าน CPU รวมถึงผลลัพธ์คงที่ผลลัพธ์ในงานส่งไปยัง GPU เป็นกรณีทั่วไปที่สมมติฐาน "shader = GPU" อาจโค้งงอแม้ว่าจะมีรายละเอียดเท่านั้น
DMGregory

7

โดยทั่วไปใช่ Java ถูกใช้เพื่อเขียนโปรแกรมที่รันบน cpu ภาษา Shader (cg, hlsl, et al) ถูกใช้เพื่อเขียนโปรแกรมที่ทำงานบน gpu

ข้อยกเว้นสำหรับกฎนี้คือการใช้API ของบุคคลที่สามซึ่งสามารถเชื่อมช่องว่าง


1
เคล็ดลับที่น่าสนใจมากลิงค์ของคุณไปยัง "aparapi" เรียกใช้รหัส JVM บน GPU ... น่าสนใจ!
David van brink

3

david van brink ตอบคำถามของคุณโดยทั่วไป

แต่อย่างที่เขาบอกว่าไดรเวอร์ OpenGL สามารถทำงานบน CPU ได้และมันก็เกิดขึ้นมากมาย โดยเฉพาะอย่างยิ่งกับบริบทความเข้ากันได้ซึ่งไม่สามารถใช้งานฟังก์ชั่นแปลก ๆ บางอย่างในกราฟิกการ์ด พวกเขาต้องการการจำลองซอฟต์แวร์ ตัวอย่างเช่นฉันเคยได้ยินมาก่อนว่ามีการดำเนินการ stippling บน CPU คุณสามารถคาดหวังได้ด้วยการเลือก
ความประหลาดใจเหล่านี้สามารถเกิดขึ้นได้มากขึ้นใน MacOS โดยใช้ 2.1 บริบทเนื่องจาก Apple ได้รวมมุมมองของ OpenGL ไว้อย่างดีในช่วงฮาร์ดแวร์ของพวกเขา มันเป็นไปได้จริงที่จะสามารถรันข้อกำหนด ENTIRE OpenGL 2.1 ทั้งหมดบน CPU ได้อย่างสมบูรณ์หากรหัสการสร้างบริบทระบุอุปกรณ์ซอฟต์แวร์อย่างชัดเจน

ในทางกลับกันโค้ดที่ประมวลผลผ่านไลบรารีการคำนวณเช่น vexcl หรือเพิ่มการคำนวณหรือ AMP ของไมโครซอฟท์หรือ nVidia thrust สามารถดำเนินการได้บน GPU หรือ CPU ขึ้นอยู่กับการตั้งค่า API

และสำหรับการสัมผัสที่เสร็จสิ้นภายในซีพียูคุณยังมีสถาปัตยกรรม DSP ที่เป็นส่วนหนึ่งของมันที่เราเรียกว่า SIMD คอมไพเลอร์ ispc ของ Intel ให้ความช่วยเหลือในการสร้างรหัสที่ "มั่นใจ" เพื่อให้ทำงานบนเลน SIMD พร้อมการวินิจฉัยประสิทธิภาพจำนวนมากในเวลารวบรวมเพื่อช่วยให้คุณได้รับประโยชน์สูงสุด เพิ่ม OpenMP ลงไปและคุณสามารถรับ SIMD แบบมัลติเธรดซึ่งเข้าใกล้แนวคิดของ GPU หากคุณมี CPU ระดับไฮเอนด์และ GPU ระดับต่ำสุดสิ่งนี้อาจมีประสิทธิภาพมากกว่า
http://ispc.github.io/

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