คำสำคัญ: MLIR, คอมไพเลอร์เคอร์เนล AI, การซ่อนความหน่วง, ความขนาน, บัฟเฟอร์คู่

- Analyzing Latency Hiding and Parallelism in an MLIR-based AI Kernel Compiler
- https://arxiv.org/pdf/2602.20204
- 6000 คำ อ่าน 24 นาที
ประสิทธิภาพของการคอมไพล์เคอร์เนล AI สำหรับอุปกรณ์เอดจ์นั้น นอกจากปัจจัยอื่นแล้ว ขึ้นอยู่กับความสามารถของคอมไพเลอร์ในการขุดค้นความขนานและซ่อนความหน่วงของหน่วยความจำภายใต้คุณลักษณะฮาร์ดแวร์ของ หน่วยความจำแบบแบ่งชั้น และ การย้ายข้อมูลแบบชัดแจ้ง
บทความนี้นำเสนอชุดวิธีการทดสอบมาตรฐาน และให้ผลการทดสอบกลไกการปรับปรุงประสิทธิภาพสามแบบที่คอมไพเลอร์ควบคุมได้ในไปป์ไลน์คอมไพล์ที่ใช้ MLIR ได้แก่: เวกเตอร์ไรเซชัน (Vec), มัลติเธรดข้ามบริบทฮาร์ดแวร์ (MT), และบัฟเฟอร์คู่ (DB, double buffer) ซึ่งใช้ บัฟเฟอร์สแครชแบบปิงปอง (พื้นที่สแครชความเร็วสูงบนชิปสองบล็อกที่แยกจากกัน ใช้สลับกันสำหรับรับข้อมูลและการคำนวณ) เพื่อให้การ ถ่ายโอน DMA ซ้อนทับกับการคำนวณ
บทความนี้สร้างเคอร์เนลโดยใช้เฟรมเวิร์ก Triton/Inductor สร้างกลยุทธ์ การไล่ระดับการกำจัด ซึ่งจะค่อยๆ เพิ่มวิธีการปรับปรุงประสิทธิภาพเพื่อวัดปริมาณผลกระทบต่อประสิทธิภาพของวิธีการเดียว ใช้เพื่อแยกแยะผลกระทบของเวกเตอร์ไรเซชัน มัลติเธรด และบัฟเฟอร์คู่ ในขณะเดียวกันใช้ GELU เป็นตัวแทนของเคอร์เนลแอคติเวชัน วิเคราะห์เชิงปริมาณถึงกฎการสเกลของอัตราเร่งของมัลติเธรดตามขนาดปัญหา
ผลการทดลองแสดงว่า:
- เวกเตอร์ไรเซชันนำมาซึ่งผลประโยชน์ประสิทธิภาพหลักสำหรับ เคอร์เนลที่ไวต่อแบนด์วิธ (เคอร์เนลการคำนวณที่ความเร็วการทำงานหลักถูกจำกัดโดยแบนด์วิธการถ่ายโอนข้อมูลหน่วยความจำ)
- เมื่อ ค่าใช้จ่ายในการจัดตาราง (การสูญเสียประสิทธิภาพจากการสร้างเธรด การกระจายงาน การซิงโครไนซ์ ฯลฯ) ถูกแบ่งเบาแล้ว มัลติเธรดสามารถเพิ่มประสิทธิภาพได้อย่างมีนัยสำคัญ
- และเมื่อการถ่ายโอนข้อมูลและการดำเนินการคำนวณสามารถซ้อนทับกันได้ (นั่นคือเคอร์เนลไม่ได้อยู่ในสถานการณ์สุดขั้วที่ถูกจำกัดด้วยหน่วยความจำล้วนๆ หรือถูกจำกัดด้วยการคำนวณล้วนๆ) บัฟเฟอร์คู่สามารถนำมาซึ่งการเพิ่มประสิทธิภาพเพิ่มเติม
หมายเหตุ:
* ถูกจำกัดด้วยหน่วยความจำ: ประสิทธิภาพของโปรแกรมถูกกำหนดโดยความเร็ว/แบนด์วิธการเข้าถึงหน่วยความจำ หน่วยประมวลผลมักจะว่างเพราะรอข้อมูล
* ถูกจำกัดด้วยการคำนวณ: ประสิทธิภาพของโปรแกรมถูกกำหนดโดยความเร็วการคำนวณของหน่วยประมวลผล การถ่ายโอนหน่วยความจำสามารถตอบสนองความต้องการการคำนวณได้ทันเวลา
สารบัญบทความ
- หนึ่ง บทนำ
- สอง รายละเอียดการนำไปใช้: มัลติเธรดและบัฟเฟอร์คู่
- 2.1 มัลติเธรด (MT)
- 2.2 บัฟเฟอร์คู่ (DB)
- สาม การตั้งค่าและวิธีการทดสอบมาตรฐาน
- สี่ ผลลัพธ์
- 4.1 การไล่ระดับการกำจัดของการบวกเวกเตอร์สองมิติ
- 4.2 GELU: ความสามารถในการขยายของเธรดเดียวและมัลติเธรด
- 4.3 การอภิปราย
- ห้า สรุป
- เอกสารอ้างอิง

