เมื่อใดที่ฉันควรจะลดปริมาณการทำงานให้กับ GPU แทนที่จะเป็น CPU?


15

มีการสร้างระบบใหม่เช่นOpenCLขึ้นเพื่อให้เราสามารถเรียกใช้โค้ดในตัวประมวลผลกราฟิกของเรามากขึ้นเรื่อย ๆ ซึ่งเหมาะสมเพราะเราควรจะสามารถใช้ประโยชน์จากพลังที่มากที่สุดในระบบของเราได้มากที่สุด

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



6
ไม่ใช่คำถามเกี่ยวกับฮาร์ดแวร์จริงๆ ควรตั้งรหัสใหม่เป็น "เมื่อมีการเขียนโปรแกรม CPU ดีกว่าการเขียนโปรแกรม GPU" และเป็นคำถามที่ค่อนข้างดีสำหรับ p.se IMO ดูแท็ก GPGPU ของคนอื่น ๆ ใน SO แต่คำถามสถาปัตยกรรม "ใช้เทคโนโลยีอะไรดี" ดีกว่าที่นี่
Kate Gregory

1
@Kate มุมนั้นดูเหมือนจะครอบคลุมอย่างดีในคำถาม Super User ที่เชื่อมโยง อ่านผ่านฉันรู้สึกประหลาดใจเล็กน้อยที่ไม่ได้ย้ายมาที่นี่เพื่อที่จะซื่อสัตย์ นอกจากนี้ยังมีนี้ในดังนั้น ฉันจะเปิดคำถามอีกครั้ง (เนื่องจากคุณถูกด้านการเขียนโปรแกรมของมันอยู่ในหัวข้อที่นี่) ฉันหวังว่าเราจะเห็นคำตอบที่ไม่เพียงชี้ไปที่ความครอบคลุมที่ยอดเยี่ยมของปัญหานี้
อดัมเลียร์

1
ถึงจุดของแอนนาฉันคิดว่าคำตอบนั้นจำเป็นต้องเพิ่มเติมเกี่ยวกับเวลาที่โปรแกรมเมอร์ควรใช้ GPU มากกว่าการอภิปรายเชิงทฤษฎีอย่างแท้จริงว่าอะไรคือความแตกต่างระหว่าง GPU และ CPU ฉันได้แก้ไขชื่อเพื่อแสดงถึงสิ่งนี้

2
@RetroX เราไม่สามารถปิดคำถามซ้ำซ้อนได้หากอยู่ในเว็บไซต์อื่น
อดัมเลียร์

คำตอบ:


26

อย่างไรก็ตามด้วยระบบใหม่ทั้งหมดนี้ดูเหมือนว่า GPU จะดีกว่า CPU ในทุกด้าน

นี่คือความเข้าใจผิดขั้นพื้นฐาน แกน GPU ปัจจุบันยังคงมีข้อ จำกัด เมื่อเทียบกับ CPU ชั้นแนวหน้าในปัจจุบัน ฉันคิดว่าสถาปัตยกรรม Fermi ของ NVIDIA เป็น GPU ที่ทรงพลังที่สุดในปัจจุบัน มีการลงทะเบียนเพียง 32 บิตสำหรับเลขจำนวนเต็มและความสามารถน้อยลงสำหรับการทำนายสาขาและการดำเนินการเก็งกำไรจากนั้นเป็นโปรเซสเซอร์ Intel ชุดสินค้าปัจจุบัน ชิป Intel i7 มีแคชสามระดับส่วนแกนเฟอร์มีเพียงสองระดับเท่านั้นและแคชแต่ละตัวในแฟร์มีขนาดเล็กกว่าแคชที่สอดคล้องกันใน i7 การสื่อสารระหว่างโปรเซสเซอร์ระหว่างคอร์ GPU นั้นมีข้อ จำกัด และการคำนวณของคุณจะต้องมีการ จำกัด เพื่อรองรับข้อ จำกัด นั้น (คอร์นั้นถูกแบ่งเป็นบล็อกและการสื่อสารระหว่างคอร์ในบล็อกนั้นค่อนข้างเร็ว แต่การสื่อสารระหว่างบล็อกนั้นช้า)

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

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

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

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


รองรับความแม่นยำสองเท่าเป็นส่วนหนึ่งของ Shader Model 5 และ AMD / ATI ก็มีเช่นกัน
Ben Voigt

