GPU 编程,CUDA 还是 OpenCL 还是?

Mat*_* F. 7 cpu cuda gpu opencl hip

GPU 编程的最佳方法是什么?

我知道:

  • CUDA 非常好,有很多开发人员支持和非常好的 zo 调试,但仅限于 NVidia 硬件
  • OpenCL 非常灵活,可以在 NVidia、AMD 和 Intel 硬件上运行,可以在加速器、GPU 和 CPU 上运行,但据我所知,NVidia 不再支持。
  • Coriander ( https://github.com/hughperkins/coriander ) 将 CUDA 转换为 OpenCL
  • HIP https://github.com/ROCm-Developer-Tools/HIP由 AMD 制作,可以以转换为 AMD 和 NVidia CUDA 的方式编写。它还可以将 CUDA 转换为 HIP。

OpenCL 是我更喜欢的方式,我希望在硬件支持方面非常灵活。但如果不再得到 NVidia 的支持,那就是淘汰赛了。对于我来说,HIP 对于不同的发布文件来说是最好的。但英特尔即将推出的硬件的支持情况如何呢?

还有其他选择吗?对我来说重要的是许多受支持的硬件,长期支持,以便在几年内也可以编译并独立制造。附加:应该能够使用obe以上的编译器,在Linux和Windows上都支持。

Pro*_*ysX 16

Nvidia 不会很快取消 OpenCL 支持。

SYCL 是一种新兴的 GPU 上可移植代码方法。它可以从单个源文件进行更高级别的编程,然后编译两次,一次用于 CPU,一次用于 GPU。然后,GPU 部分通过 OpenCL、CUDA 或其他后端在 GPU 上运行。

然而,截至目前,跨平台支持最好的 GPU 框架是 OpenCL 1.2,目前该框架已经非常完善。CPU 代码 (C/C++) 和 GPU 代码 ( OpenCL C ) 清晰分离,这有助于明确哪个部分运行在哪里,以及何时需要在 CPU 和 GPU 之间复制数据。OpenCL 可以在已有 10 年历史的 GPU、所有最新、最快的数据中心 GPU、所有游戏和工作站 GPU 上运行,如果您需要更多内存,甚至可以在 CPU 上运行。支持所有供应商(Nvidia、AMD、Intel、Apple、ARM...)。与 CUDA 相比,在 Nvidia GPU 上根本不存在性能/效率权衡;它运行得同样快。

如果您选择从 OpenCL 开始,请查看此OpenCL-Wrapper。原生 OpenCL C++ 绑定有点麻烦,这个轻量级包装器大大简化了学习和开发,同时保持功能和完整性能。

CUDA 是一种专有的 GPU 语言,仅适用于 Nvidia GPU。与 OpenCL/SYCL 相比,它没有任何性能优势,但限制软件只能在 Nvidia 硬件上运行。

HIP 是一种专有的 GPU 语言,仅在 7 种非常昂贵的 AMD 数据中心/工作站 GPU 型号上受支持。与 OpenCL/SYCL 性能相同,但它将软件限制为 AMD 硬件的子集。

如果您已经拥有大型代码库,那么移植工具非常有用,但性能可能会受到影响。我的建议是选择一种开放框架 (OpenCL/SYCL) 并完全致力于它,而不是从仅在 Nvidia 或 AMD GPU 上运行的专有语言 (CUDA/HIP) 开始,然后生成优化不佳的端口支持其他硬件。移植很麻烦,更麻烦的是用不同的专有语言维护同一代码的多个变体。使用 OpenCL 或 SYCL,您只需要一种实现,它就可以在任何地方运行。