เหตุใดเธรดเดี่ยวจึงถูกกระจายไปทั่ว CPU


24

ฉันแค่อยากรู้ว่าเหตุใดตัวกำหนดตารางเวลาจึงย้ายแอประหว่าง CPU อย่างต่อเนื่องแทนที่จะเก็บไว้ในที่เดียว มันดูโง่ไปหน่อยที่มี 4 คอร์ที่ 25% มากกว่าหนึ่งที่ 100%

มันเกี่ยวกับความร้อนหรือว่ามันมีประสิทธิภาพมากกว่านี้ไหม? ระบบปฏิบัติการอื่นทำแตกต่างกันหรือไม่

ข้อมูลเชิงลึกหรือลิงก์ไปยังเนื้อหาในเชิงลึกจะดี (หาตัวเองไม่มาก)

ปรับปรุง:

โดย "spread out" ฉันไม่ได้หมายความว่ามันรันบนซีพียูหลายตัวในคราวเดียว แต่ถูกย้ายจากที่หนึ่งไปยังอีกหลาย ๆ ครั้งต่อวินาที


3
แม้ว่า "ไม่มีสิ่งใดกำลังดำเนินการ" แต่ก็ยังมีเธรดระบบที่แข่งขันกันกับ CPU อยู่เสมอ ตัวอย่างเช่น O / S มีเธรดหน้าหน่วยความจำที่เรียกคืนเป็นศูนย์ดังนั้นเมื่อจำเป็นต้องใช้หน่วยความจำก็จะมีบางหน้าพร้อมที่จะไป เมื่อเธรดของคุณไปทำงานอีกครั้ง cpu ที่คุณเปิดอาจถูกใช้งานโดยหนึ่งในเธรดเหล่านี้ ระบบปฏิบัติการควรทำอย่างไร? รอหรือย้ายคุณไปยัง cpu ใหม่หรือไม่ คุณเคยมีพฤติกรรมที่ไม่พึงประสงค์ในบางกรณี
Tony Lee

มันเป็น goomba SMB ไม่ใช่ LBP :)
Macke

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

คำตอบ:


8

ฉันคิดว่าwierobได้อธิบายประเด็นนี้ค่อนข้างดี
นี่คือบทความเก่าถกprocessor affinityตั้งค่ากับ quad-core QX6800
(ลิงก์ชี้ไปที่หน้าสองของบทความนั้น)

หากคุณไม่ได้บังคับให้ความสัมพันธ์ของกระบวนการเป็นหลักคุณสูญเสียประสิทธิภาพการทำงานหรือไม่

  • ในขณะที่Windows กำหนดการต้องตัดสินใจความสัมพันธ์ดังกล่าวเพื่อหลีกเลี่ยงการหวดกับแคชการออกแบบหน่วยประมวลผลตัวเองยังพิจารณาถึงสิ่งต่างๆ
  • อินเทล QX6800 quad-core (ตั้งแต่ผมดูมันก่อนหน้านี้ในคำตอบนี้)
    มียอด8MB L3แคชร่วมกันใน 4 แกนของมัน

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


ก้าวไปข้างหน้ากับNehalemสถาปัตยกรรมและการNUMA ,
โปรเซสเซอร์ข้ามซ็อกเก็ตหลายยังจะสามารถที่จะเข้าถึงที่อยู่ที่ดีขึ้นฟาด
นี่คือภาพที่รวดเร็วจากหน้า ArsTechnica บน NUMA

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

หาก Nehalem และi7สนใจคุณฉันมีลิงก์เพิ่มเติมที่คำตอบนี้


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

@RolandPihlakas เป็นคำตอบมานานแล้ว แต่เมื่อดูบทความ arstechnica และประเด็นเหล่านี้ฉันคิดว่าฉันคิดว่าฉันมีความสามารถของแพลตฟอร์มใหม่ที่จะมีการเชื่อมต่อหน่วยความจำที่ดีขึ้นและซอฟต์แวร์เพื่อใช้ประโยชน์จากสิ่งนั้น การกำหนดค่าซ็อกเก็ตหลายรายการในเวลานั้นเช่นก่อน Nehalem)
nik

6

ตัวกำหนดตารางเวลาจะดำเนินการเธรดถัดไปที่พร้อมสำหรับการดำเนินการบนคอร์ / ซีพียู "ฟรี"

คุณสามารถกำหนดกระบวนการให้กับ CPU ที่ระบุผ่านตัวจัดการงานของ Windows

มี 4 คอร์ที่ 25% หมายความว่ามีการดำเนินการเธรด 4 เธรดพร้อมกัน ในขณะที่หนึ่งคอร์ที่ x% หมายความว่ามีการดำเนินการเธรดเดียวเท่านั้น ดังนั้นอดีตจึงมีประสิทธิภาพมากกว่าในบางกรณี

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

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


