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

การลดรูปขั้นสุดท้ายหลายบล็อก

รวมผลรวมบางส่วนจากแต่ละบล็อก

การลดรูปขั้นสุดท้ายหลายบล็อก เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน

บล็อกสื่อสารกันไม่ได้

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

แต่ละบล็อกสร้างผลรวมย่อย

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

if (tid == 0)
  out[blockIdx.x] = data[0];

ตอนนี้มีค่าที่ต้องประมวลผลน้อยลง

เมื่อมี 1,000 บล็อก คุณจะลดจำนวนจากอินพุตหนึ่งล้านค่าเหลือ ผลรวมย่อย 1,000 ค่า ส่วนที่ยากเสร็จแล้ว เหลือเพียงอาร์เรย์ขนาดเล็กมากให้รวมเข้าด้วยกัน

กลยุทธ์ที่หนึ่ง: เรียกใช้อีกครั้ง

วิธีจบที่ง่ายที่สุดคือ การเรียกใช้ครั้งที่สอง ของเคอร์เนลเดิมกับผลรวมย่อย ทำซ้ำจนเหลือค่าเดียว

ทำซ้ำจนเหลือหนึ่งค่า

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

กลยุทธ์ที่สอง: การดำเนินการแบบอะตอมิก

อีกทางเลือกหนึ่งคือให้เธรด 0 ของแต่ละบล็อกบวกผลรวมย่อยของตนโดยตรงเข้าไปในผลรวมส่วนกลางด้วย atomicAdd จึงไม่ต้องใช้เคอร์เนลที่สอง

if (tid == 0)
  atomicAdd(total, data[0]);

ข้อแลกเปลี่ยนของอะตอมิก

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

กลยุทธ์ที่สาม: วนตามระยะก้าวของกริด

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

for (int i = gid; i < n; i += gridDim.x * blockDim.x)
  sum += in[i];

บล็อกน้อยลง ภาระงานน้อยลง

การทำ งานต่อเธรด ให้มากขึ้นตั้งแต่ต้น หมายถึงมีผลรวมย่อยและการเรียกใช้น้อยลง วิธีนี้มักมีประสิทธิภาพดีกว่าการสร้างหนึ่งเธรดต่อหนึ่งองค์ประกอบ

กำหนดผลรวมเป็นศูนย์ก่อน

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

เลือกตามขนาดของปัญหา

อินพุตขนาดเล็กเหมาะกับอะตอมิกเพราะเรียบง่าย ส่วนอินพุตขนาดใหญ่มักเหมาะกับการออกแบบแบบ สองรอบ หรือแบบระยะก้าวของกริด ควรวัดประสิทธิภาพกับข้อมูลของคุณเพื่อเลือกวิธีที่เหมาะสม

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ลองคิดดูว่าเหตุใดการเรียกใช้เคอร์เนลเพียงครั้งเดียวจึงไม่สามารถหาผลรวมของอาร์เรย์ทั้งหมดได้โดยตรง

สรุป

แต่ละบล็อกสร้าง ผลรวมย่อย จากนั้นคุณรวมผลเหล่านั้นด้วยการเรียกใช้อีกครั้ง การดำเนินการแบบอะตอมิก หรือการวนตามระยะก้าวของกริด ตอนนี้คุณสามารถลดค่าอาร์เรย์ขนาดใดก็ได้แล้ว 🏁

คำถามที่พบบ่อย

บทเรียน “การลดรูปขั้นสุดท้ายหลายบล็อก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การลดรูปขั้นสุดท้ายหลายบล็อก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส CUDA Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การลดรูปขั้นสุดท้ายหลายบล็อก”

รวมผลรวมบางส่วนจากแต่ละบล็อก คุณปฏิบัติ CUDA Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน CUDA Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน CUDA Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การลดรูปขั้นสุดท้ายหลายบล็อก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม

ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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