Я хочу упростить задачу формирования функции-обертки, которая в случае компиляции с поддержкой CUDA должна сначала попробовать запустить код на GPU, если не выйдет (или если скомпилировано без CUDA) — на CPU.
Для этого в файле wrapper.c я определил макросы
#ifdef CUDA_FOUND
#define SET_F(FN) int FN{ \
if(!Only_CPU) if(CU ## FN) return 1; \
if(CPU ## FN) return 1; \
return 0; \
}
#else
#define SET_F(FN) int FN{ \
if(CPU ## FN) return 1; \
return 0; \
}
#endif // CUDA_FOUND
А в файле wrapper.h (который включается в т.ч. и файлами CUDA.cu и CPU.c, содержащими функции для выполнения на GPU или на CPU) вот такие макросы:
#ifndef EXTERN
#define EXTERN extern
#endif // EXTERN
#ifdef CPU_C // file included from CPU.c
#define BOTH(FN) EXTERN int CPU ## FN;
#elif defined CUDA_CU //file included from CUDA.cu
#define BOTH(FN) EXTERN int CU ## FN;
#elif defined WRAPPER_C // wrapper.c needs names of both wariants
#ifndef CUDA_FOUND
#define BOTH(FN) EXTERN int CPU ## FN;
#else
#define BOTH(FN) EXTERN int CU ## FN; EXTERN int CPU ## FN;
#endif // CUDA_FOUND
#else // file included from something else - just define a function
#define BOTH(FN) EXTERN int FN;
#endif
По идее, все должно работать.
Для теста сделал простую функцию fillrandarr(size_t sz, char *arr) (в дальнейшем это будет реальная функция):
CPU.c:
int CPUfillrandarr(size_t sz, char *arr __attribute__((unused))){
printf("CPU!!!: sz = %zd\n", sz);
return 1;
}
CUDA.cu:
EXTERN int CUfillrandarr(size_t sz, char *arr){
printf("GPU: sz = %zd\n", sz);
return 1;
}
wrapper.h:
BOTH(fillrandarr(size_t sz, char *arr))
wrapper.c:
SET_F(fillrandarr(size_t sz, char *arr))
Но, увы, компиляция не происходит: препроцессор ругается:
wrapper.c: В функции <<fillrandarr>>:
ошибка: неявная декларация функции <<CUfillrandarr>>
ошибка: expected expression before <<size_t>>
ошибка: expected expression before <<size_t>>
ошибка: слишком мало аргументов в вызове функции <<CPUfillrandarr>>
wrapper.h:46:1: замечание: declared here
ошибка: параметр <<sz>> не используется
ошибка: параметр <<arr>> не используется
Чертовщина какая-то!