เหตุใดจึงต้องการประสิทธิภาพการทำงานในการเขียนโปรแกรม GPU?


13

ฉันได้อ่านบทความต่อไปนี้เกี่ยวกับวิธีการสแกนแบบขนานใน CUDA:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html

ในบทความมีความสำคัญในการทำให้การสแกน "ทำงานมีประสิทธิภาพ" กล่าวอีกนัยหนึ่งอัลกอริทึม GPU ไม่ควรทำการเพิ่มเติมนอกเหนือจากอัลกอริทึมของ CPU, O (n) ผู้แต่งนำเสนออัลกอริทึมสองอันหนึ่ง "ไร้เดียงสา" ที่เพิ่ม O (nlogn) และอีกหนึ่งพวกเขาคิดว่า "มีประสิทธิภาพในการทำงาน" อย่างไรก็ตามอัลกอริทึมที่มีประสิทธิภาพในการทำงานทำซ้ำสองเท่าของลูป

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

คำตอบ:


21

ก่อนอื่น: "GPU เป็นเพียงตัวประมวลผล SIMD ขนาดใหญ่และควรทำงานในขั้นตอนการล็อค" มันซับซ้อนกว่านั้นเล็กน้อย ทั้ง GPU ไม่ทำงานใน lockstep เธรด Shader ถูกจัดกลุ่มเป็น 32 กลุ่มที่เรียกว่า "warps" (บน NVIDIA; สำหรับ AMD พวกเขามีกลุ่ม 64 ที่เรียกว่า "wavefronts" แต่มีแนวคิดเดียวกัน) ภายใน warp เธรดทั้งหมดจะทำงานใน lockstep เป็นอาร์เรย์ SIMD อย่างไรก็ตามประลองยุทธ์ที่แตกต่างกันไม่ได้อยู่ในการล็อกซึ่งกันและกัน นอกจากนี้วาร์ปบางตัวอาจทำงานอย่างแข็งขันในขณะที่บางโหมดอาจหยุดทำงานเช่นเดียวกับเธรด CPU Warps สามารถถูกหยุดชั่วคราวเนื่องจากกำลังรอบางสิ่ง (เช่นธุรกรรมหน่วยความจำเพื่อส่งคืนหรืออุปสรรคในการล้าง) หรือเนื่องจากไม่มี

ตอนนี้กลับไปที่คำถามของคุณ ฉันสามารถดูสองวิธีที่อัลกอริทึม "ประสิทธิภาพในการทำงาน" จากกระดาษนั้นดูเหมือนว่าจะมีประสิทธิภาพมากกว่าอัลกอริทึม "ไร้เดียงสา"

  1. เวอร์ชันที่มีประสิทธิภาพในการทำงานต้องใช้เธรดจำนวนมากถึงครึ่งหนึ่ง ในอัลกอริทึมไร้เดียงสาพวกเขามีหนึ่งเธรดต่อองค์ประกอบอาร์เรย์ แต่ในเวอร์ชันที่มีประสิทธิภาพในการทำงานแต่ละเธรดจะทำงานกับสององค์ประกอบที่อยู่ติดกันของอาเรย์ดังนั้นพวกเขาจึงต้องการเธรดเพียงครึ่งเดียวเท่าของอิลิเมนต์อาร์เรย์ กระทู้ที่น้อยลงหมายถึง warps ที่น้อยลงและดังนั้นส่วนที่ใหญ่กว่าของ warps สามารถทำงานได้อย่างแข็งขัน

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

    พิจารณาจำนวนเธรดที่แอ็คทีฟในอัลกอริทึมไร้เดียงสา เมื่อดูรูปที่ 2 ในบทความคุณจะเห็นว่าเธรดทั้งหมดนั้นเปิดใช้งานยกเว้น 2 kแรกในการทำซ้ำที่k ดังนั้นด้วยNหัวข้อจำนวนหัวข้อที่ใช้งานไปเช่นN - 2 k ตัวอย่างเช่นด้วยN = 1024 จำนวนเธรดที่ใช้งานต่อการวนซ้ำคือ:

    1023, 1022, 1020, 1016, 1008, 992, 960, 896, 768, 512
    

    ถ้าฉันแปลงสิ่งนี้เป็นจำนวนของ warps ที่ใช้งานอยู่ (โดยหารด้วย 32 และปัดเศษขึ้น) ฉันจะได้รับ:

    32, 32, 32, 32, 32, 31, 30, 28, 24, 16
    

    สำหรับผลรวมของ 289 ในอีกทางหนึ่งอัลกอริทึมที่มีประสิทธิภาพในการทำงานเริ่มต้นด้วยเธรดที่มากถึงครึ่งหนึ่งจากนั้นจะลดจำนวนของแอคทีฟที่ใช้งานในแต่ละรอบซ้ำจนกว่าจะลดลงเหลือ 1 ครึ่งหนึ่งของขนาดอาร์เรย์อีกครั้ง:

     512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
    

    การแปลงสิ่งนี้เป็น warps ที่ใช้งานอยู่:

    16, 8, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, 16
    

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

ทุกอย่างที่กล่าวมานั้นเป็นเรื่องโชคร้ายที่บทความ Gems GPU ไม่ได้อธิบายอย่างชัดเจนใด ๆ แทนที่จะมุ่งเน้นไปที่การวิเคราะห์ "จำนวนของการเพิ่ม" ที่มีขนาดใหญ่ O ซึ่งไม่ได้มีความเกี่ยวข้องทั้งหมดเลย ได้เร็วขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.