เธรดไฮเปอร์จะเพิ่มความเร็วเท่าใด (ในทางทฤษฎี)


38

ฉันสงสัยว่าการเร่งความเร็วเชิงทฤษฎีคืออะไรจากซีพียูที่มีเธรดจำนวนมาก สมมติว่าการขนาน 100% และการสื่อสาร 0 - CPU สองตัวจะให้ความเร็วเพิ่มขึ้น 2 CPU แบบเธรดไฮเปอร์คืออะไร

คำตอบ:


59

อย่างที่คนอื่น ๆ พูดกันทั้งหมดนี้ขึ้นอยู่กับงาน

เพื่อแสดงสิ่งนี้ให้ดูที่การวัดประสิทธิภาพจริง:

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งนี้นำมาจากวิทยานิพนธ์หลักของฉัน (ไม่สามารถออนไลน์ได้ในขณะนี้)

นี่แสดงให้เห็นถึงการเพิ่มความเร็วสัมพัทธ์1ของอัลกอริธึมการจับคู่สตริง (ทุกสีเป็นอัลกอริธึมที่แตกต่างกัน) อัลกอริธึมถูกประมวลผลบนโปรเซสเซอร์ Intel Xeon X5550 quad-core สองตัวพร้อมไฮเปอร์เธรด กล่าวอีกอย่างคือ: มีทั้งหมด 8 คอร์ซึ่งแต่ละตัวสามารถรันเธรดฮาร์ดแวร์สองเธรด (=“ ไฮเปอร์เธรด”) ดังนั้นเบนช์มาร์กจะทดสอบการเร่งความเร็วด้วยเธรดสูงสุด 16 เธรด (ซึ่งเป็นจำนวนเธรดที่เกิดขึ้นพร้อมกันสูงสุดที่การกำหนดค่านี้สามารถดำเนินการได้)

อัลกอริธึมสองในสี่ (สีน้ำเงินและสีเทา) สเกลเชิงเส้นมากกว่าหรือน้อยกว่าในช่วงทั้งหมด นั่นคือมันได้ประโยชน์จากการทำไฮเปอร์เธรด

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

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

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


1คือตัวเร่งความเร็วของ 4 หมายความว่าอัลกอริทึมทำงานเร็วสี่เท่าราวกับว่ามันถูกประมวลผลด้วยเธรดเดียวเท่านั้น ตามคำนิยามแล้วอัลกอริธึมทุกตัวที่ดำเนินการกับเธรดหนึ่งตัวจะมีตัวเร่งความเร็วสัมพัทธ์เท่ากับ 1


คำตอบที่ดีที่สุด :-)
Sklivvz

1
ความเร็วของอัลกอริธึมที่เกิดขึ้นจริงนั้นถูกวางแผนกับจำนวนแกนประมวลผลอย่างไร คือความเร็วที่เพิ่มขึ้นสำหรับอัลกอริทึมที่เร็วที่สุดในการทดสอบเหล่านี้คืออะไร? เพียงแค่สงสัย :).
crazy2be

@ crazy2be สำหรับเส้นสีฟ้า ( อัลกอริทึมของ Horspool ) เวลาทำงานจะเริ่มจาก 4.16 วินาทีลงไปที่ 0.35 วินาทีโดยมี 16 เธรด ดังนั้นการเร่งความเร็วคือ 11.74 อย่างไรก็ตามนั่นคือการทำเกลียวมากเกินไป เมื่อทำการพล็อตกับจำนวนแกนการเพิ่มความเร็วของอัลกอริทึมนี้คือ 7.17 ใน 8 คอร์
Konrad Rudolph

5
ปัญหาเดียวกับคำตอบนี้คือฉันสามารถ upvote ได้เพียงครั้งเดียว คำตอบที่ตรงไปตรงมาสำหรับคำถามที่เป็นอัตนัย;)
Journeyman Geek


20

ปัญหาคือมันขึ้นอยู่กับงาน

ความคิดที่อยู่เบื้องหลัง hyperthreading นั้นโดยพื้นฐานแล้วว่าซีพียูสมัยใหม่ทุกตัวมีปัญหาการดำเนินการมากกว่าหนึ่งครั้ง โดยปกติแล้วจะอยู่ใกล้กับโหลมากกว่า แบ่งระหว่างจำนวนเต็ม, ทศนิยม, SSE / MMX / สตรีมมิ่ง (สิ่งที่เรียกว่าวันนี้)

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

การดำเนินการที่ไม่เป็นไปตามคำสั่งช่วยให้หน่วยต่าง ๆ เต็มจำนวนมากที่สุดเท่าที่จะทำได้

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

ดังนั้นทฤษฎีจะกลายเป็นว่ามี CPU ตัวที่สองเธรดอื่นสามารถทำงานได้โดยใช้ยูนิตการดำเนินการที่มีอยู่ซึ่งไม่ได้ใช้งานโดยการแปลงรหัสเสียงซึ่งเป็น 98% SSE / MMX และหน่วย int และ float ทั้งหมด ไม่มีการใช้งานยกเว้นบางสิ่ง

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

ในโลกคอร์ 3/4/6/8 มีซีพียู 6/8/12/16 มันช่วยได้หรือไม่ dunno เท่าไหร่ ขึ้นอยู่กับงานที่ทำ

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

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


2
แม้ว่าฉันกำลังมองหาบางอย่างเช่น "1.7 time speedup" คำตอบนี้ดีมากเพราะไม่ตบหน้าตาขาวดำกับปัญหานี้
Mikhail

