CUDA Academy · บทเรียน

คลี่ลูปด้วย #pragma unroll

ลดภาระของลูปและเปิดให้ใช้ ILP

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

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

ลูปมีต้นทุนแฝง

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

การคลี่ลูปทำอะไร

การคลี่ลูปจะคัดลอกส่วนเนื้อหาหลายครั้งต่อการวนซ้ำหนึ่งครั้ง ทำให้ลูปวนจำนวนน้อยลง โดยยังทำงานเท่าเดิมแต่ใช้การนับและการกระโดดน้อยลง

for (int i = 0; i < n; i += 2) {
    out[i]     = in[i]     * 2;
    out[i + 1] = in[i + 1] * 2;
}

ให้คอมไพเลอร์ทำงาน

CUDA มีคำใบ้ให้คุณใช้แทนการคัดลอกโค้ดด้วยตนเอง วาง #pragma unroll ไว้ก่อนลูป แล้วคอมไพเลอร์จะคลี่ลูปให้

#pragma unroll
for (int i = 0; i < 4; i++)
    sum += a[i];

เลือกจำนวนครั้งที่เจาะจง

คุณสามารถระบุจำนวนที่แน่นอนได้ด้วยการเขียนตัวเลขต่อท้าย pragma โดย #pragma unroll 4 จะคลี่ลูปครั้งละสี่รอบ

#pragma unroll 4
for (int i = 0; i < n; i++)
    acc += w[i] * x[i];

ปิดการคลี่ลูป

บางครั้งการคลี่ลูปทั้งหมดทำให้โค้ดใหญ่เกินไปหรือใช้รีจิสเตอร์มากเกินไป การเขียน #pragma unroll 1 จะบอกคอมไพเลอร์ให้คงลูปไว้ตามที่เขียน

#pragma unroll 1
for (int i = 0; i < n; i++)
    process(i);

จำนวนรอบคงที่ช่วยได้

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

การคลี่ลูปเปิดเผย ILP

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

การกระโดดน้อยลง เส้นทางเร็วขึ้น

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

ข้อแลกเปลี่ยนด้านรีจิสเตอร์

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

ขนาดโค้ดก็เพิ่มขึ้นด้วย

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

วัดผลก่อนเชื่อ

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

ตรวจสอบอย่างรวดเร็ว

คุณต้องการให้คอมไพเลอร์คลี่ลูปขนาดเล็กที่มีจำนวนรอบคงที่ทั้งหมด คุณต้องเขียนอะไร

สรุป: แลกการนับด้วยความเร็ว

คุณได้เรียนรู้ว่า #pragma unroll ลดค่าใช้จ่ายของลูปและเปิดเผย ILP แต่ต้องระวังต้นทุนด้านรีจิสเตอร์และขนาดโค้ด ควรวัดผลของแต่ละจำนวนเพื่อให้แน่ใจ 🧩

เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

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

บทเรียน “คลี่ลูปด้วย #pragma unroll” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “คลี่ลูปด้วย #pragma unroll”

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

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

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

บทเรียน “คลี่ลูปด้วย #pragma unroll” ใช้เวลานานแค่ไหน

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

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

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

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

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