คำถามติดแท็ก multi-core

3
เธรดเดี่ยวทำงานบนหลายคอร์ได้อย่างไร
ฉันพยายามที่จะเข้าใจในระดับสูงว่าเธรดเดี่ยวทำงานในหลายคอร์ได้อย่างไร ด้านล่างเป็นความเข้าใจที่ดีที่สุดของฉัน ฉันไม่เชื่อว่ามันถูกต้อง จากการอ่านHyper-threadingของฉันดูเหมือนว่าระบบปฏิบัติการจะจัดการคำแนะนำของเธรดทั้งหมดในลักษณะที่พวกเขาไม่ได้รอซึ่งกันและกัน จากนั้น Front-end ของ CPU จะจัดระเบียบคำแนะนำเหล่านั้นเพิ่มเติมโดยกระจายเธรดหนึ่งเธรดไปยังแต่ละคอร์และกระจายคำสั่งที่เป็นอิสระจากแต่ละเธรดในทุกรอบที่เปิด ดังนั้นหากมีเพียงเธรดเดียวดังนั้นระบบปฏิบัติการจะไม่ทำการเพิ่มประสิทธิภาพใด ๆ อย่างไรก็ตามส่วนหน้าของ CPU จะแจกจ่ายชุดคำสั่งที่เป็นอิสระในแต่ละคอร์ ตามhttps://stackoverflow.com/a/15936270ภาษาการเขียนโปรแกรมเฉพาะอาจสร้างเธรดมากขึ้นหรือน้อยลง แต่ไม่เกี่ยวข้องเมื่อพิจารณาว่าจะทำอย่างไรกับเธรดเหล่านั้น ระบบปฏิบัติการและ CPU จัดการสิ่งนี้ดังนั้นจึงเกิดขึ้นโดยไม่คำนึงถึงภาษาการเขียนโปรแกรมที่ใช้ เพียงเพื่อชี้แจงฉันถามเกี่ยวกับเธรดเดียวที่รันในหลายคอร์ไม่ใช่เกี่ยวกับการรันหลายเธรดบนแกนเดียว เกิดอะไรขึ้นกับบทสรุปของฉัน คำสั่งของเธรดอยู่ที่ไหนและอย่างไรแบ่งออกเป็นหลายแกน ภาษาการเขียนโปรแกรมสำคัญหรือไม่ ฉันรู้ว่านี่เป็นวิชาที่กว้างขวาง ฉันหวังว่าจะเข้าใจมันในระดับสูง

12
เหตุใดโปรแกรมจึงต้องใช้จำนวนแกนประมวลผลขั้นต่ำที่เฉพาะเจาะจง
เป็นไปได้ไหมที่จะเขียนโค้ด (หรือซอฟต์แวร์ที่สมบูรณ์แทนที่จะเป็นส่วนหนึ่งของรหัส) ที่ทำงานไม่ถูกต้องเมื่อทำงานบน CPU ที่มีจำนวนคอร์น้อยกว่า N? โดยไม่ตรวจสอบอย่างชัดเจนและล้มเหลวตามวัตถุประสงค์: หาก (noOfCores <4) จากนั้นทำงานไม่ถูกต้องตามวัตถุประสงค์ ฉันกำลังดูข้อกำหนดขั้นต่ำของเกม ( Dragon Age: Inquisition ) ขั้นต่ำของเกมและระบุขั้นต่ำของซีพียูสี่คอร์ ผู้เล่นหลายคนบอกว่ามันไม่ได้ทำงานบนซีพียูสองคอร์และ EVEN บนIntel Core i3s ที่มีฟิสิคัลคอร์สองตัวและคอร์ตรรกะสองคอร์ และมันก็ไม่ได้เป็นปัญหาของพลังการคำนวณ จากความเข้าใจของฉันเธรดจะถูกแยกออกจาก CPU อย่างสมบูรณ์โดยระบบปฏิบัติการเนื่องจากไม่สามารถทำได้ เพียงเพื่อล้างสิ่งออก: ฉันไม่ได้ถามว่า "ฉันสามารถค้นหาจำนวนแกนประมวลผลของ CPU จากโค้ดและไม่สามารถทำได้ตามวัตถุประสงค์หรือไม่" ... รหัสดังกล่าวจะไม่ได้ตั้งใจ (บังคับให้คุณซื้อ CPU ที่มีราคาแพงกว่าเพื่อรันโปรแกรม - โดยไม่จำเป็นต้องใช้พลังงานในการคำนวณ) ฉันถามว่ารหัสของคุณพูด, มีสี่กระทู้และล้มเหลวเมื่อสองหัวข้อที่มีการทำงานบนแกนเดียวกันทางกายภาพ(ไม่ชัดเจนตรวจสอบข้อมูลของระบบและจงใจล้มเหลว) ในระยะสั้นจะมีซอฟต์แวร์ที่ต้องใช้หลายคอร์โดยไม่จำเป็นต้องใช้พลังการประมวลผลเพิ่มเติมที่มาจากหลายคอร์หรือไม่? มันจะต้องมีแกนร่างกายแยก N

