CUDA и nvcc: использование препроцессора для выбора между float и double

Проблема:

Имея .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? Почему?

Спасибо за ваше время.

6
задан talonmies 10 January 2012 в 11:04
поделиться