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)?
Danke für den Kommentar! Mir war nicht bewusst, dass es so einfach war, die Host- und Gerätefunktionen zu unterscheiden. –