2016-02-20 3 views
0

Учитывая какой-то проект, который должен иметь дополнительную сборку CUDA, как можно разделить код между двумя вариантами проекта, чтобы максимизировать повторное использование кода?Обмен кодами между GCC и NVCC

Например, в проекте, где гарантирована CUDA сборка, можно разделить код между CPU и GPU частями проекта следующим образом: -

//shared_functions.h 
float computeEta(float lambda, int t); 

//shared_functions.cu 
__host__ __device__ 
float computeEtaDevice(float lambda, int t){ 
    return (1.0/(lambda*(float)t)); 
} 

float computeEta(float lambda, int t){ 
    return computeEtaDevice(lambda, t); 
} 

//test.cpp 
#include "shared_functions.h" 
... 
computeEta(lambda, t); 

Однако, не ясно, как это может быть достигнуто в отсутствие CUDA во время компиляции.

ответ

2

Таким образом, после некоторых экспериментов, кажется, что-то похожее на это делает трюк (пример написан в браузере): -

//shared.h 
#if defined(__CUDACC__) && defined(__CUDA_ARCH__) 
    #define __SHARED_CODE__ __device__ 
#else 
    #define __SHARED_CODE__ 
#endif 

__SHARED_CODE__ 
inline float func1(float a, float b){ 
    return a + b; 
} 
+1

Я хотел бы дать ответ в этом направлении, когда вы предоставили ваши. Позвольте мне добавить следующее: стандартным способом во многих библиотеках является определение макроса типа '#define CUDA_HOST_DEVICE __host__ __device__', если он скомпилирован с помощью' nvcc', и пустой define, если скомпилирован с компилятором хоста. – havogt

+0

@havogt Отличная идея. Благодарю. Обновленный ответ, чтобы отразить его. –

Смежные вопросы