如何从代码的主机部分获取 GPU 的当前计算能力?

Posted

技术标签:

【中文标题】如何从代码的主机部分获取 GPU 的当前计算能力?【英文标题】:How do I get the current compute capability of a GPU from the host portion of the code? 【发布时间】:2017-11-21 11:34:03 【问题描述】:

我尝试使用__CUDA_ARCH__,但我在某处读到这仅适用于代码的设备部分。 之后,我在github上偶然发现了这段代码:link

有没有更好的方法来实现这一点?

我之所以问这个问题是因为我想(在主机代码上)确定 GPU 是否支持统一内存,在这种情况下会发生 cudaMallocManaged 或者 cudaMallocs && cudaMemcpys 会发生。

我想做的例子:

int main() 
  // IF CUDA >= 6.0 && COMPUTE CAPABILITY >= 3.0
      // USE cudaMallocManaged
  // ELSE
      // USE cudaMallocs && cudaMemcpys
  // END IF
  return 0;

【问题讨论】:

我认为SDK中有一个代码示例用于获取计算能力。 @PaulR 所以你建议我应该使用__host__ ​cudaError_t cudaGetDeviceProperties ( cudaDeviceProp* prop, int device ) 并从managedMemSupported 变量中读取值。如果我想用一些甚至没有 cudaMallocManaged 定义的旧 CUDA API 编译完全相同的代码怎么办? 我不知道——我已经很久没有使用 CUDA 工作了——我只记得 SDK 中有一个代码示例报告了计算能力,仅此而已。 @PaulR 哦,好的!不管怎么说,还是要谢谢你! ;) 注意cudaGetDeviceProperties()__CUDA_ARCH__查询计算能力是有区别的:前者给出的是设备的实际计算能力,后者给出的是设备代码已经得到的计算能力编译为。如果不同的计算能力设备二进制兼容,或者 PTX 代码是否由驱动程序转换为实际架构,它们可能会有所不同。 【参考方案1】:

这里似乎涉及两个问题:

    如何(在编译时)查询特定代码正在为其编译的 CUDA 运行时 API 版本,以便确定使用某些运行时 API 元素(例如与托管内存相关联的元素)是否安全哪些可能只出现在较新的运行时 API 版本中?

    已经讨论了一种方法here。作为这种特殊情况的精简版本,您可以执行以下操作:

    #include <cuda_runtime_api.h>
    ...
    // test for CUDA version of 6.0 or higher
    #if CUDART_VERSION >= 6000 
    // safe to use e.g. cudaMallocManaged() here
    #else
    // e.g. do not use managed memory API here
    #endif
    

    如何确定是否可以在运行时使用托管内存?

    正如 cmets 中已经提到的,如果您确定要编译的 CUDA 版本是 CUDA 6.0 或更高版本(例如,见上文),那么您应该在尝试使用 cudaMallocManaged 之前测试对托管内存的支持。 deviceQuery CUDA sample code 表示在运行时测试功能的通用方法(例如使用cudaGetDeviceProperties,测试managedMemSupported 属性)。

【讨论】:

以上是关于如何从代码的主机部分获取 GPU 的当前计算能力?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL。如何确定哪个计算设备是空闲的并相应地提交作业?

深度学习 对硬件的要求

GPU主要是处理图形的,CPU主要是进行数据运算的,超级计算机需要的是数据运算能力,为啥有的超级

做深度学习的服务器需要哪些配置?

如何获取Power VR GPU数据

markdown GPU的计算能力