มีประโยชน์สำหรับการใช้งาน CPU แทน GPU หรือไม่?


63

ฉันค้นคว้าโปรเซสเซอร์และการ์ดกราฟิกและพบว่า GPU นั้นเร็วกว่าซีพียู ฉันอ่านในบทความนี้หนึ่งNvidia GPU อายุ 2 ปีมีประสิทธิภาพสูงกว่าโปรเซสเซอร์ 3.2GHz Core I7 Intel 14 เท่าในบางสถานการณ์ หาก GPUs นั้นเร็วทำไมนักพัฒนาซอฟต์แวร์ถึงไม่ใช้มันสำหรับทุกฟังก์ชั่นในเกม เป็นไปได้ไหมที่ GPU จะทำสิ่งอื่นนอกเหนือจากกราฟิก


17
หากคุณอยู่ในเกมที่คุณถ่ายทำทุกอย่างไปยัง GPU และ CPU ของคุณแทบจะไม่ทำอะไรเลยคุณสามารถเพิ่มประสิทธิภาพได้โดยการวางภาระบางส่วนไว้บน CPU
Tetrad

3
GPU ของคุณอาจจะดีกว่าซีพียูของคุณ แต่ฉันไม่คิดว่าการ์ดจอของคุณจะดีกว่าเมนบอร์ดของคุณ (และฉันจะไม่เปรียบเทียบระบบปฏิบัติการกับไดรเวอร์ lol)
e-MEE

27
GPU is faster than a CPUเป็นตำนานที่ผิด ๆ ที่หลายคนเชื่อว่าหลังจากได้เห็นมาตรฐานอ้างอิงจากปัญหาที่มุ่งเน้นเฉพาะสำหรับ GPU (ปัญหาระดับนี้เรียกว่า "ปัญหาคู่ขนานที่น่าอับอาย") ดูคำตอบของคำถาม SuperUser นี้: ทำไมเราจึงยังใช้ ซีพียูแทน GPUs?
Lie Ryan


5
ผลประโยชน์หนึ่งคือการที่คอมพิวเตอร์ทุกเครื่องมีซีพียู :)
ทิมโฮลท์

คำตอบ:


50

"ฉันอ่านแล้วว่ารถ F1 เร็วกว่าที่เราขับบนถนน ... ทำไมคนไม่ใช้รถ F1 แล้วล่ะ?" ดี ... คำตอบสำหรับคำถามนี้ง่ายมาก: รถ F1 ไม่สามารถแตกหักหรือเลี้ยวเร็วที่สุดเท่าที่รถส่วนใหญ่ทำ (รถที่ช้าที่สุดสามารถเอาชนะ F1 ได้ในกรณีนี้) กรณีของ GPU นั้นคล้ายกันมากพวกเขาเก่งในการประมวลผลแบบเส้นตรง แต่พวกเขาก็ไม่ค่อยจะดีนักเมื่อเลือกเส้นทางการประมวลผลที่แตกต่างกัน

โปรแกรมที่ดำเนินการใน te GPU เหมาะสมเมื่อต้องดำเนินการขนานหลายครั้งเช่นเมื่อคุณต้องผสมผสานพิกเซลทั้งหมดจาก Texture A กับพิกเซลจาก Texture B และวางไว้ทั้งหมดใน Texture C งานนี้เมื่อดำเนินการใน CPU จะถูกประมวลผลเช่นนี้:

for( int i =0; i< nPixelCount; i++ )
     TexC[i] = TexA[i] + TexB[i];

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

     TexC[i] = TexA[i] + TexB[i];

จากนั้นมันจะเติมคอร์ทั้งหมดด้วยโปรแกรมนี้ (โดยเฉพาะการคัดลอกโปรแกรมไปยังคอร์), การกำหนดค่าiสำหรับแต่ละคอร์ จากนั้นมันก็มาถึงความมหัศจรรย์จาก GPU และทำให้แกนประมวลผลทั้งหมดทำงานในเวลาเดียวกันทำให้ทำงานได้เร็วกว่าโปรแกรมซีพียูเชิงเส้นอย่างมาก

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

  • 1: ดำเนินการโปรแกรมจนกระทั่งการดำเนินการทางตรรกะแรก
  • 2: ประเมิน
  • 3: ดำเนินการต่อจากผลลัพธ์ที่อยู่หน่วยความจำของการเปรียบเทียบ (เช่นเดียวกับคำสั่ง JNZ asm)

