คลี่ลูปด้วย #pragma unroll
ลดภาระของลูปและเปิดให้ใช้ ILP
คลี่ลูปด้วย #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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การขนานระดับคำสั่ง
- คลี่ลูปด้วย #pragma unroll
- โหลดแบบเวกเตอร์ด้วย float4
- แรงกดดันของรีจิสเตอร์และการสปิล