今日のGPU演算API
(threedots.ovh)NVIDIA
市場の開拓者であり、成熟したツールキットを持つ。今なお急速に進化しており、特に高レベルAPIではその傾向が強い。NVIDIAが販売するすべてのGPUはCUDAをサポートしている。
かつてPGIと呼ばれていた、Linuxでのみ利用可能なHPC SDKには、OpenACC、C++標準並列化(stdpar)、OpenMP(ベータ)のサポートが追加されている。
NVIDIAのHPC SDKライセンスにおける問題の1つは、次の条項である:
You shall strictly prohibit the further distribution of the Run-Time Files by users of an End-User Application
ユーザーが、バンドルされたアプリで必要となるランタイムファイルを含めたままアプリを再配布できないため、アプリケーション自体を配布できない可能性がある。この問題は、大半の人が使っているCUDA SDKには当てはまらない。
AMD
AMDハードウェアで主力となっているGPGPUプログラミング環境はROCmである。AMDが所有するHIP以外で公式にサポートされているのはOpenMPとOpenACCだ。
ここにはいくつか明確な欠点がある:
-
Linux専用であり、そのため市場のかなりの部分では選択肢にならない。
-
ROCmツールチェーンで生成されたバイナリはIRを対象にせず、ハードウェア依存である。新世代が出るたびにバイナリを再コンパイルしなければならない。
-
リリース後かなり長い間、新しいハードウェアへのサポートが事実上存在しない。
これらの欠点により、デスクトップでの実用性は事実上なくなり、AMD GPUハードウェア向けのベンダー提供APIとしてはOpenCLだけが残っている。
Intel
oneAPIは最近発売されたすべてのIntel GPUでサポートされているが、高性能はまだ実現されていない。IntelのLevel Zero以外で公式にサポートされているAPIはOpenMPとSYCLだ。
oneAPIのLevel ZeroはSPIR-VをIRとして使っており、将来登場するハードウェアへのシームレスな対応を可能にする。Windowsもサポートしている。
Khronos
複数ベンダーで使える業界標準を提供している。
OpenCL 3.0として知られるresetは、まだ大きな影響を与えていない。SYCLとVulkan演算の組み合わせは、優れた開発者体験とともに、単一バイナリを複数ベンダーで使えるより良い道になるかもしれない。
実際のOpenCLサポート:
今日のNVIDIAは、extensionsをサポートするOpenCL 1.2を提供している。
AMDは、実用的なOpenCL 1.2実装とともに、非常にバグの多いOpenCL 2.x実装を提供している(まともにデバッグする方法もない)。
Intelは、Intel GPU向けのOpenCL 3.0実装を提供している。
OpenCL 1.2はApple Siliconを含めmacOSでもサポートされているが、ドキュメントはdeprecatedになっている。
Microsoft
C++ AMPは死んだように見える。ベンダー非依存でVisual C++の支援も受けていたが、D3D11以降更新されていない。古いROCmバージョンもサポートされていた。
Apple
Metal演算はmacOS/iOS/…向けにすぎない。GPGPU分野では魅力がかなり低く、特にGPU演算性能においてその傾向が強い。
1件のコメント
GPGPUはベンダーやOSごとに状況が千差万別なので、いつか統合されるといいですね。
それはそうと、WindowsのDirectMLへの言及はないですね。ハードウェアを幅広くサポートしていますし、最近はWSLでも動くようになって興味を引かれたのですが。