检查代码是在GPU还是CPU上运行

时间:2013-05-01 05:55:09

标签: c++ cuda

有人知道如何使用Cuda检查代码是在GPU还是CPU上运行?

__device__ __host__  double count_something(double variable) {
  if (RUN_ON_GPU) {
    use_cuda_variables();
  } else {
    use_cpu_variables();
  }
}

2 个答案:

答案 0 :(得分:12)

没有办法运行时检查运行一段代码的架构,但也没有必要知道,因为它可以在编译时确定并相应地处理。 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 question或CUDA编程指南的C language extensions部分中阅读有关编译指导的更全面的讨论。

答案 1 :(得分:2)

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