3

คอขวดด้านประสิทธิภาพของลูป CPU แบบอนุกรมดั้งเดิม

AI999第4课:现代计算底座与张量化并行演化
00:00

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

ลูป CPU แบบอนุกรมกับการประมวลผลแบบขนานเป็นชุด: เวลารวมเพิ่มขึ้นตามจำนวนครั้งในการประเมินผู้สมัครแบบอนุกรม ทีละตัวแบบขนานเป็นชุดเวลาตามนาฬิกาจริง (นอร์มัลไลซ์)≈ 100 วินาทีแบบอนุกรม: เพิ่มขึ้นเกือบเป็นเส้นตรงแบบขนาน: เพิ่มขึ้นแบบขั้นบันไดอนุกรมทีละตัว: ดึง个体 → ถอดรหัส → ประเมิน → เขียนกลับการทำซ้ำที่อยู่ติดกันไม่สามารถทับซ้อนกันได้ หน่วยประมวลผลแบบขนานส่วนใหญ่ว่างงานขนานเป็นชุด: จัดเป็นชุด เวลาขึ้นอยู่กับจำนวนชุด10³ ครั้ง10⁴ ครั้ง10⁵ ครั้งจำนวนครั้งในการประเมินผู้สมัครหมายเหตุ: ส่วนสีเข้มคือค่าใช้จ่ายในการจัดตารางและการเคลื่อนย้ายข้อมูล ภายใต้ปริมาณงานที่เท่ากัน การเพิ่มขึ้นของเวลาที่ใช้ในการประมวลผลแบบขนานขึ้นอยู่กับจำนวนชุดเป็นหลัก ไม่ใช่จำนวน个体

ทีละตัว: โมเดลการทำงานของลูปแบบอนุกรม

วิธีที่ตรงไปตรงมาที่สุดคือการมองประชากรทั้งหมดเป็นรายการเดียว แล้วใช้ลูปดึง个体ออกมาทีละตัว: ดึง个体 → ถอดรหัสเป็นพารามิเตอร์จริง → เรียกใช้ฟังก์ชันประเมิน → เขียนค่าความเหมาะสมกลับ การทำซ้ำที่อยู่ติดกันแทบไม่สามารถทับซ้อนกันได้: ถ้าผลการประเมินไม่กลับมา การเขียนกลับก็ไม่อาจดำเนินต่อได้; ถ้าการเขียนกลับไม่เสร็จ 个体ตัวถัดไปก็ไม่มีที่เก็บผลลัพธ์ ดังนั้นหน่วยประมวลผลแบบขนานอย่างมัลติคอร์ SIMD และ GPU จึงว่างงานเสียส่วนใหญ่ ได้แต่เฝ้ามอง个体ตัวเดียววิ่งจนครบไปป์ไลน์

ค่าใช้จ่ายมาจากไหนกันแน่

  • จำนวนครั้งในการประเมินที่เพิ่มขึ้นเป็นเส้นตรง: จำนวนครั้งในการประเมินทั้งหมดประมาณขนาดประชากร × จำนวนรุ่น เมื่อถึงระดับ 10⁵ เวลาตามนาฬิกาจริงแบบอนุกรมจะเพิ่มขึ้นเกือบเป็นเส้นตรง
  • การทำงานทีละตัวในระดับอินเทอร์พรีเตอร์: การวนลูปทีละ个体 การตรวจสอบขอบเขต และการกระจายตามชนิดข้อมูล ทำให้เกิดค่าใช้จ่ายคงที่ที่สูง
  • การเข้าถึงหน่วยความจำแบบไม่ต่อเนื่องและการเคลื่อนย้ายข้อมูล: 个体ที่ดึงมาใช้งานทีละตัวมักไม่ต่อเนื่องกันในหน่วยความจำ อัตราการเข้าถึงแคชต่ำ ต้นทุนการเคลื่อนย้ายข้อมูลจึงถูกจ่ายซ้ำแล้วซ้ำเล่า
  • การซิงโครไนซ์และการจัดตาราง: เพื่อดึง个体ตัวถัดไป สายธารการทำงานต้องหยุดชะงักและเริ่มใหม่ซ้ำแล้วซ้ำเล่า

แปลงขนาดให้เป็นเวลา

ตัวอย่างเช่น ประชากร 1000 ตัว วนซ้ำ 100 รุ่น จะมีการประเมินผู้สมัครรวมประมาณ 100,000 ครั้ง หากการประเมินแต่ละครั้งใช้เวลาเฉลี่ย 1 ms เพียงแค่ขั้นตอนการประเมินแบบอนุกรมก็ต้องใช้เวลาประมาณ 100 วินาที โดยยังไม่นับค่าใช้จ่ายในการคำนวณตัวดำเนินการและการจัดตาราง หากเพิ่มจำนวนการเริ่มใหม่จาก 1 ครั้งเป็น 5 ครั้งเพื่อรักษาความหลากหลาย ต้นทุนจะเพิ่มขึ้นเกือบเป็นเส้นตรงเป็นประมาณ 500 วินาที หากจัดปริมาณงานที่เท่ากันเป็นชุดและมอบให้ฮาร์ดแวร์แบบขนานประมวลผล เวลาตามนาฬิกาจริงจะขึ้นอยู่กับจำนวนชุดเป็นหลัก ไม่ใช่จำนวน个体

เมื่อใดที่คอขวดนี้จะแคบลง

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

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