การแบ่งงานเป็นชิ้น
แบ่งช่วงข้อมูลเพื่อกระจายภาระให้สมดุล
การแบ่งงานเป็นชิ้น เป็นบทเรียน Mojo Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Mojo Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Mojo Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องแบ่งเป็นชิ้น
การเปิดเธรดหนึ่งเธรดต่อสมาชิกหนึ่งตัวสิ้นเปลือง แทนที่จะทำเช่นนั้น ให้แบ่งช่วงออกเป็นชิ้นงานขนาดใหญ่ขึ้นจำนวนหนึ่ง ชิ้นละหนึ่งผู้ปฏิบัติงาน
ชิ้นงานคือช่วงย่อย
ชิ้นงานแต่ละชิ้นเป็นเพียงช่วงดัชนีที่ต่อเนื่องกัน เช่น 0 ถึง 99 หรือ 100 ถึง 199 ผู้ปฏิบัติงานหนึ่งคนจะรับผิดชอบช่วงย่อยหนึ่งช่วง
เลือกจำนวนชิ้นงาน
ตัวเลือกที่ใช้กันทั่วไปคือหนึ่งชิ้นงานต่อหนึ่งแกน คุณขอจำนวนดังกล่าวจากเครื่องด้วย num_physical_cores
var workers = num_physical_cores()คำนวณขนาดชิ้นงาน
หารความยาวทั้งหมดด้วยจำนวนผู้ปฏิบัติงาน เพื่อหาจำนวนสมาชิกที่ผู้ปฏิบัติงานแต่ละคนควรจัดการ
var chunk = (n + workers - 1) // workersหาจุดเริ่มต้นของชิ้นงาน
ภายในฟังก์ชันงาน ดัชนีของชิ้นงานจะบอกว่าควรเริ่มต้นที่ใด ให้คูณดัชนีนั้นด้วยขนาดของชิ้นงาน
var start = c * chunkจำกัดจุดสิ้นสุด
ชิ้นงานสุดท้ายอาจเลยข้อมูลไปได้ ดังนั้นให้จำกัดจุดสิ้นสุดของชิ้นงานด้วย min ให้เท่ากับความยาวทั้งหมด เพื่อให้อยู่ภายในขอบเขต
var end = min(start + chunk, n)วนลูปภายในชิ้นงาน
ผู้ปฏิบัติงานแต่ละคนจะวนลูปปกติเฉพาะช่วงของตนเอง ภายในชิ้นงานจึงเป็นโค้ดธรรมดาทั่วไป
for i in range(start, end):
out[i] = heavy(i)ทำงานแบบขนานเหนือชิ้นงาน
ตอนนี้ให้เรียกการทำงานแบบขนานด้วยจำนวนชิ้นงาน ไม่ใช่จำนวนสมาชิก แต่ละการเรียกจะประมวลผลชิ้นงานหนึ่งชิ้นทั้งหมด
parallelize[do_chunk](workers)ทำให้ภาระงานสมดุล
ชิ้นงานที่มีขนาดเท่ากันจะทำให้ทุกแกนมีงานเท่า ๆ กัน หากชิ้นงานหนึ่งใหญ่กว่ามาก ผู้ปฏิบัติงานนั้นจะเสร็จช้า
ชิ้นงานมากกว่าจำนวนแกน
เมื่อรายการบางรายการใช้เวลามากกว่ารายการอื่น การใช้ชิ้นงานที่เล็กลงและมีจำนวนมากขึ้นจะทำให้ผู้ปฏิบัติงานที่เสร็จเร็วรับงานเพิ่มและยังคงทำงานอยู่
ปรับแต่งด้วยการวัดผล
จำนวนชิ้นงานที่ดีที่สุดขึ้นอยู่กับข้อมูลและเครื่องของคุณ ลองใช้หลายขนาด แล้วเก็บค่าที่การทดสอบประสิทธิภาพให้ผลดีที่สุด
ตรวจสอบอย่างรวดเร็ว
คุณแบ่งอาร์เรย์ความยาว n ออกเป็นหนึ่งชิ้นงานต่อหนึ่งผู้ปฏิบัติงาน
สรุปทบทวน
คุณแบ่งช่วงเป็นชิ้นงานที่สมดุล จำกัดจุดสิ้นสุดแต่ละชิ้นด้วย min วนลูปภายในชิ้นงาน และเรียกการทำงานแบบขนานตามจำนวนชิ้นงานเพื่อกระจายภาระอย่างสม่ำเสมอ 🚀
เรียนรู้ Mojo ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “การแบ่งงานเป็นชิ้น” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแบ่งงานเป็นชิ้น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Mojo Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Mojo Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแบ่งงานเป็นชิ้น”
แบ่งช่วงข้อมูลเพื่อกระจายภาระให้สมดุล คุณปฏิบัติ Mojo Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Mojo Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Mojo Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การแบ่งงานเป็นชิ้น” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Mojo Academy นี้ได้ไหม
ได้ บทเรียน Mojo Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชัน parallelize
- การแบ่งงานเป็นชิ้น
- การผสานการทำงานแบบขนานกับเวกเตอร์
- การหลีกเลี่ยงภาวะแข่งขันข้อมูล