Mojo Academy · บทเรียน

การแบ่งงานเป็นชิ้น

แบ่งช่วงข้อมูลเพื่อกระจายภาระให้สมดุล

บทเรียน 2 จาก 413 ขั้นตอน

การแบ่งงานเป็นชิ้น เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชัน parallelize
  2. การแบ่งงานเป็นชิ้น
  3. การผสานการทำงานแบบขนานกับเวกเตอร์
  4. การหลีกเลี่ยงภาวะแข่งขันข้อมูล
← กลับไปที่ Mojo Academy