Проблема:
Имея .h, я хочу определить real как double, если компиляция для c/c++ или для cuda с вычислительной способностью >= 1.3. Если компиляция для cuda с вычислительной способностью < 1.3, то определить real как float.
После многих часов я пришел к этому (что не работает)
# if defined(__CUDACC__) # warning * making definitions for cuda # if defined(__CUDA_ARCH__) # warning __CUDA_ARCH__ is defined # else # warning __CUDA_ARCH__ is NOT defined # endif # if (__CUDA_ARCH__ >= 130) # define real double # warning using double in cuda # elif (__CUDA_ARCH__ >= 0) # define real float # warning using float in cuda # warning how the hell is this printed when __CUDA_ARCH__ is not defined? # else # define real # error what the hell is the value of __CUDA_ARCH__ and how can I print it # endif # else # warning * making definitions for c/c++ # define real double # warning using double for c/c++ # endif
когда я компилирую (обратите внимание на флаг -arch)
nvcc -arch compute_13 -Ilibcutil testFloatDouble.cu
я получаю
* making definitions for cuda __CUDA_ARCH__ is defined using double in cuda * making definitions for cuda warning __CUDA_ARCH__ is NOT defined warning using float in cuda how the hell is this printed if __CUDA_ARCH__ is not defined now? Undefined symbols for architecture i386: "myKernel(float*, int)", referenced from: ....
Я знаю, что файлы компилируются дважды nvcc. Первый раз все нормально (CUDACC определен и CUDA_ARCH >= 130), но что происходит во второй раз? CUDA_DEFINED, но CUDA_ARCH не определен или имеет значение < 130? Почему?
Спасибо за ваше время.