【问题标题】:Writing CUDA program for more than one GPU为多个 GPU 编写 CUDA 程序
【发布时间】:2014-07-07 07:26:27
【问题描述】:

我有不止一个 GPU,并希望在它们上执行我的内核。是否有可以动态调度/管理 GPU 资源的 API 或软件?为程序利用所有可用 GPU 的资源。 一个可以定期报告可用资源的实用程序,我的程序将向 GPU 启动尽可能多的线程。

其次,我使用 Windows+ Visual Studio 进行开发。我读过 Linux 支持 CUDA。我需要对我的程序进行哪些更改?

【问题讨论】:

  • AFAIK 没有开箱即用的跨 GPU 调度库。您必须自己实施。
  • 如果您一次只回答一个问题,Stackoverflow 的效果会更好。关于 Linux 支持,假设您的 CPU 代码是跨平台的,您的 GPU 代码应该没问题;主要问题是设置您的构建环境(使用 Eclipse 之类的 IDE 或使用 Makefiles)。选择哪个是一个非常广泛的问题(对于 SO 来说太宽泛了),但是一些互联网搜索应该可以帮助你(这是一个通用问题,与 CUDA GPU 无关)。您可以查看 CUDA 示例(随工具包分发)以获取灵感。
  • 感谢您的建议。我以后会分开问题。我的 CPU 代码已经在 Windows7 + Visual C++ 中运行。因此,我继续使用这个平台进行开发。 .
  • 更改当前 GPU 就像使用 cudaSetDevice 一样简单。也许玩一下它会让你得出结论,你不需要这样的工具。
  • 我知道 cudaSetDevice() 会改变当前设备,我可以根据选择使用第一个或第二个设备。当我有一个 4/8 GPU 的机架时,你会推荐同样的东西吗?

标签: linux windows cuda gpu


【解决方案1】:

我有多个 GPU,并希望在它们上执行我的内核。是否有可以动态调度/管理 GPU 资源的 API 或软件。

对于您编写的任意内核,我知道没有“自动”使用多个 GPU 的 API(当然没有 CUDA API)。今天的多 GPU 感知程序通常使用这样的策略:

  1. 检测有多少 GPU 可用
  2. 根据可用 GPU 的数量将数据集划分为块
  3. 连续将块转移到每个GPU,并在每个GPU上启动计算内核,使用cudaSetDevice()切换GPU。

遵循上述方法的程序大致是cuda simpleMultiGPU sample code。一旦您制定了 2 个 GPU 的方法,那么转到 4 或 8 个 GPU 并没有太多额外的努力。这当然假设您的工作已经是可分离的,并且数据/算法分区工作已经“完成”。

我认为这是许多地方都在积极研究的领域,所以如果你进行谷歌搜索,你可能会找到像 this onethis one 这样的论文。您是否对这些感兴趣可能取决于您的确切需求。

CUDA 库在 CUDA 6 中有一些新开发,可以使用多个 GPU “自动”执行某些特定操作(例如 BLAS、FFT)。要进一步调查此问题,请查看相关的 CUBLAS XT documentationCUFFT XT multi-GPU documentationsample code。据我所知,目前这些操作仅限于 2 个 GPU 用于自动分配工作。这些允许自动分配特定工作负载(BLAS、FFT)而不是任意内核。

其次,我使用 Windows+ Visual Studio 进行开发。我读过 Linux 支持 CUDA。我需要对我的程序进行哪些更改?

除了OGL/DX interop APIs 之外,CUDA 大多与选择 windows 或 linux 作为平台是正交的。典型的 IDE 是不同的(windows:nsight Visual Studio edition,Linux:nsight eclipse edition),但您的代码更改将主要包括 windows 和 linux 之间的普通移植差异。如果您想开始使用 linux,请关注getting started document

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2015-11-12
    • 2015-10-17
    • 2016-05-17
    • 1970-01-01
    • 2013-08-03
    • 2011-05-01
    • 2018-07-31
    相关资源
    最近更新 更多