OpenACC-如何查找设备是否正在忙于执行某些CUDA操作?

OpenACC-如何查找设备是否正在忙于执行某些CUDA操作?,cuda,gpgpu,openacc,Cuda,Gpgpu,Openacc,我有一个基于CUDA的代码,我想将OpenACC合并到代码的某些部分中。但是,我试图用OpenACC代码并行化的函数有时受CUDA调用的控制,有时则不受CUDA调用的控制 我的问题是如何查询OpenACC库以查看设备是否繁忙。有API调用吗 注意:我并不完全熟悉CUDA,所以我只使用伪代码 有时,当设备忙于计算时,主机上会调用目标函数seq_function,如下所示。但是,有时在设备不忙时调用它 cudaMemAlloc(...); cudaLaunchAsync(...); ... //Th

我有一个基于CUDA的代码,我想将OpenACC合并到代码的某些部分中。但是,我试图用OpenACC代码并行化的函数有时受CUDA调用的控制,有时则不受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

是否有办法确定设备是否繁忙?

我不知道如何通过编程获得设备利用率。您可以获得内存使用情况,通过它可以推断GPU上是否有运行。

谢谢。虽然它是CUDA和NVidia特有的,并不像OpenACC承诺的那样是一种通用方法,但它似乎是找到答案的唯一途径。PGI确实提供了对OpenACC API的扩展,“acc_get_memory”和“acc_get_free_memory”,这与cudaMemGetInfo的功能基本相同。我只是建议使用cudaMemGetInfo,因为您在代码中的其他地方使用了CUDA。我使用的是OpenACC和CUDA(同时也使用CUDA)。我想在以前编写的基于CUDA的代码中添加一个功能。因此,拥有这个扩展非常有帮助,并使我的代码变得独立。但是,问题是作为“free”返回的值与开始时的总值不同(如中所述)。因此,除非我们记录free(可用),否则没有办法这样做内存从头开始,并将当前可用内存与之进行比较。如果您愿意使用NVIDIA加速器特有的概念,NVML api允许您直接查询设备利用率数据。您可以使用
NVIDIA smi-a
检索的大部分内容都可以通过NVML检索,NVML后面的库。例如
nvmlDeviceGetUtilizationRates()