【问题标题】:OpenACC - How to find if device is busy doing some CUDA operations?OpenACC - 如何查找设备是否正忙于执行一些 CUDA 操作?
【发布时间】:2016-11-19 00:51:39
【问题描述】:

我有一个基于 CUDA 的代码,我想将 OpenACC 合并到代码的某些部分。但是,我试图通过 OpenACC 代码并行化的功能有时由 CUDA 调用控制,有时则不受控制。

我的问题是如何查询 OpenACC 库以查看设备是否忙。是否有任何 API 调用?

注意: 我对 CUDA 并不完全熟悉,所以我只是使用伪代码。

当设备忙于如下计算时,有时会在主机上调用目标函数seq_function。但是,有时它会在设备忙碌时调用。

cudaMemAlloc(...);
cudaLaunchAsync(...);
...
//This is the function I am trying to parallelize with OpenACC
seq_function(...); 
...
cudaWait(...);
cudaDealloc(...);

所以,我想让我的目标函数灵活:

  • 如果设备繁忙或正在运行基于 CUDA 的计算 => 使用主机。
  • 如果设备忙碌 => 通过启用 OpenACC 的代码使用 GPU。

有没有办法查看设备是否忙?

【问题讨论】:

    标签: cuda gpgpu openacc


    【解决方案1】:

    我不知道以编程方式获取设备利用率的方法。您可以通过 cudaMemGetInfo 获取内存使用情况,您可以使用它来推断 GPU 上是否正在运行某些东西。

    【讨论】:

    • 谢谢垫。虽然它是 CUDA 和 NVidia 特有的,而不是 OpenACC 所承诺的通用方法,但它似乎是找出答案的唯一方法。
    • PGI 确实提供了对 OpenACC API 的扩展,“acc_get_memory”和“acc_get_free_memory”,这与 cudaMemGetInfo 的作用基本相同。鉴于您在代码中的其他地方使用了 CUDA,我只建议使用 cudaMemGetInfo。
    • 我正在使用带有 CUDA 的 OpenACC(同时也使用了 CUDA)。我想向以前编写的基于 CUDA 的代码添加一个功能。因此,拥有这个扩展有很大帮助,并使我的代码变得独立。
    • 但是,问题是作为“免费”返回的值与一开始的总值不同(正如here 中所讨论的那样。因此,没有办法这样做,除非我们从头开始记录空闲(可用)内存,并将当前空闲内存与之比较。
    • 如果您愿意使用特定于 NVIDIA 加速器的概念,NVML api 允许您直接查询设备利用率数据。您可以使用nvidia-smi -a 检索的大部分内容都可以通过 NVML(GPU deployment kit 背后的库)检索。例如nvmlDeviceGetUtilizationRates()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2012-07-09
    • 2016-06-16
    • 2020-12-29
    • 2021-07-31
    • 2021-09-09
    相关资源
    最近更新 更多