2016-06-30 7 views
0

私は現在のプロジェクトでCUDAを使用しており、CPUとGPUカーネルを1つの実装で維持する必要があります。#defineの#ifに最適な代替手段

__device__ __host__ 

で機能にタグを付けることはできますが、デバイス専用機能を使用する必要がある場合は、コードを分割することはできません。だから、私は、次の解決策が出ている:

template <bool IsOnDevice> 
#if IsOnDevice 
    __device__ 
#else 
    __host__ 
#endif 
...the rest of the function header 

さて、私は、このようなしかし

//Macro: 
#define DEVICE_FUNCTION \ 
template <bool IsOnDevice> \ 
#if IsOnDevice \ 
     __device__ \ 
#else \ 
     __host__ \ 
#endif 

//Example function: 
DEVICE_FUNCTION 
    ...the rest of the function header 

として、この部分をカプセル化するための#defineでこのコードを配置したいと思い、これは」doesnの他の前処理をマクロに含めることができないので、コンパイルしないでください。トークンはIsOnDeviceはコンパイル時に知られているにもかかわらずDEVICE_FUNCTION_IsOnDeviceとして解決さとして、私はまた、運で

#DEVICE_FUNCTION_true __device__ 
#DEVICE_FUNCTION_false __host__ 
#DEVICE_FUNCTION_RESOLVER(flag) DEVICE_FUNCTION_##flag 

#DEVICE_FUNCTION \ 
template <bool IsOnDevice> \ 
DEVICE_FUNCTION_RESOLVER(IsOnDevice) 

を試してみました。 #ifをマクロ(または何か)にカプセル化する方法はありますか?

答えて

2

事前定義マクロ__CUDA_ARCH__を使用して、コードをデバイスコードとして扱うべきかどうかを区別できます。ホスト側では、マクロは定義されていません。ここで

は一例です。コメントを

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

ありがとう!私は、ホストとデバイスの機能を区別するのが簡単だとは知らなかった。 –

関連する問題