有人知道如何使用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__定义检查并不完全正确。在某些情况下,此代码不起作用 - 在找到解决方案之前我花了很多时间进行调试(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)
| 归档时间: |
|
| 查看次数: |
1451 次 |
| 最近记录: |