Does anybody know how to check whether the code is running on the GPU or CPU using Cuda?
__device__ __host__ double count_something(double variable) {
if (RUN_ON_GPU) {
use_cuda_variables();
} else {
use_cpu_variables();
}
}
没有办法在运行时检查一段代码在哪个架构上运行,但也不需要知道,因为它可以在编译时确定并进行相应处理。nvcc
定义了几个预处理器符号,可用于在编译代码时解析编译轨迹。关键符号是__CUDA_ARCH__
在编译主机代码时从不定义,在编译设备代码时始终定义。
所以可以写出这样的函数:
__device__ __host__ float function(float x)
{
#ifdef __CUDA_ARCH__
return 10.0f * __sinf(x);
#else
return 10.0f * sin(x);
#endif
}
这将根据是为 GPU 还是主机编译而发出不同的代码。您可以在此Stack Overflow 问题或 CUDA 编程指南的C 语言扩展部分中阅读有关编译控制的更全面的讨论。
我无法在评论中添加正确的代码降价 - 决定添加完整答案。仅使用__CUDA_ARCH__
定义检查并不完全正确。在某些情况下,这段代码不起作用——在找到解决方案之前,我已经花了很多时间进行调试(CUDA 文档现在没有提到它)。
__CUDA_ARCH__
即使在主机代码中也可以定义,但在这种情况下它被定义为 0。因此正确的检查是这样的:
__device__ __host__ float function(float x)
{
#if (defined(__CUDA_ARCH__) && (__CUDA_ARCH__ > 0))
// device code here
return 10.0f * __sinf(x);
#else
// host code here
return 10.0f * sin(x);
#endif
}