@Ben ขอบคุณสำหรับการแก้ไข ฉันได้ลบคำสั่งที่ไม่ถูกต้อง
Charles E. Grant

11

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

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

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


8

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

ซีพียูปัจจุบันส่วนใหญ่รองรับการทำงานบางประเภทที่ GPU ปัจจุบันไม่พยายามสนับสนุนเลย (เช่นการป้องกันหน่วยความจำสำหรับมัลติทาสก์)

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

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

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

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

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

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


3

คุณสามารถทำการคำนวณหลาย ๆ อย่างในครั้งเดียวและปรับปรุงความเร็วได้อย่างแท้จริง

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

อย่าเข้าใจฉันผิด - ในฐานะที่เป็นผู้เข้ารหัสฉันสนุกกับการบีบ CPU ให้เห็บอย่างทั่วถึง มันเป็นเพียงว่างานศิลปะนี้ไม่ได้เป็นที่ต้องการสูง

ยังมีบางกรณีที่การประมวลผลแบบอนุกรมยังดีกว่าเร็วขึ้นและ / หรือมีประสิทธิภาพมากกว่าแบบขนานหรือไม่

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

ตามกฎแล้วการประมวลผลแบบอนุกรมช่วยให้การแสดงออกที่ชัดเจนของเจตนาของโปรแกรมเมอร์และการอ่านรหัสง่ายขึ้น ฉันจะบอกว่ามันช่วยประหยัดทรัพยากรที่มีค่าและหายากที่สุด - สมองของโปรแกรมเมอร์


2

ซีพียูยังคงมีความหลากหลายมากขึ้น ตัวอย่างเช่น GPU มีประสิทธิภาพมากกว่า CPU ในความแม่นยำเดียว แต่ไม่ได้อยู่ในความแม่นยำสองเท่า มีไลบรารี่สำหรับ CPU มากกว่า GPU


3
คุณสามารถเข้าไปดูรายละเอียดเพิ่มเติมได้ไหม? คุณได้ให้สามแถลงการณ์โดยไม่มีข้อมูลหรือคำอธิบายเกี่ยวกับความจริงของพวกเขา

การขาดการคำนวณความแม่นยำสองเท่าที่มีประสิทธิภาพเป็นความรู้ทั่วไป: en.wikipedia.org/wiki/GPGPU
quant_dev

@quant: ข้อมูลของคุณอย่างน้อย 2 ปีล้าสมัย: 544 GigaFLOPSนั้นเร็วกว่าซีพียูหลัก ๆ
Ben Voigt

@Ben ฉันไม่เห็นว่าลิงก์ของคุณพูดถึงประสิทธิภาพความแม่นยำสองเท่า
quant_dev


2

กฎง่าย ๆ คือถ้าสิ่งที่คุณกำลังทำอยู่นั้นสามารถใช้ถ้อยคำในแง่ของการสร้างจากพีชคณิตเชิงเส้นและเป็นช่วงเวลาที่สำคัญทำบน GPU หรือใช้ CPU เป็นอย่างอื่น

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


หากเป็น "เวลาสำคัญ" คุณอาจไม่มีเวลากำหนดค่า GPU ใหม่สำหรับโปรแกรมคำนวณและอัปโหลดข้อมูล มันเป็นปัญหาใหญ่ที่ได้รับประโยชน์มากที่สุด
Ben Voigt

@Ben ฉันคิดว่าเรามีคำจำกัดความที่แตกต่างกันของ "เวลาวิกฤติ" สิ่งที่ฉันหมายถึงคือการคำนวณอยู่บนเส้นทางวิกฤติเป็นระยะเวลานาน
dan_waterworth

1

หากคุณต้องการการบีบอัดตัวเลขแบบไม่ต่อเนื่อง GPU เป็นวิธีที่จะไป อย่างไรก็ตาม ALU เหล่านั้นทั้งหมดหมายความว่ามีทรานซิสเตอร์น้อยลงสำหรับควบคุมวงจรการไหล (การแตกแขนง) ดังนั้นหากคุณต้องการเขียนสิ่งที่ต้องการโฟลว์คอนโทรลที่ซับซ้อนจำนวนมากเงื่อนไขจำนวนมากดังนั้น CPU จะเร็วขึ้น

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