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

การคลี่ลูปขณะคอมไพล์

ขยายลูปด้วย @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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. อัลกอริทึมแบบพารามิเตอร์
  2. การคลี่ลูปขณะคอมไพล์
  3. การคอมไพล์แบบมีเงื่อนไข
  4. ข้อจำกัดและการตรวจสอบแบบสแตติก
← กลับไปที่ Mojo Academy