แกน CPU กระจายไปยังแต่ละเคอร์เนลอย่างไรในการคำนวณแบบขนาน?

Aug 16 2020

แค่อยากให้แน่ใจว่าฉันเข้าใจถูกต้องก่อนที่จะถามคำถาม ฉันเห็นบางคนบอกว่าบางฟังก์ชั่นใน Mathematica จะใช้มัลติคอร์โดยอัตโนมัติ (ฉันไม่ได้หมายถึงสิ่งที่เราขนานกัน แต่หมายถึงสิ่งที่ชอบNIntegrate) ดังนั้นฉันคิดว่าถ้าฉันมี 2 คอร์มันจะเร็วกว่า single แกนกลาง ดังนั้นคำถามของฉันคือถ้าฉันมีรหัสดังต่อไปนี้:ParallelTable[NIntegrate[x, {x, 1, 3}], {loop, 1, 3}]

ฉันคิดว่าสามเมล็ดจะเปิดตัว ถ้าฉันมี 4 คอร์สี่คอร์นี้จะกระจายไปยังแต่ละเคอร์เนลได้อย่างไร? (เนื่องจากฉันคิดว่าแต่ละเคอร์เนลสามารถใช้มัลติคอร์ได้ตามคุณสมบัติของการรวมฟังก์ชัน)

คำตอบ

4 AndreasLauschke Aug 16 2020 at 23:03

ยินดีต้อนรับคุณ noo-b m.se เป็นชุมชนที่ยอดเยี่ยมสำหรับการเรียนรู้เกี่ยวกับ M อย่างไม่มีที่สิ้นสุด!

ฉันคิดว่าคุณมีข้อสันนิษฐานผิด ๆ สองสามข้อ:

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

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

Do[Do[NIntegrate[x,{x,1,3}],{3}],{100000}]

หากคุณดูที่การใช้งานหลัก (ไม่ใช่: การใช้กระบวนการเช่นในตัวจัดการงานทั่วไป) - หากคุณใช้ Linux คุณสามารถวิ่งบนสุดและตี 1 - คุณจะเห็นว่าสิ่งนี้ใช้เวลา 99% หนึ่งแกน มันอาจสลับหลักหลังจากที่บางเวลา แต่แล้วคุณจะเห็น 99% สำหรับที่หลัก ดังนั้นฉันจึงไม่เห็น NIntegrate threading กับหลายคอร์เลยอย่างน้อยก็ไม่ใช่ตลอดเวลา สิ่งนี้อาจแตกต่างกันสำหรับอินพุต NIntegrate ที่แตกต่างกัน แต่ตัวอย่างง่ายๆนี้แสดงให้เห็นว่า NIntegrate ไม่ได้ขนานกันเสมอไปและไม่ใช่ตลอดระยะเวลาของการคำนวณ

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

ค่อนข้างแทนเจนต์:

ใน Scala, Java หรือ C # (หรือภาษาอื่น ๆ ) คุณสามารถจัดกำหนดการงานในระดับเธรดได้ แต่ถึงอย่างนั้นก็ขึ้นอยู่กับ o / s ที่จะกำหนดเวลาดอกยางเป็นแกน ด้วย vmstat ของ Java คุณมีการแสดงภาพเธรดที่ยอดเยี่ยม (แถบแนวนอนที่เพิ่มขึ้นเมื่อเวลาผ่านไปหนึ่งรายการต่อเธรด) ฉันคิดว่าสิ่งที่คุณสนใจจริงๆคือการทำงานของสิ่งต่างๆในเธรดไม่จำเป็นต้องกำหนดเธรดให้กับคอร์ . ด้วยเหตุนี้เธรดจึงเป็นแนวคิดของซอฟต์แวร์ไม่ใช่แนวคิดของฮาร์ดแวร์แกนหลักไม่ทราบว่าเธรดคืออะไร แต่ฉันคิดว่าการวิเคราะห์เธรดจะช่วยให้คุณเข้าใจการทำงานพร้อมกันได้มากขึ้นเนื่องจากการกำหนดให้กับคอร์และการสลับแกนและเปอร์เซ็นต์ของภาระงานสำหรับทุกคอร์นั้นขึ้นอยู่กับ o / s ทั้งหมด

4 Szabolcs Aug 16 2020 at 23:51

มีบางฟังก์ชันที่ใช้หลายคอร์โดยอัตโนมัติ SystemOptions["ParallelOptions"]วิธีการหลายแกนพวกเขาใช้จะถูกกำหนดโดยบางส่วนของการตั้งค่าใน

หากคุณใช้ฟังก์ชันดังกล่าวบนเคอร์เนลย่อยฟังก์ชันเหล่านี้จะใช้เพียงคอร์เดียว ParallelEvaluate@SystemOptions["ParallelOptions"]คุณสามารถตรวจสอบได้โดยดูที่ สังเกตว่าจำนวนเธรดทั้งหมดถูกตั้งค่าเป็น 1 บนเคอร์เนลย่อย

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