3
afaik Windows scheduler ทำงานได้ค่อนข้างดีในการเก็บเธรดใน cpu / core เดียวกันสำหรับช่วงเวลาเพื่อหลีกเลี่ยงปัญหานั้น
Paxxi

@ Pär: เธรดของฉันดูเหมือนจะดำเนินการบนแต่ละแกนจริง ๆ
Macke

ใช่มันอาจเป็นระบบปฏิบัติการที่กระแทกเธรดของฉัน วิธียอมรับสองคำตอบ :)
Macke

@ PärBjörklundจากประสบการณ์ของฉันอย่างน้อย Windows XP ทำไม่ได้ ฉันคิดว่าปัญหา "cache-bouncing" ได้รับการแก้ไขใน Vista หรือใหม่กว่า
Waxhead

1
"การมี 4 คอร์ที่ 25% หมายความว่ามีการดำเนินการเธรด 4 เธรดพร้อมกัน" ไม่มันหมายความว่ามีการดำเนินการหนึ่งเธรดหนึ่งบิตบนหนึ่งคอร์ เนื่องจากตัวจัดการงานแสดงการใช้งานโดยเฉลี่ยมันจะแสดง 25% (บนระบบ 4 คอร์ในสองคอร์มันจะแสดง 50%) สำหรับแต่ละคอร์ มันหมายถึงแกนกลางถูกใช้อย่างเต็มที่หนึ่งในสี่ของเวลาและไม่ได้ใช้งานความละเอียดของเวลา
David Balažic

0

มันไม่ใช่. หนึ่งเธรดสามารถรันบนตัวประมวลผลเดียวเท่านั้น อย่างไรก็ตามบางกระบวนการมีหลายเธรดซึ่งสามารถกระจายได้

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


1
ดูคำชี้แจงเพิ่มเติมของฉัน นี่คือหนึ่งเธรดที่ทำงานเต็มความเร่งซึ่งเคลื่อนที่อย่างรวดเร็วดังนั้นเมื่อเวลาผ่านไปแต่ละคอร์ (ไม่อยู่หน้า) จะยุ่ง 25% (กระบวนการ / เธรดอื่น ๆ ทั้งหมดจะถูกละเลย)
Macke

0

ระบบปฏิบัติการจะทำการย้ายเธรดข้ามแกนประมวลผล (อย่างรวดเร็วหลายครั้งต่อวินาที) มีประสิทธิภาพมากขึ้นในการทำงานบนแกนเดียวกันตลอดเวลา สิ่งนี้สามารถบังคับใช้โดยไอเท็มเมนูบริบท "Set affinity" ใน Task Manager

โปรดทราบว่าโดยปกติ (ใช้ในบ้านทั่วไป) ความแตกต่างอยู่ในช่วงไม่กี่เปอร์เซ็นต์

"แกนประมวลผล 4 คอร์ที่การใช้งาน 25%" หมายถึงเนื่องจากตัวจัดการงานแสดงการใช้งานเฉลี่ยว่าแต่ละคอร์ใช้งานเต็มที่ในช่วงไตรมาสที่หนึ่งและใช้เวลาที่เหลือทั้งหมด

คำอธิบายสำหรับ Windows แต่จะคล้ายกับระบบปฏิบัติการอื่นเช่นกัน


-1

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

  1. การแพร่กระจายหนึ่งเธรดในทุกคอร์ช่วยให้สิ้นเปลืองพลังงานน้อยลง โปรเซสเซอร์ส่วนใหญ่ลดความถี่ลงและที่สำคัญกว่านั้นแรงดันไฟฟ้าตามโหลดดังนั้น Core 2 Quad จะกินพลังงานน้อยลงและสร้างความร้อนน้อยลงโดยการแพร่กระจายหนึ่งเธรดในทั้ง 4 คอร์แทนที่จะใช้แกนเดียว (ซึ่งจะ นำไปสู่แรงดันไฟฟ้าที่เพิ่มขึ้นในทุกคอร์เนื่องจากมีตัวควบคุมแรงดันไฟฟ้าเพียงตัวเดียว * - มันไม่มีประสิทธิภาพเลยทีเดียว)
  2. มันทำให้แน่ใจว่าเธรดจะทำงานที่ความเร็วสูงสุด / คงที่เสมอ หากเธรดต้องการพลังการประมวลผลโดยฉับพลันหนึ่งคอร์อาจโอเวอร์โหลดและจะมีความล่าช้าในการดำเนินการ ด้วยการแพร่กระจายไปทั่วแกนใด ๆ ขัดขวางอย่างฉับพลันจะได้รับการจัดการอย่างราบรื่นโดยไม่ล่าช้าและล่าช้า

