2016-06-30 4 views
0

현재 프로젝트에 CUDA를 사용하고 있으며 단일 구현으로 CPU와 GPU 커널을 유지 관리해야합니다.#define #if의 #if에 대한 최선의 대안은 무엇입니까

__device__ __host__ 

으로 태그를 지정할 수 있지만 장치 전용 기능을 사용해야하는 경우 코드를 분할 할 수 없습니다. 그래서, 나는 다음과 같은 솔루션과 함께 올라와있다 : 그러나 같은

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

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

로, 이제

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

, 나는이 부분을 캡슐화하는 정의 #이 코드를 배치 할,이 '아무튼 다른 사전 프로세스가 매크로에 포함될 수 없으므로 컴파일하지 마십시오. 토큰이 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

감사 : 여기

은 예입니다! 나는 호스트와 장치 기능을 구별하기가 쉽다는 것을 알지 못했다. –