ชื่อกล่าวมันทั้งหมด: มีวิธีที่จะได้รับโปรแกรมเก่าที่ออกแบบมาเพื่อใช้ CPU แกนเดียวเพื่อใช้หลายแกน CPU หรือไม่?
ชื่อกล่าวมันทั้งหมด: มีวิธีที่จะได้รับโปรแกรมเก่าที่ออกแบบมาเพื่อใช้ CPU แกนเดียวเพื่อใช้หลายแกน CPU หรือไม่?
คำตอบ:
น่าเสียดายที่โปรแกรมดั้งเดิมที่เขียนขึ้นสำหรับ CPU ตัวเดียวไม่สามารถบังคับให้ใช้หลายแกนประมวลผลได้ การใช้คอร์ CPU หลายตัวต้องใช้หลายเธรดซึ่งจำเป็นต้องสื่อสารกันในขณะเดียวกันก็มั่นใจได้ว่าสภาพการแข่งขันและปัญหาอื่น ๆ จะไม่เกิดขึ้น แอปพลิเคชันที่เก่ากว่านั้นไม่สามารถใช้งานได้มากกว่าซีพียูคอร์เว้นแต่ว่ามันจะถูกเขียนใหม่ให้ทำเช่นนั้นและหากลักษณะของแอพพลิเคชั่นอนุญาตให้ทำการขนาน
เป้าหมายของคุณคืออะไร ประสิทธิภาพที่เพิ่มขึ้น? แอปพลิเคชั่นที่น่าเศร้าที่ออกแบบมาเพื่อการใช้งานเพียง 1 คอร์จะไม่ทำให้การใช้งานมากขึ้น นั่นคือสิ่งที่การพูดคุยของแอพพลิเคชั่น "มัลติเธรด" นี้เป็นเรื่องเกี่ยวกับ
มีอย่างน้อยสามเทคนิคในการใช้ประโยชน์จากโปรเซสเซอร์หลายตัวในโปรแกรมที่ออกแบบมาสำหรับการใช้งานแกนเดียว ตรงไปตรงมาที่สุดของเทคนิคเหล่านี้คือการใช้ไลบรารีและรหัสระบบที่ใช้หลายคอร์หรือสามารถดำเนินการอย่างน้อยบางส่วนในแบบคู่ขนานกับรหัสแอปพลิเคชัน การรวบรวมขยะเป็นตัวอย่างของฟังก์ชันการทำงานที่สามารถทำให้ขนานกันและอาจเป็นไปได้ที่จะทำควบคู่ไปกับการใช้งานแอปพลิเคชัน แม้ว่าจะไม่มีการจัดการหน่วยความจำอัตโนมัติมีความเป็นไปได้ที่จะเกิดความเท่าเทียมในฟังก์ชันการจัดสรรคืนหน่วยความจำเนื่องจากตัวจัดสรรหน่วยความจำอาจมีงานที่ต้องทำนอกเหนือจากการทำเครื่องหมายส่วนของหน่วยความจำเท่าที่มี
เทคนิคที่สองคือการแปลแบบไบนารี แม้ว่าสิ่งนี้อาจได้รับการพิจารณาว่าเป็น "การเขียนแอปพลิเคชันใหม่" แต่จะทำโดยซอฟต์แวร์และไม่สามารถเข้าถึงซอร์สโค้ดได้ การสร้างความเท่าเทียมในระดับเธรดดูเหมือนจะไม่เป็นเป้าหมายหลักของการวิจัยและพัฒนาส่วนใหญ่โดยใช้การแปลแบบไบนารี (ซึ่งมักเกี่ยวข้องกับการเรียกใช้รหัสดั้งเดิมบน ISA ที่แตกต่างกันใช้ประโยชน์จากส่วนขยาย ISA หรือปรับให้เหมาะสมที่สุด การเพิ่มประสิทธิภาพที่แนะนำในโปรไฟล์คุณภาพ) แต่ศักยภาพนั้นชัดเจน
เทคนิคที่สามเป็นการเก็งกำไรมัลติเธรด ปัจจุบันไม่มีโปรเซสเซอร์ (ที่ฉันรู้) สนับสนุนมัลติเธรดที่มีการจัดการโดยฮาร์ดแวร์ อย่างไรก็ตามด้วยการเปิดตัวหน่วยความจำทรานแซคชันของฮาร์ดแวร์การมีระบบรันไทม์ที่นำมาใช้นั้นค่อนข้างใช้งานได้จริงเนื่องจาก HTM สามารถใช้เพื่อตรวจจับความขัดแย้งในการใช้หน่วยความจำ มัลติเธรดที่มีการจัดการโดยซอฟต์แวร์มักจะเกี่ยวข้องกับการแปลแบบไบนารี่บางส่วน แต่ลักษณะการเก็งกำไรของมันแสดงให้เห็นถึงการพิจารณาแยกเทคนิค
การปฏิบัติจริงของเทคนิคเหล่านี้ถูก จำกัด ด้วยค่าใช้จ่ายที่เกี่ยวข้องกับระบบที่มีอยู่ (รวมถึงค่าใช้จ่ายในการสื่อสารระหว่างเธรดและเธรดการวางไข่) โดยการ จำกัด แบบขนานที่พวกเขาสามารถใช้ประโยชน์และผลตอบแทนจากการลงทุนที่ จำกัด แบบขนานมีแนวโน้มที่จะถูกเขียนใหม่หลาย ๆ แอปพลิเคชันจะได้รับประโยชน์ค่อนข้างน้อยถ้าทั้งหมดจากเทคนิคดังกล่าว (โดยเฉพาะอย่างยิ่งกับขีด จำกัด พลังงาน / ความร้อนอนุญาตให้แกนเดียวทำงานที่ความถี่สูงกว่าหลายแกน) และต้นทุนการพัฒนามีความสำคัญ) แต่เทคนิคเหล่านี้ทำมีอยู่และเป็นไปได้ในทางทฤษฎีจะใช้หลายแกนกับโปรแกรมที่ออกแบบเพื่อใช้หลักเดียว
ไม่เป็นไปไม่ได้ โปรแกรมเขียนอย่างชัดเจนเพื่อใช้หลายคอร์ มันไม่สำคัญที่จะทำงานในหลายแกน มันต้องมีการประสานของกระทู้ทั้งหมด เช่นเดียวกับการขว้างลูกบอลอีกอันหนึ่งจับหนึ่งขัดลูกบอลทำความสะอาดหนึ่งตรวจสอบบอลว่ามีอากาศในปริมาณที่ดี ทีนี้ลองนึกภาพตัวละครแต่ละตัวว่ากำลังวิ่งในเธรดโดยไม่ขึ้นต่อกัน ใครบางคนพยายามที่จะจับลูกบอลเมื่อไม่ได้โยน หรือใครบางคนพยายามที่จะขัดลูกบอลเมื่อมีการเล่น หรือตัวละครสองตัวพยายามจับและโยนลูกบอลพร้อมกัน มีหลายวิธีที่จะผิดพลาด ดังนั้นโปรแกรมเมอร์จึงจำเป็นต้องออกแบบแอปพลิเคชันแกนเดี่ยวอย่างระมัดระวังเพื่อให้สามารถใช้ประโยชน์จากหลายคอร์ได้