สิ่งนี้เร็วมากสำหรับ CPU ในการตั้งค่าดัชนี แต่เพื่อให้ GPU ทำเช่นเดียวกันมันซับซ้อนกว่ามาก เนื่องจากพลังจาก GPU นั้นมาจากการดำเนินการคำสั่งเดียวกันในเวลาเดียวกัน (เป็นแกน SIMD) จึงต้องทำการซิงโครไนซ์เพื่อให้สามารถใช้ประโยชน์จากสถาปัตยกรรมชิปได้ ต้องเตรียม GPU เพื่อจัดการกับสาขาหมายถึงมากหรือน้อย:

  • 1: สร้างเวอร์ชันของโปรแกรมที่ตามหลังเฉพาะสาขา A เติมโค้ดนี้ในคอร์ทั้งหมด
  • 2: ดำเนินการโปรแกรมจนกระทั่งการดำเนินการทางตรรกะแรก
  • 3: ประเมินองค์ประกอบทั้งหมด
  • 4: ดำเนินการประมวลผลองค์ประกอบทั้งหมดที่ตามสาขา A ต่อกระบวนการทั้งหมดที่เลือกเส้นทาง B (ซึ่งไม่มีโปรแกรมในแกนหลัก!) ตอนนี้แกนประมวลผลทั้งหมดที่เลือกพา ธ B จะว่างเปล่า - กรณีที่แย่ที่สุดที่เป็นแกนประมวลผลเดี่ยวและแกนแกนอื่น ๆ รออยู่
  • 5: เมื่อทั้งหมดเสร็จสิ้นการประมวลผลให้เปิดใช้งานเวอร์ชันสาขา B ของโปรแกรม (โดยการคัดลอกจากบัฟเฟอร์หน่วยความจำไปยังหน่วยความจำหลักขนาดเล็ก)
  • 6: ดำเนินการสาขา B
  • 7: หากต้องการให้ผสมผสาน / ผสานทั้งสองผลลัพธ์

วิธีนี้อาจแตกต่างกันไปตามสิ่งต่าง ๆ มากมาย (เช่นบางอย่างเล็กมากสาขาสามารถทำงานได้โดยไม่ต้องแยกความแตกต่างนี้) แต่ตอนนี้คุณสามารถเห็นแล้วว่าทำไมการแตกแขนงจึงเป็นปัญหา แคชของ GPU มีขนาดเล็กมากคุณไม่สามารถเรียกใช้โปรแกรมจาก VRAM ในลักษณะเชิงเส้นได้โดยจะต้องคัดลอกบล็อกคำแนะนำเล็ก ๆ ไปยังแกนที่จะดำเนินการและหากคุณมีสาขาเพียงพอ GPU ของคุณจะหยุดทำงานมากกว่าการประมวลผล โค้ดใด ๆ ที่ไม่สมเหตุสมผลเมื่อเรียกใช้งานโปรแกรมที่ตามสาขาเดียวเหมือนกับที่โปรแกรมส่วนใหญ่ทำ - แม้ว่าจะทำงานในหลายเธรดก็ตาม เปรียบเทียบกับตัวอย่าง F1 นี่เป็นเหมือนการเปิดร่มชูชีพเบรกทุกมุมจากนั้นออกจากรถเพื่อบรรจุพวกมันกลับเข้าไปในรถจนกระทั่งมุมถัดไปที่คุณต้องการเลี้ยวอีกครั้งหรือหาสัญญาณสีแดง (มุมถัดไป มีโอกาสมากที่สุด)

