Nvidia 似乎通过 CUDA 主导了 HPC / GPGPU 计算领域。如果我想使用 AMD GPU 编写科学应用程序,现在首选的语言是什么?我相信它曾经是 OpenCL,然后我听到了很多关于 OpenACC 的消息,它也可以在 Nvidia 芯片上运行。现在我看到了有关 ROCm 的信息?感觉这里有点乱!
AMD 的 GPGPU 语言?
我无法谈论如何最好地使用 AMD GPU。
但是,在您列出的语言中,CUDA 可以被认为是通用应用程序的最低级别、最高性能的语言。这是因为它是由供应商专门为其硬件开发的硬件特定语言。它可以并且确实提供了不会直接转换为其他 GPU 的选项。因此,使用它会产生供应商锁定。
但是,CUDA 可能难以编程,因为它需要对 GPU 的工作原理有充分的了解,并以与 CUDA 兼容的方式编写代码。如果您的目标是快速加速更简单的问题或将旧代码转移到 GPU 上而无需重写数千行代码,那么 CUDA 是一个糟糕的选择。
相反,您需要 OpenACC 或 OpenMP 4.5+。这两种语言扩展都允许您以最少的麻烦和知识并行化您的代码,例如:
#pragma acc parallel loop //Memory movement handled automagically
for(int i=0;i<10000000;i++)
a[i] = std::sqrt(std::log(a[i])+1.0); //Tada! I'm on the GPU
OpenMP 和 OpenACC 本质上做同样的事情,但 OpenMP 是一个“开放标准”,而 OpenACC 本质上是 Nvidia 试图将开放标准的理念纳入其优势的尝试。作为该战略的一部分,OpenACC 也首先进入市场。在两者之间移动并不是特别困难。
上次我检查了只有 Nvidia 的 PGI 编译器完全支持 OpenACC,只有 IBM 的 XL 编译器完全支持 OpenMP 的目标指令。但是您可以期望对两者的支持都会扩大。
Kokkos、Thrust、Tensorflow 和其他此类库提供了利用 GPU 的替代高级方法。
我无法谈论 ROCm 做了什么,但它看起来好像为 OpenCL 和 HIP 提供了一个独立于硬件的运行时库(它看起来像是一种开放的、平台独立的 CUDA 式语言)。
我没有足够的声誉,所以我(必须)发布答案而不是评论。
另一种方法是使用带有自己语言的 HIP 编译器。见这里: https ://github.com/ROCm-Developer-Tools/HIP
除了与 GPU 无关的语言之外,该编译器似乎能够转换 CUDA 代码以在 AMD GPU 上执行。