2016-06-30 13 views
0

Ich verwende CUDA für mein aktuelles Projekt und muss einen CPU- und GPU-Kernel mit einer einzigen Implementierung verwalten. Ich kann mitWas ist die beste Alternative zu #if in #define

__device__ __host__ 

eine Funktion markieren, aber das erlaubt mir nicht, den Code zu trennen, wenn das Gerät nur für Funktionen nutzen benötigt. Also, ich habe mit der folgenden Lösung kommen:

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

Nun würde Ich mag diesen Code platzieren in einem #define diesen Teil zu verkapseln, wie

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

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

jedoch doesn diese‘ t kompilieren, da keine anderen Vorprozesse in das Makro aufgenommen werden können. Ich habe auch versucht

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

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

ohne Glück, als das Token als DEVICE_FUNCTION_IsOnDevice aufgelöst wird, obwohl IsOnDevice bei der Kompilierung bekannt ist. Gibt es eine Möglichkeit, Code mit # zu verkapseln, wenn es in einem Makro ist (oder irgendetwas, wirklich)?

Antwort

2

Sie könnten __CUDA_ARCH__ vordefiniertes Makro verwenden, um zu deaktivieren, ob Code als Gerätecode behandelt werden soll oder nicht. Auf der Host-Seite ist das Makro nicht definiert. Hier

ein Beispiel:

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

Danke für den Kommentar! Mir war nicht bewusst, dass es so einfach war, die Host- und Gerätefunktionen zu unterscheiden. –