ฉันควรใช้จำนวนแกนประมวลผลเท่าไหร่ #cores หรือ #cores -1?


12

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


8
การใช้ประโยชน์จากคอร์ทั้งหมดเป็นการเริ่มต้นที่ดีและความเชื่อโชคลางบางอย่างเกี่ยวกับระบบปฏิบัติการที่ทำงานได้ดีกว่าด้วย "-1 คอร์" อาจเป็นแค่ไสยศาสตร์ แต่คุณควรทำโปรไฟล์ให้เป็นจริงการทำงานของฮาร์ดแวร์ของคุณหรือระบบปฏิบัติการของคุณ
Doc Brown

ในหลาย ๆ กรณีการใช้ # cores + 1 มีเหตุผลมากมาย หากคุณเพียงแค่ใช้ #cores การบล็อกใด ๆ ที่ไม่คาดคิด (เช่นความผิดพลาดของหน้า) จะบังคับให้คอร์ไม่ได้ทำงาน
David Schwartz

คำตอบ:


28

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

การเลือกจำนวนคอร์ขึ้นอยู่กับความตั้งใจของคุณที่จะทำอย่างอื่นในขณะที่กำลังทำการคำนวณ

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

ในอีกทางหนึ่งหากความสำคัญของคุณคือการทำให้การคำนวณเร็วที่สุดเท่าที่เป็นไปได้คุณจะต้องใช้แกนทั้งหมด


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

หมายเหตุ: แม้บนเซิร์ฟเวอร์หากคุณต้องการที่จะสามารถ ssh และรับคำตอบที่รวดเร็วการปล่อย core 0 เพียงอย่างเดียวอาจมีประโยชน์
Matthieu M.

11

มันขึ้นอยู่กับ.

ถ้าเครื่องจะทุ่มเทให้กับการคำนวณนี้คุณควรใช้แกนทั้งหมด - ทรัพยากรคอมพิวเตอร์ที่ไม่ได้ใช้ไม่ได้เร็วขึ้น

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

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


3
"ถ้าคุณกำลังใช้เว็บเบราว์เซอร์ในขณะที่การคำนวณกำลังทำงาน [... ] มันจะรู้สึกเฉื่อยงานที่เน้นปริมาณงานอย่างการคำนวณจะไม่ชะลอตัวลงจริงๆ แต่งานที่มีความอ่อนไหวต่อความล่าช้าเช่น GUI จะไม่ตอบสนองเร็ว ... ] อย่างชัดเจนโดยใช้ลำดับความสำคัญต่ำกว่าการคำนวณสำหรับงานปกติสามารถแก้ปัญหานี้" - และนั่นคือเหตุผลที่ค่าลำดับความสำคัญกระบวนการบน Unix ที่เรียกว่า 'ความดี' niceและมีการกำหนดค่าการใช้ยูทิลิตี้ที่มีชื่อว่า
Jörg W Mittag

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

2
นอกเหนือจากบันทึกย่อของ @Davidmh โดยปกติแล้วที่ด้าน CPU L1 $ และ L2 $ จะถูกแชร์ในระดับหนึ่งระหว่างเธรดและ L3 $ จะถูกแชร์ข้ามซ็อกเก็ตทั้งหมดดังนั้นการใช้เธรดเพิ่มเติมอาจทำให้ $ คิดถึงกระบวนการที่ช้าลง โดยเฉพาะอย่างยิ่งหากกระบวนการนั้นถูกผูกไว้กับหน่วยความจำแทนที่จะเป็นตัวประมวลผลที่ถูกผูกไว้
Maciej Piechotka

หากคุณตั้งค่าระดับความสำคัญของเธรด / กระบวนการอย่างเหมาะสมคุณสามารถลดผลกระทบของงานพื้นหลังในกระบวนการโต้ตอบ ฉันใช้งานแอพคอมพิวเตอร์แบบกระจายในเครื่องส่วนตัวมานานกว่าทศวรรษ และด้วยงานการคำนวณของ CPU ที่ทำงานที่ลำดับความสำคัญต่ำความสามารถในการใช้เบราว์เซอร์และแอปเดสก์ท็อปทั่วไปอื่น ๆ นั้นไม่ได้รับการแก้ไข การแชร์ทรัพยากรบน GPU นั้นไม่ได้ล้ำหน้าและฉันพบเจอปัญหาเกี่ยวกับ GPU ที่เร่งวิดีโอ HTML5 (ไม่เป็นไรเกม) ในขณะที่ใช้ GPU คำนวณในพื้นหลัง เกมแบบมัลติเธรดอาจเป็นปัญหาแม้กับ GFX ที่เบา win starves threads 2+
Dan Is Fiddling โดย Firelight