แน่นอนว่ามีปัญหาของสถาปัตยกรรมอื่น ๆ ที่ดีในการปฏิบัติงานเชิงตรรกะราคาถูกกว่าและเชื่อถือได้มากขึ้นแบบสแตนด์อะโลนรู้จักกันดีกว่าประหยัดพลังงาน ฯลฯ วิดีโอการ์ดรุ่นใหม่แทบจะไม่เข้ากันได้กับซอฟต์แวร์รุ่นเก่า ใช้คำแนะนำ asm ที่แตกต่างกันระหว่างพวกเขาแม้จะมาจากผู้ผลิตรายเดียวกันและในขณะที่การใช้งานคอมพิวเตอร์ส่วนใหญ่ไม่ต้องการสถาปัตยกรรมแบบขนานประเภทนี้และแม้ว่าพวกเขาต้องการพวกเขาพวกเขาสามารถใช้ผ่าน API มาตรฐานเช่น OpenCL เป็น พูดถึงโดย eBusiness หรือผ่านทาง API กราฟิก อาจเป็นไปได้ว่าในหลายทศวรรษเราจะมี GPU ที่สามารถแทนที่ CPU ได้ แต่ฉันไม่คิดว่ามันจะเกิดขึ้นเร็ว ๆ นี้

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


6
การเปรียบเทียบที่แปลก แต่มันก็เป็นจุดที่the fastest isn't always the fastestดี
S 's เมื่อ

1
ขอบคุณ! ฉันคิดว่ามันเป็นหัวข้อที่น่าสนใจเพราะมันผูกแนวคิดการเขียนโปรแกรมเกมจำนวนมากกับวิธีการทำงานของฮาร์ดแวร์ซึ่งค่อนข้างลืมในภาษาระดับสูงของวันนี้ มีสิ่งอื่น ๆ ที่ฉันต้องการเพิ่ม แต่การเขียนคำตอบใช้เวลาพอสมควรดังนั้นฉันจะพยายามอัปเดตในภายหลังเช่นความสามารถ "โหมดที่ได้รับการป้องกัน" ของซีพียูความเร็วบัสหน่วยความจำ ฯลฯ แต่ฉันหวังว่าสิ่งนี้จะชัดเจนขึ้น ข้อเสียทางเทคนิคบางประการของการดำเนินการทุกอย่างใน GPU
Pablo Ariel

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

5
@Pablo Ariel ฉันกำลังตอบกลับข้อความ: "รถ F1 ไม่สามารถแตกหักหรือเลี้ยวเร็วที่สุดเท่าที่รถส่วนใหญ่ทำได้" คุณแนะนำให้รถ F1 สามารถเร่งเป็นเส้นตรงเท่านั้นและไม่ดีมากในการเลี้ยวหรือในช่วงชะลอตัว แต่รถ F1 สามารถเบรกได้เร็วกว่า "รถยนต์ส่วนใหญ่" และสามารถเข้าโค้งความเร็วสูงได้อย่างยอดเยี่ยม
GargantuChet

4
การเปรียบเทียบมีความแม่นยำมากขึ้นถ้าคุณคิดใน Dragsters มากกว่ารถ F1
Agustin Meriles

32

GPUs นั้นดีมากในการทำงานแบบขนาน อันไหนดี ... ถ้าคุณกำลังทำงานขนานกัน

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

โดยทั่วไปเกมสามารถเธรดตัวเองในวิธีที่น้อยมาก สามารถหมุนกราฟิกในเธรด วนรอบเกมสามารถผลักข้อมูลจำนวนมากที่เธรดกราฟิกและพูดว่า: render สิ่งนี้ มันสามารถทำการแก้ไขพื้นฐานบางอย่างเพื่อให้วนรอบเกมหลักไม่จำเป็นต้องซิงค์กับกราฟิก เสียงเป็นอีกหัวข้อ ลูปเกมบอกว่า "เล่นสิ่งนี้" และเล่น

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

