วิธีโปรแกรมการจัดสรรเธรดบนตัวประมวลผลแบบมัลติคอร์


13

ฉันต้องการทดสอบกับเธรดในโปรเซสเซอร์แบบมัลติคอร์เช่นสร้างโปรแกรมที่ใช้สองเธรดที่แตกต่างกันซึ่งประมวลผลโดยแกนประมวลผลที่แตกต่างกันสองคอร์

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

  1. การจัดสรรเธรดได้รับการจัดการโดยระบบปฏิบัติการ เธรดถูกสร้างขึ้นโดยใช้การเรียกใช้ระบบปฏิบัติการและหากกระบวนการเกิดขึ้นกับโปรเซสเซอร์แบบมัลติคอร์ระบบปฏิบัติการจะพยายามจัดสรร / กำหนดเธรดที่แตกต่างกันโดยอัตโนมัติบนแกนที่ต่างกัน
  2. การจัดสรรเธรดได้รับการจัดการโดยการใช้ภาษาการเขียนโปรแกรม การจัดสรรเธรดให้กับคอร์อื่นต้องใช้การเรียกของระบบพิเศษ แต่ไลบรารีเธรดมาตรฐานการเขียนโปรแกรมภาษาจะจัดการสิ่งนี้โดยอัตโนมัติเมื่อฉันใช้การใช้เธรดมาตรฐานสำหรับภาษานั้น
  3. การจัดสรรเธรดต้องถูกโปรแกรมอย่างชัดเจน ในโปรแกรมของฉันฉันต้องเขียนรหัสที่ชัดเจนเพื่อตรวจสอบจำนวนคอร์ที่มีอยู่และการจัดสรรเธรดที่แตกต่างให้กับคอร์ที่แตกต่างกันโดยใช้ฟังก์ชั่นห้องสมุด

เพื่อให้คำถามมีความเฉพาะเจาะจงยิ่งขึ้นลองจินตนาการว่าฉันได้เขียนแอพพลิเคชั่นแบบมัลติเธรดใน Java หรือ C ++ บน Windows หรือ Linux แอปพลิเคชันของฉันจะดูและใช้หลายคอร์อย่างน่าอัศจรรย์เมื่อทำงานบนโปรเซสเซอร์แบบมัลติคอร์หรือไม่ (เพราะทุกอย่างได้รับการจัดการโดยระบบปฏิบัติการหรือโดยเธรดไลบรารีมาตรฐาน) หรือฉันต้องแก้ไขรหัสของฉันเพื่อรับรู้ถึงหลายแกน ?

คำตอบ:


11

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

คำตอบง่ายๆ:ใช่มันมักจะถูกจัดการโดยระบบปฏิบัติการหรือเธรดไลบรารี

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

ที่กล่าวว่ามีตัวเลือก 2 (จัดการโดยภาษาการเขียนโปรแกรม) และ 3 (ชัดเจน) อยู่ ตัวอย่างเช่นไลบรารี Tasks และ async / await ใน. Net รุ่นล่าสุดให้วิธีที่ง่ายกว่าในการเขียนโค้ดที่ขนานกันได้ ฟังก์ชั่นการเขียนโปรแกรมภาษานั้นขนานกันโดยกำเนิดและบางครั้งรันไทม์จะเรียกใช้ส่วนต่าง ๆ ของโปรแกรมในแบบคู่ขนานถ้าเป็นไปได้

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

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


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

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

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

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

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

-1

ฉันเคยมีสภาพแวดล้อม SGI IRIX ขนาดใหญ่ สำหรับเรื่องนี้ฉันได้เขียนโปรแกรมจาวาแบบมัลติเธรดขนาดเล็ก (ซึ่งไม่ได้ทำอะไรเลยนอกจากใช้รอบ CPU) และสร้าง 12 เธรดในนั้น งานขยายไปทั่วทั้ง 12 CPU ในสถาปัตยกรรม NUMA อาจจะเป็นฉันจะค้นหาโปรแกรมและเรียกใช้บน Dell R910s และตรวจสอบ ..


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