การปรับปรุงผลคูณภายใน
ทำผลคูณจุดให้เป็นเวกเตอร์และคลี่ลูป
การปรับปรุงผลคูณภายใน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การจำลองเทนเซอร์ใน Mojo
- การสร้าง Matmul ทีละขั้นตอน
- การปรับปรุงผลคูณภายใน
- การตรวจสอบความถูกต้องเชิงตัวเลข