如何从代码的主机部分获取 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。如何确定哪个计算设备是空闲的并相应地提交作业?