我在当前的项目中使用CUDA,需要用一个实现来维护CPU和GPU内核。我可以用
__device__ __host__
但这不允许我在需要使用纯设备功能时拆分代码。因此,我提出了以下解决方案:
template <bool IsOnDevice>
#if IsOnDevice
__device__
#else
__host__
#endif
...the rest of the function header
现在,我想把这段代码放在一个#define中来封装这一部分,比如
//Macro:
#define DEVICE_FUNCTION \
template <bool IsOnDevice> \
#if IsOnDevice \
__device__ \
#else \
__host__ \
#endif
//Example function:
DEVICE_FUNCTION
...the rest of the function header
但是,这不会编译,因为宏中不能包含其他预处理。我也试过了
#DEVICE_FUNCTION_true __device__
#DEVICE_FUNCTION_false __host__
#DEVICE_FUNCTION_RESOLVER(flag) DEVICE_FUNCTION_##flag
#DEVICE_FUNCTION \
template <bool IsOnDevice> \
DEVICE_FUNCTION_RESOLVER(IsOnDevice)
运气不好,因为令牌被解析为设备函数IsOnDevice,即使IsOnDevice在编译时是已知的。有没有办法用if在宏中封装代码(或者其他什么东西)?
最佳答案
您可以使用预定义的宏来区分代码是否应被视为设备代码。在主机端,未定义宏。
下面是一个例子:
__device__ __host__ void foo()
{
#ifdef __CUDA_ARCH__
__syncthreads();
#else
// do something else on host side
#endif
}