7

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();
  }
}
4

2 回答 2

13

没有办法在运行时检查一段代码在哪个架构上运行,但也不需要知道,因为它可以在编译时确定并进行相应处理。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 语言扩展部分中阅读有关编译控制的更全面的讨论。

于 2013-05-01T07:02:26.100 回答
4

我无法在评论中添加正确的代码降价 - 决定添加完整答案。仅使用__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
}
于 2014-12-03T21:05:48.050 回答