检查代码是否在GPU或CPU上运行

Check whether the code is running on the GPU or CPU

本文关键字:CPU 运行 GPU 代码 是否 检查      更新时间:2023-10-16

有人知道如何检查代码是否在GPU或CPU上运行使用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
}