API สำหรับการประมวลผลบน GPU ในปัจจุบัน
(threedots.ovh)NVIDIA
ผู้บุกเบิกของตลาด พร้อมชุดเครื่องมือที่พัฒนาแล้ว ยังเติบโตอย่างรวดเร็วอยู่ และโดยเฉพาะ API ระดับสูง (higher-level) ยิ่งเป็นเช่นนั้น GPU ทุกตัวที่ NVIDIA ขายรองรับ CUDA
HPC SDK ที่เคยถูกเรียกว่า PGI และใช้งานได้เฉพาะบน Linux ได้เพิ่มการรองรับ OpACC, การทำขนานตามมาตรฐาน C++ (stdpar), และ OpenMP (เบตา)
หนึ่งในปัญหาของไลเซนส์ HPC SDK ของ NVIDIA คือข้อกำหนดต่อไปนี้:
You shall strictly prohibit the further distribution of the Run-Time Files by users of an End-User Application
เนื่องจากผู้ใช้ไม่สามารถแจกจ่ายแอปต่อได้หากแอปนั้นรวมไฟล์รันไทม์ที่ต้องใช้ไว้ด้วย จึงอาจทำให้ไม่สามารถแจกจ่ายแอปพลิเคชันได้เลย ปัญหานี้ไม่กระทบกับ CUDA SDK ที่คนส่วนใหญ่ใช้งาน
AMD
การเขียนโปรแกรม GPGPU หลักบนฮาร์ดแวร์ AMD คือ ROCm นอกจาก HIP ที่ AMD เป็นเจ้าของแล้ว สิ่งที่รองรับอย่างเป็นทางการคือ OpenMP และ OpenACC
มีข้อเสียที่ชัดเจนอยู่หลายข้อ:
-
ใช้ได้เฉพาะบน Linux จึงไม่อาจเป็นตัวเลือกได้ในตลาดส่วนใหญ่
-
ไบนารีที่สร้างด้วย toolchain ของ ROCm ไม่ได้มุ่งเป้าไปที่ IR แต่ผูกติดกับฮาร์ดแวร์ เมื่อมีฮาร์ดแวร์รุ่นใหม่ออกมา ก็ต้องคอมไพล์ไบนารีใหม่
-
หลังการออกรีลีสแล้ว มักแทบไม่มีการรองรับฮาร์ดแวร์ใหม่อยู่เป็นเวลาค่อนข้างนาน
ข้อเสียเหล่านี้ทำให้มันแทบไม่มีประโยชน์บนเดสก์ท็อป และทำให้ OpenCL กลายเป็น API ที่ผู้ผลิตจัดหาให้สำหรับฮาร์ดแวร์ GPU ของ AMD เพียงตัวเดียว
Intel
oneAPI รองรับบน GPU Intel รุ่นใหม่ทั้งหมด แต่ประสิทธิภาพสูงยังไม่มี นอกจาก Level Zero ของ Intel แล้ว API ที่รองรับอย่างเป็นทางการคือ OpenMP และ SYLC
Level Zero ของ oneAPI ใช้ SPIR-V เป็น IR ทำให้รองรับฮาร์ดแวร์ที่จะออกในอนาคตได้อย่าง seamless และยังรองรับ Windows ด้วย
Khronos
มอบมาตรฐานอุตสาหกรรมที่ใช้ได้กับผู้ผลิตหลายราย
การรีเซ็ตที่รู้จักกันในชื่อ OpenCL 3.0 ยังไม่มีผลกระทบมากนัก การผสาน SYCL เข้ากับการประมวลผลของ Vulkan อาจเป็นเส้นทางที่ดีกว่า ซึ่งให้ประสบการณ์นักพัฒนาที่ดี พร้อมความสามารถในการใช้ไบนารีเดียวกับผู้ผลิตหลายราย
การรองรับ OpenCL จริงในปัจจุบัน:
วันนี้ NVIDIA ให้ OpenCL 1.2 ที่รองรับ extensions
AMD ให้ทั้ง implementation ของ OpenCL 1.2 ที่พอใช้งานได้ และ implementation ของ OpenCL 2.x ที่มีบั๊กมหาศาล (และแทบไม่มีวิธีดีบักให้ทำงานได้จริง)
Intel ให้ implementation ของ OpenCL 3.0 สำหรับ GPU Intel
OpenCL 1.2 ยังรองรับบน macOS รวมถึง Apple Silicon แต่เอกสารถูก deprecate แล้ว
Microsoft
C++ AMP ดูเหมือนตายไปแล้ว แม้จะไม่ขึ้นกับผู้ผลิตและได้รับการสนับสนุนจาก Visual C++ แต่ไม่เคยมีการอัปเดตหลัง D3D11 อีกเลย และยังเคยรองรับ ROCm รุ่นเก่าด้วย
Apple
การประมวลผลด้วย Metal มีไว้สำหรับ macOS/iOS/... เท่านั้น ในโลก GPGPU มันไม่น่าสนใจนัก โดยเฉพาะเมื่อพูดถึงประสิทธิภาพการประมวลผลบน GPU
1 ความคิดเห็น
GPGPU มีความแตกต่างกันมากตามผู้ผลิตและระบบปฏิบัติการ เลยหวังว่าสักวันหนึ่งจะมีการรวมให้เป็นมาตรฐานเดียวกันได้
ว่าแต่ก็ไม่มีการพูดถึง DirectML ของ Windows เลยนะครับ รองรับฮาร์ดแวร์ได้กว้างมาก และช่วงหลัง ๆ ก็ทำให้รันบน WSL ได้แล้วด้วย เลยเริ่มสนใจขึ้นมาน่ะครับ