ดังนั้นคุณจะดูที่ 4 เธรด: เกมกราฟิกเสียงและการประมวลผล AI ระยะยาว นั่นไม่มาก และที่ไม่ได้เกือบพอสำหรับ GPUs ซึ่งจะมีหลายร้อยตัวอักษรของหัวข้อในการบินในครั้งเดียว นั่นคือสิ่งที่ทำให้ GPU มีประสิทธิภาพ: สามารถใช้เธรดเหล่านั้นทั้งหมดได้ในครั้งเดียว และเกมก็ทำอย่างนั้นไม่ได้

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

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

โอ้และการเข้ารหัสสำหรับ GPU นั้นแย่มาก เป็นการยากที่จะแก้ไขให้ถูกต้องและสิ่งที่ "ถูกต้อง" สำหรับสถาปัตยกรรม GPU หนึ่งอาจเป็นสิ่งที่ผิดอย่างยิ่งสำหรับอีกสิ่งหนึ่ง และนั่นไม่ได้เป็นเพียงการเปลี่ยนจาก AMD ไปเป็น NVIDIA ที่สามารถเปลี่ยนจาก GeForce 250 เป็น GeForce 450 ได้นั่นคือการเปลี่ยนแปลงในสถาปัตยกรรมพื้นฐาน และมันอาจทำให้โค้ดของคุณทำงานได้ไม่ดีนัก ไม่อนุญาตให้ใช้ C ++ และ C สิ่งที่ดีที่สุดที่คุณจะได้รับคือ OpenCL ซึ่งเหมือนกับ C แต่ไม่มีนิชนี่ เช่นเดียวกับการเรียกซ้ำ ถูกต้อง: ไม่มีการเรียกซ้ำบน GPU

แก้จุดบกพร่อง? โอ้ฉันหวังว่าคุณจะไม่ชอบคุณสมบัติการดีบัก IDE ของคุณเพราะสิ่งเหล่านั้นจะไม่สามารถใช้งานได้อย่างแน่นอน แม้ว่าคุณจะใช้ GDB ให้จูบลาก่อน คุณจะต้องทำการprintfดีบั๊ก ... รอไม่ต้องprintfใช้ GPU ดังนั้นคุณจะต้องเขียนไปยังตำแหน่งหน่วยความจำและให้โปรแกรม CPU stub อ่านกลับ

ถูกต้องแล้ว: การดีบักแบบแมนนวล ขอให้โชคดี

นอกจากนี้ไลบรารีที่เป็นประโยชน์ที่คุณใช้ใน C / C ++? หรือบางทีคุณเป็นคน. NET มากกว่าใช้ XNA และอื่น ๆ หรืออะไรก็ตาม ไม่สำคัญเนื่องจากคุณไม่สามารถใช้สิ่งใด ๆกับ GPU ได้ คุณต้องโค้ดทุกอย่างตั้งแต่เริ่มต้น และถ้าคุณมี codebase ที่มีอยู่แล้วเหนียว: เวลาในการเขียนรหัสนั้นใหม่ทั้งหมด

ใช่แล้ว เป็นเรื่องที่น่ากลัวมากที่ได้ทำเกมประเภทใดก็ได้ที่ซับซ้อน และมันก็ไม่ได้ผลเพราะเกมแค่ขนานกันไม่พอที่จะช่วย


21

ทำไมมันไม่ง่ายนักที่จะตอบ - มันเป็นเรื่องสำคัญที่จะต้องทราบว่า GPU เป็นโปรเซสเซอร์พิเศษที่ไม่ได้มีไว้สำหรับการใช้งานทั่วไปเช่น CPU ทั่วไป เนื่องจากความเชี่ยวชาญนี้จึงไม่น่าแปลกใจที่ GPU จะมีประสิทธิภาพสูงกว่าซีพียูสำหรับสิ่งที่ได้รับการออกแบบมาเป็นพิเศษ (และปรับให้เหมาะสม) แต่ไม่ได้แปลว่าจะสามารถแทนที่การทำงานเต็มรูปแบบและประสิทธิภาพของซีพียูทั่วไปได้

