การขโมยงานคืออะไร?

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

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

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

ประโยชน์และข้อเสีย

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

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

การดำเนินการ

ภาษาโปรแกรมหลายภาษามีรันไทม์ที่สามารถกำหนดเวลาทำงานบนโปรเซสเซอร์เฉพาะได้โดยตรง ตัวอย่างเช่น ภาษาโปรแกรม Cilk, รันไทม์ Rust Tokio และ .Net Task Parallel Library สามารถทำได้ อีกทางหนึ่ง ระบบปฏิบัติการอาจรับผิดชอบการกำหนดเวลาตัวประมวลผลจริง ด้วยโปรแกรมเพียงแค่เพิ่มงานลงในพูลของ "เธรดของผู้ปฏิบัติงาน" ซึ่งกำหนดโดยระบบปฏิบัติการเอง

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

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

ทั้งหมดนี้สามารถสรุปได้ว่าเป็น Work Stealing ซึ่งเป็นเทคนิคการจัดสรรภาระงานที่ทำให้แน่ใจว่าการโหลดคำจะถูกกระจายอย่างเท่าเทียมกันระหว่างโปรเซสเซอร์ที่มีอยู่ ด้วยวิธีนี้ โปรเซสเซอร์ทั้งหมดกำลังทำอะไรบางอย่างเพื่อช่วย

บทสรุป

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