นอกจากนี้จากข้อสังเกตสองข้อข้างต้นฉันเชื่อว่า Turbo Boost และ IDA นั้นไม่มีประสิทธิภาพ อาจมีประโยชน์กับระบบปฏิบัติการรุ่นเก่า แต่ Linux และ Windows 7 จะกระจายทุกสิ่งในทุกคอร์อย่างมีประสิทธิภาพ ดังนั้น Core 2 Quad q9100 @ 2.26 GHz จะเกือบ (มีข้อยกเว้นเสมอ :-) จะเร็วกว่า Core 2 Duo X9100 ที่ 3.06GHz เสมอและฉันไม่ค่อยเห็นมันใช้ IDA เพิ่มความถี่ในหนึ่งหรือสองแกนสำหรับแอปแบบเธรดเดี่ยวเท่านั้น)

  • Core 2 Quad มีโดเมนนาฬิกาสองอันเนื่องจากข้อเท็จจริงที่ว่ามีตายสองศพดังนั้นสองแกนสามารถทำงานที่ความถี่เต็มในขณะที่ทั้งสองอยู่ที่ความถี่ต่ำสุด ฉันไม่รู้ว่ามีตัวควบคุมแรงดันไฟฟ้าสองตัวหรือไม่ - ฉันสังเกตเห็นว่าแรงดันไฟฟ้ามีความสม่ำเสมอในทั้ง 4 แกนดังนั้นจึงต้องมีตัวควบคุมเพียงชุดเดียวสำหรับทั้งชุด

3
ฟังดูน่าสงสัยด้วยเหตุผลหลายประการ โปรดให้การอ้างอิงถึง "ข้อเท็จจริง" ของคุณ ก่อนอื่นทำไมการประมวลผลข้อมูลถึง 25% สำหรับสี่คอร์ใช้พลังงานน้อยกว่า 100% ต่อหนึ่งคอร์? (ฉันเห็นด้วยว่าความร้อนแผ่กระจายออกไปอย่างทั่วถึงกว่า แต่ ... ) นอกจากนี้เธรดในคำถามของฉันทำงานเต็มเอียง (100%) ดังนั้นมันจะไม่ "ขอพลังการประมวลผลมากขึ้น" เพราะมันทำไปแล้ว มากเท่าที่จะเป็นไปได้.
Macke

นั่นเป็นเพียงจากการสังเกตของฉันเอง - ฉันรู้สึกทึ่งกับ IDA และ TurboBoost จึงตัดสินใจทำการทดสอบ เมื่อไม่นานมานี้ แต่ฉันมาถึงข้อสรุปข้างต้น โปรเซสเซอร์ใช้พลังงานน้อยลงเนื่องจากแกนทั้งหมดทำงานที่แรงดันไฟฟ้าต่ำ - การลด 0.1V จะช่วยประหยัดพลังงานได้ประมาณ 6-10 วัตต์ (หากมีแกนหนึ่งโหลด 100% แกนทั้งหมดจะทำงานด้วยแรงดันสูงกว่าไม่ว่าจะทำงานหรือไม่ก็ตาม หรือไม่). นี่เป็นจริงโดยเฉพาะอย่างยิ่งใน Core2Duo ด้วยโหมด SLFM คุณมีความถูกต้องเกี่ยวกับเธรดที่ทำงานแบบเต็มเอียงไม่ได้ร้องขอตัวประมวลผลเพิ่มเติมอีกต่อไป แต่มีแอพที่ใช้ทำสิ่งนี้
JakL

ไม่มีสิ่งเช่น "กระจายเธรด" (ไม่ไม่แม้แต่ 5 ปีต่อมา) มีเธรดเดี่ยวดำเนินการบนแกนเดียว และจากนั้นในภายหลังในอีก และอื่น ๆ ในแต่ละช่วงเวลาแกนหนึ่งรันที่ 100% และแกนอื่น ๆ กำลังทำงาน ดังนั้นจึงไม่มีการออม โดยเฉพาะอย่างยิ่งเมื่อคุณพูดถึงเมื่อแกนทั้งหมดที่เต็มแรงตลอดเวลาอยู่แล้ว (อย่างที่คุณพูดพวกเขาแบ่งปันแรงดันไฟฟ้า) ยังได้รับการแก้ไขแล้วบนแกนเดียวกันทำให้แน่ใจได้ว่าเธรดได้รับพลังการประมวลผลทั้งหมดที่มี เนื่องจากแกนนั้นถูกใช้ไปแล้ว 100% ระบบปฏิบัติการจะกำหนดเธรดอื่นให้กับคอร์อื่นที่ใช้น้อยกว่า
David Balažic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.