#define中#if的最佳替代方法是什么?

时间:2016-06-30 16:30:29

标签: c cuda macros c-preprocessor maintainability

我正在将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)

没有运气,因为令牌被解析为DEVICE_FUNCTION_IsOnDevice,即使在编译时已知IsOnDevice。有没有办法用#if封装代码在宏中(或任何东西,真的)?

1 个答案:

答案 0 :(得分:3)

您可以使用__CUDA_ARCH__预定义宏来疏远代码是否应被视为设备代码。在主机端,未定义宏。

以下是一个例子:

__device__ __host__ void foo()
{
#ifdef __CUDA_ARCH__
    __syncthreads();
#else
    // do something else on host side
#endif
}