Mojo Academy · บทเรียน

การปรับปรุงผลคูณภายใน

ทำผลคูณจุดให้เป็นเวกเตอร์และคลี่ลูป

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

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

แกนหลักของผลคูณจุด

ผลคูณภายในจะคูณลำดับข้อมูลสองชุดทีละสมาชิกแล้วบวกผลลัพธ์เข้าด้วยกัน การเร่งส่วนนี้จะช่วยเร่ง matmul ทั้งหมดของคุณ

var acc: Float32 = 0.0
for k in range(K):
    acc += a[k] * b[k]

การประมวลผลทีละช่องทางนั้นช้า

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

เข้าสู่ SIMD

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

var v = SIMD[DType.float32, 4](1, 2, 3, 4)

โหลดข้อมูลเป็นชุดในครั้งเดียว

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

var va = a.load[width=4](k)
var vb = b.load[width=4](k)

คูณเวกเตอร์ทั้งชุด

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

var prod = va * vb  # 4 products at once

สะสมลงในเวกเตอร์

เก็บ ตัวสะสมแบบ SIMD ไว้ แล้วบวกเวกเตอร์ผลคูณแต่ละตัวเข้าไป คุณจะเลื่อนการรวมผลสุดท้ายไปจนกว่าลูปจะจบ

var acc = SIMD[DType.float32, 4](0)
acc += va * vb

เพิ่มทีละความกว้าง

ตอนนี้ลูปจะเลื่อนไปทีละ ความกว้างของ SIMD ไม่ใช่ทีละหนึ่ง หากมีความกว้างสี่ช่องทาง จะเหลือจำนวนรอบเพียงหนึ่งในสี่

for k in range(0, K, 4):
    acc += a.load[width=4](k) * b.load[width=4](k)

ลดค่าตอนท้าย

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

var total = acc.reduce_add()

คลี่ลูป

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

จัดการส่วนที่เหลือ

หาก K หารด้วยความกว้างไม่ลงตัว จะมีสมาชิกเหลืออยู่ไม่กี่ตัว ลูป ส่วนท้ายขนาดเล็กจะประมวลผลสมาชิกเหล่านั้นทีละตัว

for k in range(K - K % 4, K):
    total += a[k] * b[k]

ให้ Mojo ช่วย

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

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

หลังจากลูปผลคูณจุดที่ใช้ความกว้าง SIMD เหตุใดจึงต้องเรียก reduce_add ตอนท้าย

ทบทวน

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

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

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

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

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

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

บทเรียน “การปรับปรุงผลคูณภายใน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การปรับปรุงผลคูณภายใน”

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

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

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

บทเรียน “การปรับปรุงผลคูณภายใน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การจำลองเทนเซอร์ใน Mojo
  2. การสร้าง Matmul ทีละขั้นตอน
  3. การปรับปรุงผลคูณภายใน
  4. การตรวจสอบความถูกต้องเชิงตัวเลข
← กลับไปที่ Mojo Academy