0Pricing
CUDA Academy · บทเรียน

กำจัดการแยกทางของวาร์ป

จัดดัชนีใหม่เพื่อให้วาร์ปทำงานเต็มที่

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

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

  1. แนวคิดต้นไม้ลดรูป
  2. กำจัดการแยกทางของวาร์ป
  3. การระบุแอดเดรสตามลำดับ
  4. การลดรูปขั้นสุดท้ายหลายบล็อก
← กลับไปที่ CUDA Academy