กำจัดการแยกทางของวาร์ป
จัดดัชนีใหม่เพื่อให้วาร์ปทำงานเต็มที่
กำจัดการแยกทางของวาร์ป เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
วาร์ปทำงานเป็นจังหวะเดียวกัน
วาร์ป คือเธรด 32 ตัวที่ทำงานตามคำสั่งเดียวกันพร้อมกัน เมื่อเส้นทางการทำงานของเธรดสอดคล้องกัน ฮาร์ดแวร์จะทำงานได้เต็มความเร็ว
ต้นทุนของการแยกเส้นทาง
หากเธรดในวาร์ปเลือกแขนงต่างกัน นั่นเรียกว่า การแยกเส้นทาง ฮาร์ดแวร์จะทำงานแต่ละเส้นทางตามลำดับ ทำให้บางเลนไม่ได้ทำงานและเสียรอบการทำงานไป
การลดรูปแบบพื้นฐานเกิดการแยกเส้นทาง
เวอร์ชันแบบง่ายใช้ tid % (2*s) เพื่อเลือกเธรดที่ทำงาน เธรดที่ทำงานและเธรดที่ว่างจะแทรกสลับกันภายในทุกวาร์ป วาร์ปแต่ละอันจึงเกิดการแยกเส้นทางอย่างมาก
if (tid % (2 * s) == 0)
data[tid] += data[tid + s];เลนที่ว่างก็ยังมีต้นทุน
แม้เธรดครึ่งหนึ่งจะไม่ทำงาน แต่ก็ยังครอบครองพื้นที่ในวาร์ป วาร์ปจะทำงานเสร็จไม่ได้จนกว่าจะจัดการทั้งเส้นทางที่ทำงานและเส้นทางที่ว่าง
จัดดัชนีใหม่ตามรหัสเธรด
วิธีแก้คือจับคู่งานที่ทำงานอยู่กับ รหัสเธรดที่ต่ำที่สุด แทนการกระจายไปตามรหัสต่าง ๆ ให้คำนวณดัชนีจาก tid และระยะก้าว
int index = 2 * s * tid;
if (index < blockDim.x)
data[index] += data[index + s];เหตุผลที่วิธีนี้ช่วยได้
ตอนนี้เธรดที่ทำงานอยู่จะ ต่อเนื่องกัน: tid 0,1,2,... ทำงานทั้งหมด ส่วนที่เหลือจะหยุดพัก วาร์ปทั้งวาร์ปจึงทำงานเต็มที่หรือว่างทั้งหมด
วาร์ปที่ว่างทั้งหมดไม่มีต้นทุน
วาร์ปที่ทุกเลนว่างจะจบการทำงานโดยไม่ต้องทำงานใด ๆ ไม่มีการทำงานแบบอนุกรมแยกตามเลน ดังนั้นต้นทุนจากการแยกเส้นทางจึงหายไปเกือบทั้งหมด
กับดักของการหาเศษ
ตัวร้ายที่ซ่อนอยู่คือเงื่อนไข การหาเศษ เงื่อนไขนี้กระจายเธรดที่ทำงานอยู่ไปทั่วแต่ละวาร์ป ซึ่งเป็นสาเหตุโดยตรงของการแยกเส้นทาง
งานเท่าเดิม จับคู่ได้ดีขึ้น
คุณไม่ได้เปลี่ยนคณิตศาสตร์หรือจำนวนการบวก เพียงเปลี่ยนการจับคู่ว่า เธรดใด จะทำการบวกแต่ละครั้ง และวาร์ปก็ทำงานได้ดีขึ้น
ผลสะสมเมื่อขยายขนาด
เมื่อมีบล็อกนับพันและต้องทำงานหลายขั้น การนำการแยกเส้นทางออกจะสร้าง อัตราเร่ง ได้จริง โดยมักเร็วกว่าเคอร์เนลแบบพื้นฐานประมาณสองเท่า
ยังมีปัญหาอีกหนึ่งอย่าง
เวอร์ชันนี้อ่านข้อมูลเพื่อนบ้านที่แทรกสลับกันใน หน่วยความจำร่วม ซึ่งอาจทำให้เกิดความขัดแย้งของแบงก์ บทเรียนถัดไปจะแก้ปัญหานี้ด้วย
ตรวจสอบอย่างรวดเร็ว
ลองคิดดูว่าอะไรเป็นสาเหตุให้เกิดการแยกเส้นทางของวาร์ปในการลดรูปแบบพื้นฐาน
สรุป
คุณกำจัดการแตกแขนงได้ด้วยการมอบงานให้กับ เธรดที่มี ID ต่ำที่สุด ทำให้วาร์ปทำงานทั้งหมดหรือหยุดทำงานทั้งหมด คณิตศาสตร์เหมือนเดิม แต่การลดค่าทำได้เร็วขึ้น ต่อไปคือความขัดแย้งของแบงก์ 🚀
คำถามที่พบบ่อย
บทเรียน “กำจัดการแยกทางของวาร์ป” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “กำจัดการแยกทางของวาร์ป” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส CUDA Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “กำจัดการแยกทางของวาร์ป”
จัดดัชนีใหม่เพื่อให้วาร์ปทำงานเต็มที่ คุณปฏิบัติ CUDA Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน CUDA Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน CUDA Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “กำจัดการแยกทางของวาร์ป” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม
ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แนวคิดต้นไม้ลดรูป
- กำจัดการแยกทางของวาร์ป
- การระบุแอดเดรสตามลำดับ
- การลดรูปขั้นสุดท้ายหลายบล็อก