การใช้หลายคอร์ต้องเปิดเผยความขนานระดับเธรดในระบบปฏิบัติการอย่างชัดเจนซึ่งโดยปกติแล้วโปรแกรมเมอร์จะต้องเขียนโปรแกรมแบบมัลติเธรด (หรือเรียกใช้โปรแกรมแบบเธรดเดี่ยวหลายครั้งในอินพุตที่แตกต่างกันเช่นการคอมไพล์ด้วยmake -j4
)
คอมไพเลอร์สำหรับบางภาษารองรับการเชื่อมโยงอัตโนมัติ ตัวอย่างเช่น C หรือ C ++ พร้อม OpenMP สามารถคอมไพล์for()
วนลูปปกติในโปรแกรมที่เริ่มหลายเธรด
#pragma omp parallel for
for(int i = 0; i < 1000000; ++i)
{
A[i] = B[i] * constant + C[i];
}
แต่สิ่งนี้จะต้องเกิดขึ้นเมื่อคุณเขียนหรือคอมไพล์โปรแกรม ไม่มีทางที่ฮาร์ดแวร์และระบบปฏิบัติการปัจจุบันจะใช้หลายแกนประมวลผลเพื่อเร่งความเร็วของโปรแกรมแบบเธรดเดียว
ที่เกี่ยวข้อง: เธรดเดี่ยวทำงานบนหลายคอร์ได้อย่างไร : คำตอบ: พวกเขาไม่ได้ แต่มีความขนานอื่น ๆ เช่นInstruction-level parallelismที่ซีพียูแกนเดี่ยวค้นหาและหาช่องทางในการรันเธรดเดี่ยวเร็วกว่าการเรียนการสอนทีละครั้ง
คำตอบของฉันสำหรับคำถามนั้นจะกล่าวถึงรายละเอียดบางส่วนของวิธีการที่ซีพียูสมัยใหม่ค้นหาและใช้ประโยชน์จากความเท่าเทียมในระดับคำสั่งอย่างละเอียด (ส่วนใหญ่มุ่งเน้นที่ x86) นั่นเป็นเพียงส่วนหนึ่งของวิธีการทำงานของ CPU ปกติโดยมีคำสั่งหลายอย่างพร้อมกันในการบินพร้อมกันและไม่ใช่สิ่งที่คุณต้องเปิดใช้งานเป็นพิเศษ (มีตัวนับประสิทธิภาพที่สามารถให้คุณดูจำนวนคำสั่งต่อนาฬิกาที่ซีพียูของคุณจัดการเพื่อทำงานในขณะที่เรียกใช้งานโปรแกรมหรือมาตรการอื่น ๆ )
โปรดทราบว่าคำสั่งในการใช้ RPi3 ARM Cortex-A53 แกน แต่ละแกนคือ superscalar กว้าง 2 หน้า (2 คำสั่งต่อนาฬิกาตามที่ ILP อนุญาต) แต่ไม่สามารถเรียงลำดับคำสั่งใหม่เพื่อค้นหาความเท่าเทียมในระดับคำสั่งเพิ่มเติมและซ่อนความล่าช้า
อย่างไรก็ตามซีพียูจะถูกไพพ์ไลน์ดังนั้นจำนวนคำสั่งทั้งหมดในการบิน (จากการดึงข้อมูลและถอดรหัสไปจนถึงสเตจการเขียนตอนท้ายท่อ) มีความสำคัญ เมื่อการพึ่งพาข้อมูลไม่ได้ จำกัด สิ่งต่าง ๆ คุณสามารถมี 2 คำแนะนำในแต่ละขั้นตอนไปป์ไลน์ที่ CPU กำลังทำงานอยู่โดยมีปริมาณงาน 2 คำสั่งต่อนาฬิกา (นั่นหมายถึงความกว้างทั้งสอง)
มันไม่สามารถดำเนินการคำสั่งที่ไม่เป็นระเบียบ แต่ด้วยการสั่งซื้ออย่างระมัดระวัง (โดยปกติจะเป็นคอมไพเลอร์) ก็ยังสามารถซ่อนเวลาแฝงของคำสั่งที่ใช้เวลาหลายรอบเพื่อให้เอาต์พุตพร้อม (เช่นการโหลดแม้ว่าการเข้าชมแคชหรือทวีคูณจะใช้เวลาหลายรอบเมื่อเทียบกับการเพิ่มพร้อมรอบถัดไป) เคล็ดลับคือการสั่งซื้อคำสั่ง asm ดังนั้นจึงมีคำสั่งที่เป็นอิสระหลายคำสั่งระหว่างคำสั่งที่สร้างผลลัพธ์และคำสั่งที่ใช้
การมีซอฟต์แวร์ (คอมไพเลอร์) แบบคงที่คำแนะนำการกำหนดตารางเวลามีความเปราะมากกว่าการมีฮาร์ดแวร์ที่สามารถเรียงลำดับใหม่ภายในขณะที่รักษาภาพลวงตาของการทำงานตามลำดับของโปรแกรม มันยากมากที่คอมไพเลอร์จะทำผลงานได้ดีเหมือนหน้าต่างเล็ก ๆ ที่ไม่ได้รับคำสั่งสำหรับการจัดเรียงคำสั่งใหม่เพราะการพลาดแคชนั้นไม่สามารถคาดเดาได้และมันก็ยากที่จะวิเคราะห์เชนพึ่งพาระหว่างการเรียกใช้ฟังก์ชันในเวลารวบรวม และจำนวนของการลงทะเบียนถูก จำกัด โดยไม่มีการเปลี่ยนชื่อฮาร์ดแวร์
ทั้งหมดนี้เป็นความสะดวกสบายเล็กน้อยเมื่อโค้ดของคุณทำงานช้ากว่าที่คุณต้องการ แน่นอนว่ามีสิ่งดีๆมากมายภายใต้ประทุนใน Cortex-A53 แต่มีสิ่งดีๆมากมายภายใต้ประทุนในCortex-A57 (เช่นการดำเนินการตามคำสั่งไม่เกิน 3 คำสั่งต่อนาฬิกา) และอื่น ๆ อีกมากมายใน ซีพียู x86 ตัวใหญ่เช่น Skylake (ไม่ต้องพูดถึงความแตกต่างของความเร็วสัญญาณนาฬิกา)
Cortex-A53 นั้นยอดเยี่ยมมากเมื่อเทียบกับhttps://en.wikipedia.org/wiki/Classic_RISC_pipelineเหมือนกับ MIPS ดั้งเดิมที่คุณจะได้เรียนรู้เกี่ยวกับคลาสคอมพิวเตอร์สถาปัตยกรรม แต่โดยมาตรฐานสมัยใหม่มันค่อนข้างต่ำ