@ Mikail: ประเด็นคือไม่มีปัจจัยง่ายๆ - มันขึ้นอยู่กับว่าบ่อยครั้งในชีวิต :-)
sleske

4
ส่วนสำคัญถูกต้อง หนึ่งการเล่นโวหาร: ไม่มีเหตุผลเบื้องต้นว่าทำไมแกนเดียวควรได้รับประโยชน์มากขึ้นจากการทำไฮเปอร์เธรดมากกว่าหลายคอร์ สำหรับงานที่ไม่ถูกต้องไม่ทำกำไร สำหรับงานที่ถูกต้องกำไรทั้งสองโดยปัจจัยเดียวกัน
Konrad Rudolph

@ Konrad: ฉันคิดว่าจุดที่ฉันได้รับคือความแตกต่างระหว่างหนึ่งคอร์และสองคอร์อาจมีค่ามากกว่าความแตกต่างระหว่าง 4 และ 8 หรือ 2 และ 4 Ie การมีแกนที่สองสำหรับแอพที่มีเธรดไม่ดีอาจช่วยได้ อีกเล็กน้อย
geoffc

“ สำหรับแอพที่มีเธรดไม่ดี” - นั่นเป็นบิตที่สำคัญ แต่ในความเป็นจริงการสนับสนุนเธรดของแอปพลิเคชันส่วนใหญ่นั้นแย่ดังนั้นคุณจึงมีประเด็น
Konrad Rudolph

5

ฉันมีหลักฐานพอสังเขปเพื่อเพิ่มคำตอบของ geoffcซึ่งจริง ๆ แล้วฉันมี Core i7 CPU (4-core) ที่มี hyperthreading และเล่นบิตด้วยการแปลงวิดีโอซึ่งเป็นงานที่ต้องใช้การสื่อสารและการซิงโครไนซ์ แต่มีเพียงพอ การขนานที่คุณสามารถโหลดระบบได้อย่างมีประสิทธิภาพ

ประสบการณ์ของฉันกับการเล่นกับจำนวนซีพียูที่กำหนดให้กับงานโดยทั่วไปใช้คอร์ "พิเศษ" 4 ไฮเปอร์เธรดที่เทียบเท่ากับซีพียูที่เพิ่มขึ้นประมาณ 1 พลังการประมวลผล แกนพิเศษแบบ "hyperthreaded" 4 อันเพิ่มเข้ามาในปริมาณการประมวลผลที่ใช้งานได้เท่ากันจาก 3 ถึง 4 "ของจริง"

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

วิธีเดียวที่แท้จริงในการแสดงว่าจะช่วยได้จริงหรือไม่ว่าจะทำการทดสอบประเภท Integer / Floating Point / SSE ที่แตกต่างกันสองสามตัวในเวลาเดียวกันบนระบบที่เปิดใช้งานและปิดการใช้งาน สิ่งแวดล้อม


1
จุดที่ชัดเจน - ขึ้นอยู่กับแอปพลิเคชัน ฉันแน่ใจว่าการประมวลผลการสื่อสารระดับสูงสามารถเร่งความเร็วได้ตั้งแต่ core 0 และ core 0-h จะสื่อสารผ่านแคชเดียวกันโดยไม่ต้องใช้ RAM ช้า
Mikhail

1
@ Mikail ปัญหาก็คือถ้าทั้งสองเธรดต้องการกำลังการประมวลผลจำนวนมากทั้งคู่จะแข่งขันกันเพื่อทรัพยากรเดียวกันและจะดีกว่ามากในการสื่อสารผ่าน CPU L3 ที่ใช้ร่วมกันร่วมกัน (i7 มีแคช L1 & L2 ต่อคอร์และแคช L3 ที่ใช้ร่วมกัน) หรือแม้กระทั่งหน่วยความจำระบบและทำงานแยกกัน มันคือการออกกำลังกายที่แกว่งไปมาและวงเวียนขนาดใหญ่...
Mokubai

3

มันขึ้นอยู่กับ CPU และปริมาณงานเป็นอย่างมากตามที่คนอื่นพูด

Intel พูดว่า :

ประสิทธิภาพที่วัดได้บนโปรเซสเซอร์Intel®Xeon® MP พร้อมเทคโนโลยี Hyper-Threading แสดงประสิทธิภาพที่เพิ่มขึ้นถึง 30% สำหรับการวัดประสิทธิภาพแอพพลิเคชันเซิร์ฟเวอร์ทั่วไปสำหรับเทคโนโลยีนี้

(มันดูค่อนข้างอนุรักษ์นิยมสำหรับฉัน)

และมีอีกกระดาษอีกต่อไป (ที่ผมไม่ได้อ่านทั้งหมดของยัง) กับตัวเลขเพิ่มเติมได้ที่นี่ สิ่งที่น่าสนใจอย่างหนึ่งที่นำออกมาจากบทความนั้นคือการทำไฮเปอร์เธรดอาจทำให้เรทช้าลงสำหรับงานบางอย่าง

สถาปัตยกรรม Bulldozer ของเอเอ็มอาจจะน่าสนใจ พวกเขาอธิบายแต่ละแกนว่ามีประสิทธิภาพ 1.5 แกน มันเป็น hyperthreading หรือ sub-core มาตรฐานที่รุนแรงมากขึ้นอยู่กับว่าคุณมั่นใจในประสิทธิภาพที่น่าจะเป็นอย่างไร ตัวเลขในชิ้นส่วนนั้นแนะนำให้ใช้ความเร็วในการแสดงความคิดเห็นระหว่าง 0.5x ถึง 1.5x

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


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