7
มีวิธีปฏิบัติที่เลิกใช้แล้วสำหรับการเขียนโปรแกรมมัลติเธรดและมัลติโปรเซสเซอร์ซึ่งฉันไม่ควรใช้อีกต่อไปหรือไม่?
ในวันแรก ๆ ของ FORTRAN และ BASIC โปรแกรมทั้งหมดถูกเขียนด้วยคำสั่ง GOTO ผลลัพธ์คือโค้ดสปาเก็ตตี้และวิธีแก้ปัญหาคือการเขียนโปรแกรมแบบมีโครงสร้าง ตัวชี้อาจมีลักษณะควบคุมได้ยากในโปรแกรมของเรา C ++ เริ่มต้นด้วยตัวชี้มากมาย แต่แนะนำให้ใช้การอ้างอิง ไลบรารี่อย่าง STL สามารถลดการพึ่งพาของเราได้บ้าง นอกจากนี้ยังมีสำนวนในการสร้างสมาร์ทพอยน์เตอร์ที่มีคุณสมบัติดีกว่าและ C ++ บางรุ่นจะอนุญาตให้อ้างอิงและจัดการโค้ด วิธีปฏิบัติในการเขียนโปรแกรมเช่นการสืบทอดและ polymorphism ใช้ตัวชี้จำนวนมากเบื้องหลัง ภาษาเช่น Java กำจัดพอยน์เตอร์และใช้การรวบรวมขยะเพื่อจัดการข้อมูลที่จัดสรรแบบไดนามิกแทนที่จะขึ้นอยู่กับโปรแกรมเมอร์เพื่อจับคู่คำสั่งใหม่และลบทั้งหมด ในการอ่านของฉันฉันได้เห็นตัวอย่างของการเขียนโปรแกรมแบบหลายกระบวนการและหลายเธรดที่ดูเหมือนจะไม่ใช้เซมาฟอร์ พวกเขาใช้สิ่งเดียวกันกับชื่อที่แตกต่างกันหรือพวกเขามีวิธีการใหม่ในการจัดโครงสร้างการปกป้องทรัพยากรจากการใช้งานพร้อมกันหรือไม่? ตัวอย่างเช่นตัวอย่างเฉพาะของระบบสำหรับการเขียนโปรแกรมมัลติเธรดที่มีตัวประมวลผลมัลติคอร์คือ OpenMP มันแสดงให้เห็นถึงภูมิภาคที่สำคัญดังต่อไปนี้โดยไม่ต้องใช้เซมาฟอร์ซึ่งดูเหมือนจะไม่รวมอยู่ในสภาพแวดล้อม th_id = omp_get_thread_num(); #pragma omp critical { cout << "Hello World from thread " << th_id << '\n'; …

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