หนึ่ง บทนำ
การทำให้การปรับปรุงประสิทธิภาพเคอร์เนลเป็นอัตโนมัติทำได้ยากมาก: ประสิทธิภาพของเคอร์เนลที่เขียนด้วยมือยังคงยากที่จะถูกแซงโดยโค้ดที่สร้างอัตโนมัติ แต่ระบบการผลิตจริงต้องการให้คอมไพเลอร์สามารถสร้างโค้ดที่พกพาได้และบำรุงรักษาง่ายบนสถาปัตยกรรมฮาร์ดแวร์ที่พัฒนาอย่างรวดเร็ว
ในโปรเซสเซอร์เครือข่ายประสาทเทียม (NPU) เอดจ์ ประสิทธิภาพของโปรแกรมถูกกำหนดโดยสามปัจจัย: คุณลักษณะฮาร์ดแวร์ของหน่วยความจำแบบแบ่งชั้น การถ่ายโอนข้อมูลแบบชัดแจ้งที่ควบคุมโดย DMA และกลยุทธ์การจัดตารางงานที่ทำให้หน่วยประมวลผลทำงานอย่างต่อเนื่องในระหว่างการถ่ายโอนข้อมูล
แม้ว่าผลลัพธ์ประสิทธิภาพแบบเอนด์ทูเอนด์ของโมเดลจะมีค่าอ้างอิงในทางปฏิบัติ แต่ผลลัพธ์ประเภทนี้มักไม่สามารถแสดงให้เห็นอย่างชัดเจนถึงกลไกการแมปนี้ นั่นคือเมื่อแมปตรรกะของอัลกอริทึมไปยังวิธีการดำเนินการฮาร์ดแวร์ที่เฉพาะเจาะจง กลยุทธ์ต่างๆ มีผลต่อการเพิ่มประสิทธิภาพและเหตุผลเบื้องหลังอย่างไร ดังนั้น:
- บทความนี้ใช้วิธีการประเมินที่ทำซ้ำได้ มุ่งเน้นไปที่เคอร์เนล ซึ่งสอดคล้องกับตรรกะการสร้างโค้ดสไตล์ Triton/Inductor
- ผ่านการทดสอบมาตรฐานของเคอร์เนลโอเปอเรเตอร์ทั่วไปภายใต้ ขนาดปัญหาที่ควบคุมได้ (ขนาดการคำนวณ/ข้อมูลที่คงที่และทำซ้ำได้) เพื่อวัดปริมาณผลกระทบต่อประสิทธิภาพของกลไกการปรับปรุงประสิทธิภาพสามแบบ: เวกเตอร์ไรเซชัน (Vec), มัลติเธรด (MT), และบัฟเฟอร์คู่ (DB) [1]
- โดยที่ เวกเตอร์ไรเซชันขุดค้น ความขนานระดับข้อมูล (ความขนานที่ได้จากการดำเนินการเดียวกันกับข้อมูลประเภทเดียวกันจำนวนมาก)
- มัลติเธรดขุดค้นความขนานระดับลูปและระดับภูมิภาค โดยกระจาย บล็อกการคำนวณอิสระ (บล็อกย่อยการคำนวณที่ไม่มี dependency ของข้อมูลและสามารถดำเนินการขนานกันได้) ไปยัง บริบทฮาร์ดแวร์ (สภาพแวดล้อมการดำเนินการอิสระที่ฮาร์ดแวร์จัดสรรให้เธรด ประกอบด้วยรีจิสเตอร์ สถานะแฟล็ก ฯลฯ) ที่ต่างกัน
- บัฟเฟอร์คู่ลด เวลาหยุดนิ่ง (เวลาที่หน่วยประมวลผลว่างเพราะรอข้อมูล) ของหน่วยประมวลผลโดยให้การถ่ายโอนหน่วยความจำและการดำเนินการคำนวณซ้อนทับกัน
เพื่อให้ผลประโยชน์ด้านประสิทธิภาพถูกนำมาประกอบกับกลไกการปรับปรุงประสิทธิภาพเฉพาะ บทความนี้นำเสนอผลการทดสอบผ่านการไล่ระดับการกำจัดที่กระชับ ระดับการไล่ระดับมีดังนี้:
การดำเนินการสเกลาร์ → เวกเตอร์ไรเซชัน → เวกเตอร์ไรเซชัน+มัลติเธรด → เวกเตอร์ไรเซชัน+มัลติเธรด+บัฟเฟอร์คู่
ในการไล่ระดับการกำจัดนี้:
- ระดับเวกเตอร์ไรเซชันตรวจสอบผลประโยชน์ประสิทธิภาพของ การ lowering แบบ SIMD แยกต่างหาก
- ระดับเวกเตอร์ไรเซชัน+มัลติเธรดวัดปริมาณอัตราเร่งระดับเธรดที่เพิ่มขึ้นแบบเพิ่มทีละขั้น
- ระดับเวกเตอร์ไรเซชัน+มัลติเธรด+บัฟเฟอร์คู่ใช้เพื่อประเมินว่า: บนพื้นฐานที่การปรับปรุงประสิทธิภาพเวกเตอร์ไรเซชันและมัลติเธรดมีผลแล้ว การจัดตารางเพื่อซ่อนความหน่วงแบบชัดแจ้ง สามารถนำมาซึ่งการเพิ่มประสิทธิภาพเพิ่มเติมได้หรือไม่
นอกเหนือจากการนำเสนอผลการทดสอบแล้ว บทความนี้ยังอธิบายรายละเอียด รูปแบบการแสดงระดับกลาง (IR) และ โครงสร้าง Pass ของคอมไพเลอร์ เฉพาะที่ใช้ในการนำมัลติเธรดและบัฟเฟอร์คู่ไปใช้ ทำให้วิธีการศึกษานี้ทำซ้ำและขยายได้ง่าย
สอง รายละเอียดการนำไปใช้: มัลติเธรดและบัฟเฟอร์คู่
กลไกการปรับปรุงประสิทธิภาพในบทความนี้ถูกนำไปใช้บนเฟรมเวิร์ก MLIR [2] และปฏิบัติตามหลักการออกแบบหลัก: รักษาเจตนาการคำนวณที่แสดงใน การแสดงระดับกลางที่มีโครงสร้าง ให้นานที่สุดเท่าที่จะเป็นไปได้ และจะทำการ lowering ไปเป็นโครงสร้างรันไทม์ (โครงสร้างโค้ดที่มีผลในขั้นตอนการดำเนินการโปรแกรม เช่น การสร้างเธรด ไพรมิทีฟซิงโครไนซ์) ก็ต่อเมื่อคอมไพเลอร์ทำงานจัดตารางงานเสร็จแล้ว
หลักการนี้สามารถเพิ่มความสามารถในการพกพาของโค้ด และทำให้การดำเนินการแปลงและปรับปรุงประสิทธิภาพของคอมไพเลอร์ตรวจสอบได้ง่ายขึ้น
2.1 มัลติเธรด (MT)
โมเดลฮาร์ดแวร์
NPU เอดจ์เป้าหมายของบทความนี้รองรับการดำเนินการเวกเตอร์แบบมัลติเธรด โดยแต่ละเธรดฮาร์ดแวร์สอดคล้องกับ บริบทเวกเตอร์ (เช่น เวกเตอร์รีจิสเตอร์ สถานะเพรดิเคต โดยที่เวกเตอร์รีจิสเตอร์ใช้เก็บข้อมูลเป็นชุด สถานะเพรดิเคตใช้ควบคุมการดำเนินการตามเงื่อนไขของคำสั่งเวกเตอร์) อิสระ
หาก พื้นที่วนซ้ำแบบบล็อก (การแบ่งพื้นที่วนซ้ำการคำนวณขนาดใหญ่ออกเป็นบล็อกย่อยขนาดเล็ก) สามารถแบ่งออกได้โดยไม่มี dependency ของข้อมูลข้ามเธรด (การคำนวณระหว่างเธรดต่างกันต้องการผลลัพธ์ของกันและกัน ทำให้ไม่สามารถดำเนินการขนานกันได้) คุณลักษณะฮาร์ดแวร์นี้สามารถทำให้บล็อกการคำนวณอิสระหลายบล็อกของเคอร์เนลเดียวกันดำเนินการพร้อมกันได้
การ lowering มัลติเธรดสองเฟส
บทความนี้กำหนดให้การ lowering มัลติเธรดเป็นไปป์ไลน์สองเฟส: เฟสแรกรักษาความขนานที่มีโครงสร้าง เฟสที่สองแนะนำ การแยก-รวม (โมเดลการดำเนินการขนาน แบ่งงานออกเป็นหลายเธรดดำเนินการขนานกัน จากนั้นรวมผลลัพธ์เพื่อซิงโครไนซ์ให้เสร็จสิ้น) แบบชัดแจ้ง
2.1 มัลติเธรด (MT)
การปรับปรุงประสิทธิภาพมัลติเธรดมีจุดมุ่งหมายเพื่อแมปบล็อกการคำนวณไปยังเธรดฮาร์ดแวร์หลายเธรดเพื่อดำเนินการขนานกัน เพื่อซ่อนความหน่วงและเพิ่มอัตราการประมวลผล คอมไพเลอร์ MLIR บรรลุเป้าหมายนี้ผ่านสองเฟสที่มีโครงสร้าง
-
เฟสการสร้างเธรดเสมือน: เฟสนี้เขียนเคอร์เนลที่ถูกแบ่งเป็นบล็อกใหม่ (เช่น การดำเนินการ
linalg.generic) ผ่านคำสั่งลูปขนานscf.forallให้อยู่ในรูปแบบการดำเนินการขนานแบบชัดแจ้ง คอมไพเลอร์จะตัดสินใจว่าการทำให้ขนานกันนำมาซึ่งผลประโยชน์ประสิทธิภาพหรือไม่โดยอิงตามมิติของ พื้นที่บล็อกการคำนวณ โดยใช้อัลกอริทึมฮิวริสติกผลประโยชน์ ตามขนาด และเลือก กลยุทธ์การจัดสรรงาน (เช่น การจัดสรรแบบบล็อกหรือบล็อก-ไซคลิก) ที่เหมาะสม เพื่อให้เกิดความสมดุลของโหลดระหว่างเธรดเมื่อช่วงการวนซ้ำไม่สม่ำเสมอ -
เฟสการสร้างเธรดแบบอะซิงโครนัส: เฟสนี้ใช้ ไดอะเล็คอะซิงโครนัส ของ MLIR เพื่อแปลงคำสั่ง
scf.forallให้อยู่ในรูปแบบการแสดงแบบแยก-รวม แต่ละบล็อกการคำนวณถูกห่อหุ้มเป็นภูมิภาคการดำเนินการอะซิงโครนัสasync.executeซึ่งหลังจากดำเนินการเสร็จสิ้นจะสร้าง โทเค็น เป็นตัวบ่งชี้ว่าการทำงานเสร็จสิ้น โทเค็นทั้งหมดถูกรวบรวมเข้าไปใน กลุ่มงานอะซิงโครนัส ก่อนที่ การคำนวณ dependency ต่อไปจะดำเนินการ ผ่านคำสั่งasync.await allเพื่อทำให้เกิด การซิงโครไนซ์แบบแบร์ริเออร์ รับประกันว่างานขนานทั้งหมดเสร็จสิ้น
เฟรมเวิร์กการแยก-รวมมาตรฐานในการแสดงระดับกลาง
รูปแบบโค้ดการแยก-รวมที่คอมไพเลอร์สร้างออกแบบให้มีน้ำหนักเบาและเป็นระเบียบ เพื่อให้สามารถ lowering ลงไปยัง รันไทม์คอรูทีน/งาน โดยตรง โครงสร้างหลักมีดังนี้:
mlir
%group = async.create_group %N
scf.for %tile = ... {
%tok = async.execute { /* ตรรกะการคำนวณบล็อก */ async.yield }
async.add_to_group %tok, %group
}
async.await_all %group
เหตุผลในการเลือกไดอะเล็คอะซิงโครนัส
การรักษามัลติเธรดในรูปแบบการแยก-รวมที่มีโครงสร้างในไดอะเล็คอะซิงโครนัส สามารถรักษาเซแมนติกของความขนานใน รูปแบบประกาศ ก่อน การ lowering ความหน่วง ซึ่งสะดวกต่อการปรับปรุงประสิทธิภาพของคอมไพเลอร์ และสามารถแปลงเป็นตรรกะการจัดตารางงานรันไทม์โดยตรง
2.2 บัฟเฟอร์คู่ (DB)
บัฟเฟอร์คู่เป็น กลยุทธ์ไปป์ไลน์ซอฟต์แวร์ ใช้ บัฟเฟอร์สแครช สองบล็อกสลับกัน (พื้นที่ปิงปอง) เพื่อให้การถ่ายโอนข้อมูลและการดำเนินการคำนวณซ้อนทับกัน จึงซ่อนความหน่วงของการเคลื่อนย้ายข้อมูล
เทคนิค
⚠️ หมายเหตุ: เนื้อหาได้รับการแปลโดย AI และตรวจสอบโดยมนุษย์ หากมีข้อผิดพลาดโปรดแจ้ง
本文来自网络搜集,不代表คลื่นสร้างอนาคต立场,如有侵权,联系删除。转载请注明出处:http://www.itsolotime.com/th/archives/26719
