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

T_T*_*T_T 7 c++ cuda

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

__device__ __host__  double count_something(double variable) {
  if (RUN_ON_GPU) {
    use_cuda_variables();
  } else {
    use_cpu_variables();
  }
}
Run Code Online (Sandbox Code Playgroud)

tal*_*ies 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
}
Run Code Online (Sandbox Code Playgroud)

它会发出不同的代码,具体取决于它是为GPU还是主机编译的.您可以在此Stack Overflow问题或CUDA编程指南的C语言扩展部分中阅读有关编译控制的更全面的讨论.

  • 这不是完全正确的。在某些情况下,此代码不起作用-在找到解决方案之前,我花了很多时间进行调试。即使在主机代码中也可以定义`__CUDA_ARCH__`,但是在这种情况下,它被定义为0。因此正确的检查是这样的:`__device__ __host__ float function(float x){#if(defined(__ CUDA_ARCH__)&&(__CUDA_ARCH__> 0))return 10.0f * __sinf(x); #else //在此处托管代码#endif}` (2认同)

avt*_*ton 5

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