แรงขับสำหรับการเขียนโปรแกรม GPU


10

ฉันมากใหม่ในการเขียนโปรแกรม GPGPU ดังนั้นโปรดยกโทษให้ฉันถ้าคำถามไม่เหมาะสมโดยเฉพาะอย่างยิ่ง จากสิ่งที่ฉันเข้าใจการเขียนโปรแกรม GPU เป็นงานวิศวกรรมที่ซับซ้อนมากเมื่อเทียบกับการเขียนโปรแกรม CPU ปกติ สิ่งหนึ่งที่จะต้องระมัดระวังอย่างมากเกี่ยวกับปัญหาความแตกต่างการปูกระเบื้องการจัดสรรหน่วยความจำที่ตรึงไว้และการคำนวณอุปกรณ์สื่อสาร / อุปกรณ์โฮสต์ซ้อนทับกัน

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

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


คุณเคยคิด ArrayFire ไหม?
arrayfire

คำตอบ:


2

ฉันไม่มีประสบการณ์ส่วนตัวเกี่ยวกับแรงขับ แต่ฉันใช้ ViennaCL ซึ่งเป็นอีกหนึ่งไลบรารี GPU ระดับสูงที่ซ่อนรายละเอียดเกือบทั้งหมดไว้ จากการเปรียบเทียบส่วนบุคคลของฉันเองฉันสามารถเห็นการเพิ่มความเร็ว 2x - 40x ในการคำนวณจริงถ้าคุณไม่สนใจเวลาที่ใช้ในการเคลื่อนที่ไปรอบ ๆ หน่วยความจำ

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


นั่นทำให้รู้สึกที่สมบูรณ์แบบสำหรับฉัน หนึ่งจะต้องมีการโปรไฟล์ก่อน ในตัวอย่างของคุณการเพิ่มความเร็วที่คุณได้รับมาจากการใช้ ViennaCL คุณได้ลองใช้ OpenCL โดยตรงเพื่อตรวจสอบความแตกต่างหรือไม่?
mmirzadeh

ไม่เหมือนคุณฉันใหม่กับการคำนวณ GPU ฉันวางแผนในปีหน้าหรือสองปีเพื่อขยายทักษะของฉันอย่างช้าๆเพื่อรวม CUDA และ OpenCL แต่ตอนนี้ฉันใช้ไลบรารีเท่านั้น เอกสารของ ViennaCL ระบุว่าจะเร่งความเร็วได้มากขึ้นด้วยการใช้งาน openCL ที่ได้รับการปรับแต่งซึ่งน่าจะเป็นไปตามคำสั่งของ 2x-10x อีกครั้งอย่างไรก็ตามฉันได้เรียนรู้ว่าแบนด์วิดธ์หน่วยความจำคือกอริลลา 900 ปอนด์ในห้อง
Godric Seer

5

ฉันใช้ Thrust ในโครงการขยายคลัสเตอร์ที่เชื่อมโยงแล้ว ขึ้นอยู่กับสถานการณ์นั้น Thrust สามารถทำงานได้ดีหรือดีกว่าการใช้งานในระดับต่ำที่คุณม้วนตัวเอง (โดยเฉพาะreduceเคอร์เนลทำงานได้ค่อนข้างดีสำหรับฉัน) อย่างไรก็ตามลักษณะทั่วไปของ Thrust และความยืดหยุ่นหมายความว่าบางครั้งก็ต้องทำสำเนาเพิ่มเติมหลาย ๆ อย่างเช่นการเติมอาเรย์และอื่น ๆ ซึ่งสามารถทำให้ช้าลงเล็กน้อยในบางกรณีที่น่ารังเกียจ ครั้งล่าสุดที่ฉันใช้sortมันค่อนข้างช้าเมื่อเทียบกับห้องสมุดอื่น ๆ เช่น b40c หรือ mgpu อย่างไรก็ตาม NVIDIA กำลังทำงานเพื่อปรับปรุงประสิทธิภาพของอัลกอริทึมของ Thrust ซึ่งอาจจะมีปัญหาน้อยลงในอนาคต

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


3

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

ฉันจะแนะนำไม่ต้องกังวลกับประสิทธิภาพมากนัก แต่ถามตัวเองว่า

  • แอปพลิเคชันของคุณสามารถอธิบายได้ในแง่ของอัลกอริทึมที่นำมาใช้ในการผลักดันและถ้า

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

หากคุณตอบคำถามทั้งสองในเชิงบวกคุณควรจะสามารถนำโปรแกรมของคุณไปปฏิบัติได้โดยใช้ความพยายามน้อยกว่าสำหรับการใช้งาน CUDA เท่านั้น จากนั้นคุณสามารถโปรไฟล์แอปพลิเคชันของคุณและตัดสินใจว่ามันคุ้มค่าหรือไม่ที่จะลองปรับปรุงประสิทธิภาพ

สิ่งนี้กล่าวว่าฉันต้องยอมรับว่าฉันไม่ชอบการเขียนโปรแกรม "ทั่วไป" เพราะฉันยินดีที่จะเรียนรู้สิ่งใหม่เมื่อฉันเขียนโปรแกรม ฉันจะติดตามเส้นทางอื่น: เขียนการใช้งานต้นแบบใน python + numpy + scipy จากนั้นเพิ่ม CUDA kernels สำหรับโค้ด 1% - 2% ของรหัสที่ต้องการการปรับให้เหมาะสมที่สุดและเหมาะที่จะทำงานบน GPU แน่นอนโดยการทำเช่นนั้นคุณจำเป็นต้องมีวิทยาศาสตร์ล่วงหน้าเนื่องจากการตัดสินใจที่ผิดในขั้นตอนการสร้างต้นแบบ (เช่นโครงสร้างข้อมูลที่ไม่เหมาะสมสำหรับเมล็ด CUDA) อาจมีผลการทำงานที่แย่มาก โดยทั่วไปแล้วการทำซ้ำจำเป็นต้องมีเพื่อให้ได้รหัสที่ดีและไม่มีความมั่นใจในการทำสิ่งที่ดีกว่าการผลักดัน

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