8
เราควรใช้ความพยายามมากแค่ไหนในการเขียนโปรแกรมสำหรับหลายคอร์?
โปรเซสเซอร์กำลังเพิ่มจำนวนคอร์มากขึ้นในทุกวันนี้ซึ่งทำให้ฉันสงสัย ... เราควรโปรแกรมเมอร์ปรับให้เข้ากับพฤติกรรมนี้และใช้ความพยายามมากขึ้นในการเขียนโปรแกรมสำหรับหลายแกน เราควรทำและเพิ่มประสิทธิภาพสิ่งนี้ในระดับใด เกลียว? ความสัมพันธ์กัน? การปรับแต่งฮาร์ดแวร์ให้เหมาะสม? อื่น ๆ อีก?
12 multi-core 

2
มีการใช้เธรดจำนวนเท่าใด
เมื่อฉัน (อีกครั้ง) สร้างระบบขนาดใหญ่บนคอมพิวเตอร์เดสก์ท็อป / แล็ปท็อปฉันบอกmakeให้ใช้มากกว่าหนึ่งเธรดเพื่อเร่งความเร็วในการรวบรวมเช่นนี้: $ make -j$[ $K * $C ] ที่$Cควรจะระบุจำนวนแกน (ซึ่งเราสามารถถือว่าเป็นตัวเลขที่มีหนึ่งหลัก) เครื่องมีในขณะที่$Kเป็นสิ่งที่ฉันแตกต่างจาก2ไป4ขึ้นอยู่กับอารมณ์ของฉัน ตัวอย่างเช่นฉันอาจบอกว่าmake -j12ฉันมี 4 แกนระบุว่าmakeจะใช้ถึง 12 กระทู้ เหตุผลของฉันคือถ้าฉันใช้เฉพาะ$Cเธรดแกนจะว่างขณะที่กระบวนการกำลังดึงข้อมูลจากไดรฟ์ แต่ถ้าฉันไม่ จำกัด จำนวนเธรด (เช่นmake -j) ฉันเสี่ยงที่จะเสียเวลาในการสลับบริบท, หน่วยความจำไม่เพียงพอหรือแย่กว่านั้น สมมติว่าเครื่องมี$Mหน่วยความจำกิ๊ก ( $Mอยู่ในอันดับ 10) ดังนั้นฉันสงสัยว่ามีกลยุทธ์ที่จัดตั้งขึ้นเพื่อเลือกจำนวนเธรดที่มีประสิทธิภาพมากที่สุดที่จะเรียกใช้หรือไม่

6
ถัดไปในการทำงานพร้อมกัน
สำหรับปีที่ผ่านมาฉันทำงานหลายอย่างเกี่ยวกับการทำงานพร้อมกันใน Java และมีการสร้างและทำงานบนแพคเกจพร้อมกันจำนวนมาก ดังนั้นในแง่ของการพัฒนาในโลกที่เกิดขึ้นพร้อมกันฉันค่อนข้างมั่นใจ ต่อไปฉันสนใจที่จะเรียนรู้และทำความเข้าใจเพิ่มเติมเกี่ยวกับการเขียนโปรแกรมพร้อมกัน แต่ฉันไม่สามารถตอบตัวเองในสิ่งต่อไปได้ ฉันควรเรียนรู้อะไรเพิ่มเติมหรือทำงานเพื่อเพิ่มพูนทักษะที่เกี่ยวข้องกับการประมวลผลแบบมัลติคอร์ หากมีหนังสือดีๆ (อ่านและสนุกกับ 'การทำงานพร้อมกันในทางปฏิบัติ' และ 'การเขียนโปรแกรมพร้อมกันใน java') หรือทรัพยากรที่เกี่ยวข้องกับการประมวลผลแบบมัลติคอร์เพื่อให้ฉันสามารถไปยังระดับถัดไปได้หรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.