ฉันสงสัยว่านักพัฒนาซอฟต์แวร์จะไม่ทำสิ่งนี้ด้วยเหตุผลหลายประการรวมถึง:

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

  • อาจต้องเขียนโค้ดเฉพาะ GPU และนี่อาจจะเป็นการแนะนำความซับซ้อนเพิ่มเติมให้กับการเขียนโปรแกรมโดยรวมของเกม (หรือแอพพลิเคชั่น) ในมือ

  • ปกติ GPU จะไม่สามารถเข้าถึงทรัพยากรเช่นการ์ดเครือข่ายแป้นพิมพ์เมาส์และจอยสติ๊กดังนั้นจึงเป็นไปไม่ได้ที่จะจัดการกับทุกแง่มุมของเกมต่อไป

เพื่อตอบคำถามที่สองของคุณ: ใช่มีประโยชน์อื่น ๆ ตัวอย่างเช่นโครงการเช่น SETI @ Home (และโครงการ BOINC อื่น ๆ ) กำลังใช้ GPU (เช่นโครงการโดย nVidia) สำหรับการคำนวณที่ซับซ้อนความเร็วสูง:

  เรียกใช้ SETI @ home บน NVIDIA GPU ของคุณ
  http://setiathome.berkeley.edu/cuda.php

( ฉันชอบคำถามของคุณเพราะเป็นแนวคิดที่น่าสนใจ )


18

ซีพียูมีความยืดหยุ่นมากขึ้นโดยทั่วไปการเขียนโปรแกรมง่ายขึ้นพวกเขาสามารถรันเธรดเดี่ยวได้เร็วขึ้นมาก

ในขณะที่ GPU ที่ทันสมัยสามารถตั้งโปรแกรมให้แก้งานใด ๆ ก็ตามพวกเขาจะได้รับข้อได้เปรียบด้านความเร็วเมื่อสามารถใช้สถาปัตยกรรมแบบขนานได้เท่านั้น โดยทั่วไปจะเป็นกรณีที่มีงาน "ง่าย" ซ้ำ ๆ สูง รหัสจำนวนมากที่เราเขียนนั้นแตกแขนงเกินกว่าที่จะทำงานได้อย่างมีประสิทธิภาพบน GPU

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

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

โอกาสที่ดีมาก แต่เมื่อคุณสร้างเกมแทนที่จะถอดรหัสรหัสผ่านปัญหาในทางปฏิบัติในกรณีส่วนใหญ่มีมากกว่าประโยชน์


6

โปรแกรม GPU นั้นยากมาก คุณควรจะค้นหาHOWTO เพื่อเรียงลำดับรายการใน GPU วิทยานิพนธ์จำนวนมากมีการค้นหาที่จะทำ

ใช้ CPU กับหนึ่งเธรดได้ง่ายใช้หลายเธรดได้ยากขึ้นใช้คอมพิวเตอร์หลายเครื่องพร้อมกับไลบรารีแบบขนานเนื่องจาก PVM หรือ MPI นั้นยากและใช้ gpu ที่ยากที่สุด


4

นอกเหนือจากที่Randolf Richardson ตอบแล้วมีฟังก์ชันบางอย่างที่โปรเซสเซอร์ GPU ไม่สามารถจัดการได้ด้วยตัวเอง ตัวอย่างเช่นคำสั่งการจัดการหน่วยความจำกราฟิกบางส่วนถูกประมวลผลโดย CPU เนื่องจาก GPU ไม่สามารถจัดการได้

และยังมีอีกเหตุผลที่สำคัญอีกอย่างหนึ่งคือ GPU ได้รับการออกแบบสำหรับการคำนวณแบบมัลติเธรด ซึ่งหมายความว่าผู้ผลิต GPU สามารถเพิ่มคอร์ได้ง่ายเมื่อใดก็ตามที่พวกเขาต้องการเพิ่มพลังการคำนวณ แต่มีงานจำนวนมากที่ไม่สามารถแบ่งออกเป็นปัญหาขนาดเล็กเช่นคำนวณจำนวน n'th ในชุด Fibonacci ในสถานการณ์เหล่านี้ CPU จะเร็วกว่ามากเนื่องจากได้รับการปรับให้เหมาะสมสำหรับงานที่มีเธรดเดียว


