เปิดเผยการเพิ่มประสิทธิภาพคอมไพเลอร์ MLIR: วิธีที่ Double Buffering และ Multithreading ช่วยซ่อนความล่าช้าและเร่งความเร็วแบบขนานในเคอร์เนล AI

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

เปิดเผยการเพิ่มประสิทธิภาพคอมไพเลอร์ MLIR: วิธีที่ Double Buffering และ Multithreading ช่วยซ่อนความล่าช้าและเร่งความเร็วแบบขนานในเคอร์เนล 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 เป็นตัวแทนของเคอร์เนลแอคติเวชัน วิเคราะห์เชิงปริมาณถึงกฎการสเกลของอัตราเร่งของมัลติเธรดตามขนาดปัญหา

ผลการทดลองแสดงว่า:

  1. เวกเตอร์ไรเซชันนำมาซึ่งผลประโยชน์ประสิทธิภาพหลักสำหรับ เคอร์เนลที่ไวต่อแบนด์วิธ (เคอร์เนลการคำนวณที่ความเร็วการทำงานหลักถูกจำกัดโดยแบนด์วิธการถ่ายโอนข้อมูลหน่วยความจำ)
  2. เมื่อ ค่าใช้จ่ายในการจัดตาราง (การสูญเสียประสิทธิภาพจากการสร้างเธรด การกระจายงาน การซิงโครไนซ์ ฯลฯ) ถูกแบ่งเบาแล้ว มัลติเธรดสามารถเพิ่มประสิทธิภาพได้อย่างมีนัยสำคัญ
  3. และเมื่อการถ่ายโอนข้อมูลและการดำเนินการคำนวณสามารถซ้อนทับกันได้ (นั่นคือเคอร์เนลไม่ได้อยู่ในสถานการณ์สุดขั้วที่ถูกจำกัดด้วยหน่วยความจำล้วนๆ หรือถูกจำกัดด้วยการคำนวณล้วนๆ) บัฟเฟอร์คู่สามารถนำมาซึ่งการเพิ่มประสิทธิภาพเพิ่มเติม

หมายเหตุ:
* ถูกจำกัดด้วยหน่วยความจำ: ประสิทธิภาพของโปรแกรมถูกกำหนดโดยความเร็ว/แบนด์วิธการเข้าถึงหน่วยความจำ หน่วยประมวลผลมักจะว่างเพราะรอข้อมูล
* ถูกจำกัดด้วยการคำนวณ: ประสิทธิภาพของโปรแกรมถูกกำหนดโดยความเร็วการคำนวณของหน่วยประมวลผล การถ่ายโอนหน่วยความจำสามารถตอบสนองความต้องการการคำนวณได้ทันเวลา

สารบัญบทความ

  • หนึ่ง บทนำ
  • สอง รายละเอียดการนำไปใช้: มัลติเธรดและบัฟเฟอร์คู่
    • 2.1 มัลติเธรด (MT)
    • 2.2 บัฟเฟอร์คู่ (DB)
  • สาม การตั้งค่าและวิธีการทดสอบมาตรฐาน
  • สี่ ผลลัพธ์
    • 4.1 การไล่ระดับการกำจัดของการบวกเวกเตอร์สองมิติ
    • 4.2 GELU: ความสามารถในการขยายของเธรดเดียวและมัลติเธรด
    • 4.3 การอภิปราย
  • ห้า สรุป
  • เอกสารอ้างอิง

เปิดเผยการเพิ่มประสิทธิภาพคอมไพเลอร์ MLIR: วิธีที่ Double Buffering และ Multithreading ช่วยซ่อนความล่าช้าและเร่งความเร็วแบบขนานในเคอร์เนล AI

หนึ่ง บทนำ

การทำให้การปรับปรุงประสิทธิภาพเคอร์เนลเป็นอัตโนมัติทำได้ยากมาก: ประสิทธิภาพของเคอร์เนลที่เขียนด้วยมือยังคงยากที่จะถูกแซงโดยโค้ดที่สร้างอัตโนมัติ แต่ระบบการผลิตจริงต้องการให้คอมไพเลอร์สามารถสร้างโค้ดที่พกพาได้และบำรุงรักษาง่ายบนสถาปัตยกรรมฮาร์ดแวร์ที่พัฒนาอย่างรวดเร็ว

ในโปรเซสเซอร์เครือข่ายประสาทเทียม (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 บรรลุเป้าหมายนี้ผ่านสองเฟสที่มีโครงสร้าง

  1. เฟสการสร้างเธรดเสมือน: เฟสนี้เขียนเคอร์เนลที่ถูกแบ่งเป็นบล็อกใหม่ (เช่น การดำเนินการ linalg.generic) ผ่านคำสั่งลูปขนาน scf.forall ให้อยู่ในรูปแบบการดำเนินการขนานแบบชัดแจ้ง คอมไพเลอร์จะตัดสินใจว่าการทำให้ขนานกันนำมาซึ่งผลประโยชน์ประสิทธิภาพหรือไม่โดยอิงตามมิติของ พื้นที่บล็อกการคำนวณ โดยใช้อัลกอริทึมฮิวริสติกผลประโยชน์ ตามขนาด และเลือก กลยุทธ์การจัดสรรงาน (เช่น การจัดสรรแบบบล็อกหรือบล็อก-ไซคลิก) ที่เหมาะสม เพื่อให้เกิดความสมดุลของโหลดระหว่างเธรดเมื่อช่วงการวนซ้ำไม่สม่ำเสมอ

  2. เฟสการสร้างเธรดแบบอะซิงโครนัส: เฟสนี้ใช้ ไดอะเล็คอะซิงโครนัส ของ 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

Like (0)
Previous 3 hours ago
Next 3 hours ago

相关推荐