การคลี่ลูปขณะคอมไพล์
ขยายลูปด้วย @parameter for
การคลี่ลูปขณะคอมไพล์ เป็นบทเรียน Mojo Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Mojo Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Mojo Academy มีบทเรียนทั้งหมด 4 บทเรียน
ลูปที่คอมไพเลอร์ขยายออก
การคลี่ลูปหมายถึงการที่คอมไพเลอร์เขียนการทำซ้ำแต่ละครั้งออกมาเป็นโค้ดลำดับตรง จึงตัดต้นทุนจากการนับและการแยกแขนงของลูปออก ⚙️
ตัวตกแต่ง @parameter สำหรับลูป
ใส่ @parameter ให้กับลูป for ที่ช่วงการทำงานทราบได้ในเวลาคอมไพล์ แล้ว Mojo จะคลี่ลูปออกทั้งหมดแทนการทำงานขณะรัน
@parameter
for i in range(4):
print(i)ขอบเขตต้องเป็นค่าคงที่
ช่วงของลูปต้องเป็นค่าใน เวลาคอมไพล์ เพื่อให้คอมไพเลอร์ทราบแน่ชัดว่าต้องสร้างส่วนเนื้อหากี่ชุด
alias N = 8
@parameter
for i in range(N):
process(i)ดัชนีกลายเป็นค่าคงที่
ในลูปที่คลี่แล้ว ดัชนีจะเป็น พารามิเตอร์จริงในแต่ละชุด คุณจึงนำไปใช้ในตำแหน่งที่อนุญาตเฉพาะค่าในเวลาคอมไพล์ได้
@parameter
for i in range(4):
arr[i] = i * iเหตุใดจึงต้องคลี่ลูป
การคลี่ลูลดงาน การแยกแขนงและการนับในแต่ละรอบ ทำให้ CPU ได้ชุดคำสั่งต่อเนื่องที่สามารถส่งผ่านกระบวนการได้อย่างมีประสิทธิภาพ
ใช้คู่กับ SIMD
ส่วนเนื้อหาที่คลี่แล้วมักป้อนให้การทำงานแบบ SIMD ทำให้สำเนาที่สร้างขึ้นแต่ละชุดจัดการกลุ่ม lanes หนึ่งกลุ่ม เพื่อให้ได้อัตราการประมวลผลสูงสุด
การเข้าถึง lanes ของ SIMD
ดัชนีในเวลาคอมไพล์ช่วยให้เข้าถึง lanes แต่ละตัวของเวกเตอร์ SIMD ได้ ซึ่งตัวแปรลูปขณะทำงานอาจทำไม่ได้เสมอไป
@parameter
for i in range(4):
total += vec[i]โค้ดใหญ่ขึ้น ทำงานเร็วขึ้น
การคลี่ลูปแลก ไฟล์ไบนารีที่ใหญ่ขึ้นกับการลดจำนวนคำสั่งที่ต้องทำ ซึ่งคุ้มค่าในลูปด้านในที่ทำงานหนักและทำซ้ำหลายล้านครั้ง
อย่าคลี่ลูปทุกลูป
ควรสงวนการคลี่ลูปไว้สำหรับลูปด้านในขนาดเล็กที่ ทำงานหนัก การคลี่ช่วงขนาดใหญ่อาจทำให้โค้ดพองตัวและลดประสิทธิภาพของแคชคำสั่ง
เครื่องมือในเวลาคอมไพล์
@parameter for คือ เมตาโปรแกรมมิงล้วน ๆ ลูปจะไม่ปรากฏขณะทำงาน เพราะคอมไพเลอร์ขยายลูปเป็นโค้ดแบบราบไว้แล้ว 🚀
ใช้คู่กับค่าคงที่
กำหนดขอบเขตด้วย ชื่อแทน เพื่อให้ค่าคงที่ที่มีชื่อหนึ่งตัวควบคุมจำนวนรอบการคลี่ลูป ทำให้โค้ดชัดเจนและปรับจูนใหม่ภายหลังได้ง่าย
alias TILE = 4
@parameter
for i in range(TILE):
work(i)ตรวจสอบอย่างรวดเร็ว
ทบทวนว่า @parameter ทำอะไรกับลูป for
สรุปทบทวน
@parameter for คลี่ลูปที่มีขอบเขตคงที่ในเวลาคอมไพล์ ดัชนีกลายเป็นค่าคงที่ ต้นทุนส่วนเกินหายไป และลูปที่ทำงานหนักก็ทำงานได้เร็วขึ้น 🎯
คำถามที่พบบ่อย
บทเรียน “การคลี่ลูปขณะคอมไพล์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การคลี่ลูปขณะคอมไพล์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Mojo Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Mojo Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การคลี่ลูปขณะคอมไพล์”
ขยายลูปด้วย @parameter for คุณปฏิบัติ Mojo Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Mojo Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Mojo Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การคลี่ลูปขณะคอมไพล์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Mojo Academy นี้ได้ไหม
ได้ บทเรียน Mojo Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อัลกอริทึมแบบพารามิเตอร์
- การคลี่ลูปขณะคอมไพล์
- การคอมไพล์แบบมีเงื่อนไข
- ข้อจำกัดและการตรวจสอบแบบสแตติก