1

ฉันค่อนข้างรอบคอบเกี่ยวกับการเห็นด้วยกับ @motoDrizzt ด้านล่างเนื่องจากคะแนนโหวตติดลบของเขา :) แต่นั่นเป็นประสบการณ์จริงของฉัน - ยิ่งดีกว่าแม้มีจำนวนแกนจริง (แต่ไม่นับพัน) ตัวอย่างเช่นดูที่http://www.forkosh.com/images/avoronoi.gifโดยที่แต่ละระนาบ 2D ของ 3D-voronoi_diagram นั้นสามารถสร้างขึ้นได้อย่างอิสระ และโปรแกรมจะใช้คุณสมบัติ nfork = n query_string เพื่อแยกการคำนวณสำหรับnระนาบ "พร้อมกัน"

ด้วยตัวประมวลผลสี่คอร์เวลา (ผู้ใช้) ในการทำให้ไดอะแกรมลดลงเป็นเส้นตรงค่อนข้างมากด้วย nfork จนถึงประมาณ nfork = 8 (สี่คอร์ไฮเปอร์เธรด) แต่เกิน 8 เวลายังคงลดลงแม้ว่าจะช้ากว่า และเหนือกว่าประมาณ 16 ปีหรือมากกว่านั้นไม่มีการปรับปรุงที่เห็นได้ชัดเจนเพิ่มเติม ฉันไม่ได้วิเคราะห์พฤติกรรมนี้เลย แต่ให้แอตทริบิวต์อย่างไร้เดียงสากับระบบปฏิบัติการ os (linux slackware 14.2x64 ในกรณีนี้) เพื่อลดเวลาว่างโดยรวม


0

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

แล้วคุณต้องพิจารณาไฮเปอร์เธรด ด้วยสี่คอร์บวกไฮเปอร์เธรดคุณสามารถใช้ 8 คอร์หรือ 7 คอร์ ลองใช้การตอบสนองของระบบและเวลาอีกครั้ง

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

PS "ไฮเปอร์เธรดไม่สามารถช่วยได้ด้วยรหัสเร่งรัด FPU เนื่องจากมี FPU เพียงอันเดียว" ผิดอย่างแน่นอน มันเป็นเรื่องยากอย่างเหลือเชื่อแม้จะมีรหัสเข้มข้น FPU เพื่อใช้ประโยชน์อย่างเต็มที่จาก FPU เนื่องจากเวลาแฝง ไฮเปอร์เธรดช่วยได้เนื่องจากมีการดำเนินการอิสระจำนวนมากเป็นสองเท่าสำหรับการจัดกำหนดการ


-4

ฉันไม่ทราบวิธีการเขียนสิ่งนี้ในแบบที่ไม่ฟัง "ไม่ดี" ดังนั้นเพียงแค่ใช้เป็นคำพูดที่เป็นมิตรได้ไหม

เมื่อพิจารณาว่าพีซีทั่วไปแล้วมีเธรดมากกว่าหนึ่งพันรายการขึ้นไปสิ่งที่ทำให้คุณคิดว่าการใช้ 8 vs 7 จะทำให้เกิดความแตกต่าง :-)

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


3
แต่เธรดส่วนใหญ่หลายพันรายการเหล่านี้ไม่ได้ใช้ CPU 100% ใช่ไหม
Andreas Rejbrand

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

1
@Sanchises นี่เป็นเพราะ hyperthreading ยกระดับการเรียนการสอนแบบขนานระหว่าง interleaving - มันมีประสิทธิภาพสำหรับรหัสสาขาและหน่วยความจำหนัก การคำนวณเมทริกซ์นั้นมีความเข้มข้นของ FPU มากและมีเพียง FPU เดียวต่อหนึ่งคอร์ที่มีอยู่จริงดังนั้นการทำไฮเปอร์เธรดไม่สามารถช่วยคุณได้
J ...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.