GPGPU计算、软件选型

计算科学 C++ 并行计算 C 显卡 软件推荐
2021-12-25 23:50:08

我正在使用现有的 GCC C++ x86 Qt 应用程序来过滤、显示和存储由某些 C 代码计算的结果。由于现在计算对于 CPU 来说太复杂了,我打算将小型 C 程序移植到一些 GPU 计算平台上。因此,C 代码应该执行从 x86 GUI 接收到的任务,在 GPU 上并行运行它们并将结果发回以进行最终处理。

不幸的是,我对 GPU 计算完全陌生。我阅读了很多关于不同硬件、驱动程序、语言、库、编译器、版本等的信息,我有点困惑。我希望有人可以帮助我选择正确的道路。

这些是我的要求(首先是最重要的):

  • 一切都应该在 Linux (Ubuntu) 上运行和构建
  • 既然是爱好项目,所有的软件都应该是免费的
  • GPU 代码应该用 C 编写(C++ 将是一个奖励)
  • GPU 代码应该可以在 Tesla T4 卡上执行
  • GPU 代码应该可以在 x86 CPU 上执行,无需进行重大代码更改(开发系统没有 GPU 卡)
  • 一般的软件工程师应该很容易理解这些技术
  • 语言和编译器应该支持 64 位宽的无符号整数,因为我的 C 代码经常使用它们(128 位和 256 位将是一个奖励)
  • 独立于 GPU 制造商(即 NVIDIA)会很好
  • 计算任务可能会运行几个月甚至几年,所以
    效率会很好
  • 使用 Qt creator 构建 GPU 代码的方法(避免两个不同的构建链)会很好

我能满足这些要求吗?我应该选择哪些工具?

编辑:如果不能完全满足要求,哪种解决方案可以帮助我满足最重要的要求?

3个回答

建议先考虑并行化,再讨论实现。想一想代码做了什么,存在哪些数据依赖关系,以及可以并行执行哪些操作。

然后有几个 C++ 框架(alpaka、kokkos 或另一个答案中提到的 ArrayFire 库)可以帮助您引入抽象层。因此,您可以为 CPU 和 GPU 编译代码。

最后,您可以对您的应用程序进行基准测试,并确定您的假设是否正确,即 GPU 适合这项工作。不幸的是,并不是每个应用程序都非常适合 GPU 架构,您不应该一直期待神奇的加速数字。

OpenCL 可在多核 cpu、英特尔高清显卡甚至 DSP 卡上运行。在引入计算着色器之前,它几乎是跨平台 gpu 计算的标准。

有各种库以 OpenCL 作为后端,例如 viennaCL 或 ArrayFire。其中一些库可以使用其他后端进行 gpu 计算,例如 CUDA,它运行速度更快,但仅在 nvidia gpu 上可用。

OpenCL 与 C 类似,但 viennaCL 和 ArrayFire 是 C++,并且很好地封装在 OOP 接口中。OpenCL 通常在运行时动态编译。

我认为这可以满足您的所有要求。

在开始这条道路之前,重要的是要确定当前代码中是否有足够的数据并行性以使使用 GPU 值得。我鼓励您首先在问题中更详细地描述您的应用程序和算法。

根据应用程序的不同,可能存在一些计算任务,其中库例程已经可用,可以利用 GPU - 这对于信号和图像处理、数值线性代数等中的许多任务都是如此。如果有一个库已经可以这份工作,你不想重新发明轮子。

假设您找不到已经为您完成重要工作的库,一种选择是使用 OpenMP 或 OpenACC 对 C 的扩展来编写可以编译为在 GPU 或 CPU 上运行的代码。在更接近硬件的级别上,您可以使用 OpenCL。如果您想要一个可以在其他 GPU 上运行的解决方案,NVIDIA 的 CUDA 不是一个选项。