4

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

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


การเปรียบเทียบเกี่ยวกับเครื่องบินนั้นเป็นสิ่งที่ดีมาก (+1) แต่สำหรับซีพียูที่สนับสนุนประเภทข้อมูลที่แตกต่างกันนั้นจริง ๆ แล้วมีแนวคิดภาษาระดับสูงกว่าในขณะที่ซีพียู (อย่างน้อยในพื้นที่ Intel) มักจะจัดการกับ ข้อมูลในรูปแบบพื้นฐานมาก (เช่นบิตไบต์คำ dwords ฯลฯ ) มีคำแนะนำแบบวนลูปในการสแกนหรือคัดลอกข้อมูลที่ถูกยกเลิกด้วยศูนย์ไบต์ แต่ข้อมูลในอินสแตนซ์เหล่านี้ไม่ได้รับการยอมรับจาก CPU ว่าเป็นประเภทเฉพาะ (นอกเหนือจากการรับข้อมูลที่สิ้นสุดด้วยศูนย์ ในบริบทของลูปเหล่านี้)
Randolf Richardson

@ Randolf: CPU มีคำแนะนำและการลงทะเบียนที่แตกต่างกันซึ่งจัดการกับชนิดข้อมูลระดับต่ำที่แตกต่างกัน (เช่น. เซ็นชื่อเทียบกับไม่ได้ลงนาม, อินทิกรัลเทียบกับทศนิยม) นี่เป็นกรณีของ 8086 และสถาปัตยกรรมที่ทันสมัยที่สุดจริง ๆ และมันไม่ได้มาฟรี
Kylotan

ฉันแน่ใจว่าพวกเขายังคงประมวลผลเชิงเส้นจำนวนมากในสถาปัตยกรรมพื้นฐาน จากด้านการเขียนโปรแกรมใช้เพียงคำสั่งถึง GPU แต่แกนประมวลผลไม่ทำงานแบบขนานเพราะการพึ่งพาฮาร์ดแวร์อื่น ๆ ที่ไม่ขนานกันเช่นการอ่านจากหน่วยความจำอาจ GPU สามารถให้ข้อมูลกับแกนเดียวที่ เวลา.
Pablo Ariel

3

นักพัฒนาจะใช้ GPUs สำหรับการทำงานทั้งหมดที่พวกเขากำลังดีที่ พวกเขาใช้ CPU สำหรับฟังก์ชั่นทั้งหมดที่พวกเขาทำได้ดี อะไรทำให้คุณคิดว่าพวกเขาทำไม่ได้?

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

ซีพียูทำงานได้ดีที่ไม่ขนานกันและต้องการการตัดสินใจจำนวนมาก พวกเขาสามารถทนต่อความต้องการหน่วยความจำสูงแม้จะมีความสัมพันธ์ชั่วคราวในระดับปานกลางเท่านั้น ซึ่งรวมถึงปัญญาประดิษฐ์ส่วนติดต่อผู้ใช้ดิสก์และเครือข่าย I / O และอื่น ๆ ดังนั้นนี่คือสิ่งที่เกมสมัยใหม่ใช้ซีพียูอย่างแม่นยำ


1

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


0

นี่เป็นหัวข้อเก่า แต่บทความที่เผยแพร่เมื่อเร็ว ๆ นี้อาจตอบคำถามนี้ บทความนี้ตีพิมพ์ใน ACM Computing Surveys 2015 แสดงให้เห็นว่าซีพียูและ GPU แต่ละตัวมีข้อได้เปรียบที่ไม่เหมือนใครและด้วยเหตุนี้บทความนี้จึงเปลี่ยนมุมมองจากกระบวนทัศน์ "CPU vs GPU อภิปราย" เป็น "กระบวนทัศน์การทำงานร่วมกัน CPU-GPU"

การสำรวจของ CPU-GPU เทคนิคการคำนวณที่ต่างกัน

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