【问题标题】:Current practice for deploying cross-GPU-family GPU code部署跨 GPU 系列 GPU 代码的当前实践
【发布时间】:2015-07-19 10:37:55
【问题描述】:

情况是这样的;一组计算(用 C++ 编写),最好使用用户系统上可用的任何 GPU,或者如果不存在这样的 GPU,则使用他们的 CPU,其中该用户系统不是构建机器并且将是未知的(但相当标准的桌面)配置。

目前,我可以使用 Thrust 编写代码,但(除非我误解)在实际构建它时,目标已设置(广义上讲,Nvidia 或 CPU)并且二进制文件将仅使用 GPU 硬件用户的机器(否则甚至可能无法运行),如果它来自与构建二进制文件相同的 GPU 系列。

在一个神奇的理想世界中,我想要的是一个二进制文件,它将识别在其运行的机器上可用的 GPU(Nvidia、ATI、回退到普通 CPU)系列(如果有的话),并加以利用其中。必须构建三个单独的版本并确保每个用户都获得适合他们特定机器的正确版本是不可能的(目标是相当标准的桌面;Windows、Linux 和 Solaris - 不过让我们把它放在一边,因为有不同的构建这三个中的每一个都是完全可以接受的;目的是为这三个目标中的每一个提供一个二进制文件,以识别和使用可用的 GPU,无论是 Nvidia、ATI 还是普通 CPU)。

我一直在谷歌中输入一些有希望的术语,但尚未找到任何解决此问题的内容;据我所知,这是一个完全解决的问题,只是我没有输入正确的单词。

谁能告诉我这样做的标准方法是什么(如果有的话)?

编辑:删除了错误的推力信息,添加了有关最终目标硬件的注释

【问题讨论】:

  • ATI 没有推力。它是一个仅限 CUDA 的模板库。在 NVIDIA 平台上,您可以构建任意数量的 CUDA 架构,并且 GPU 架构选择是自动的,您无需执行任何操作
  • 这个,nvidia-nsight问的问题是针对直接使用cuda函数的项目
  • 这真是一个关于推荐异地资源(一种GPU编程语言/环境)的问题。
  • “这真是一个关于推荐异地资源的问题”天哪,是吗?我认为这是一个关于当前最佳实践是什么的问题。我可以自己找到大量关于 GPU 编程的场外资源。我找不到的是其他人如何管理针对多个最终用户系统的需求。

标签: c++ gpu thrust


【解决方案1】:

我认为这值得一试: Load shared library by path at runtime
为了让它工作,你应该将你的应用程序分成前端和后端部分。 为每个系列编译后端,并让前端在运行时加载正确的后端。

【讨论】:

    【解决方案2】:

    AFAIK,适用于 AMD/ATI 和 Nvidia GPGPU 的唯一标准是 OpenCL。 CUDA 是 Nvidia 的专有技术。当然,它需要 OpenCL 实现可用(并且值得使用)。

    您可能对PIPS4UOpenACCOpenMP,甚至MPI 等感兴趣。还可以查看多线程,例如支持 C++11 thread

    请注意,某些计算机(例如许多服务器)没有任何 GPGPU。其他人的 GPGPU 可能比他们的 CPU 慢,因此不值得用于计算任务。一些 AMD 芯片有一个 APU。其他人有HSA。通过 GPGPU 进行的异构计算没有很好地标准化。

    请注意,GPGPU 软件必须调整(或配置)运行它的特定硬件....这个这就是为什么难以编写高效的 OpenCL(或 Cuda)软件的原因。

    顺便说一句,可能有一些奇怪的配置。想象一个带有片上 GPU 处理器(例如 Intel i4770K、Intel i5775C)、一个高端 AMD GPGPU 和显卡以及另一个高端 NVIDIA GPGPU 和显卡的系统......您可能想要运行 OpenCL他们三个都...

    您可以考虑一些 plugin 架构(例如,使用来自 POSIX 的 dlopendlsym)。您可以考虑一些 C++ 框架(QtPOCO)以独立于操作系统的方式为插件提供接口。

    但是有no silver bullet;也许一个好的方法可能是定义并公开记录插件架构(例如插件命名和调用约定),然后以free software 的形式发布几个实现(OpenCL、Cuda、OpenACC、OpenMP、 MPI, ....) 适合该架构的类似插件。请注意name mangling,因此将插件的公共功能声明为extern "C"。您可以将其与一些 metaprogramming 方法混合使用,您的应用程序在运行时生成 C++(和/或 OpenCL 等)代码,然后将其编译并加载为插件(在用户的机器上)。

    【讨论】:

    • 当然,但是 OpenCL 是在编译时还是运行时设置目标硬件?根据我的阅读,我认为它可能会在运行时使用用户必须安装的一组特定于系统的 OpenCL 库。
    • 它与硬件无关。只要驱动程序支持 OpenCL 就可以工作
    • 这不是一个答案。如果机器没有安装 OpenCL 实现,OpenCL 将无法工作,这对于“相当标准”的配置是正常的。
    • @stgatilov 当然,理想的配置是“相当标准”的配置,但在没有更好的答案的情况下,到目前为止,我会选择“OpenCL,但你必须分发一些 OpenCL 库如果这是我们今天能做的最好的,用户将需要在他们的特定机器上安装”。
    • @stgatilov 这与依赖第三方库没有什么不同。
    猜你喜欢
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    相关资源
    最近更新 更多