2013-05-05 340 views
2

在调试开发和调试时,我想以双精度运行我的代码。但是,一旦我知道它正在工作,我想选择使用单精度(即float s)运行我的代码。所以我希望能够轻松地在这些精度之间进行切换,而无需大量重写代码。我在想一些#define标志像如何在CUDA中轻松切换单精度和双精度?

#define PRECISION double 
... 

thrust::device_vector<PRECISION> myVec; 

但是编译器似乎并不喜欢这样。关于如何实现这个的任何想法?

我知道this question非常相似,它解决了编译器标记问题。但我希望能够直接从我的源代码中直接设置一个标志。

回答

7

你可以这样说:

#ifdef MY_USE_DOUBLE_PRECISION 
typedef double Real; 
#else 
typedef float Real; 
#endif 

.... 

thrust::device_vector<Real> myVec; 

使用MY_USE_DOUBLE_PRECISION控制浮点型Real的定义。如果您拥有自己的内核,则还可以使用Real来代替floatdouble即。 :

__global__ void kernel (Real *input, Real *output) 
{ 
    ... 
} 

如果你想有编译内核代码的单精度和双精度版本,并选择在那里它们被定义编译单元的外面用哪一个(在库,例如)您可以模板内核:

template<typename T> 
__global__ void kernel (T *input, T *output) 
{ 
    ... 
} 

template __global__ void kernel<float>(float *, float *); 
template __global__ void kernel<double>(double *, double *); 

然后在另一个源文件

#ifdef MY_USE_DOUBLE_PRECISION 
typedef double Real; 
#else 
typedef float Real; 
#endif 

.... 

kernel<Real><<<griddim, blockdim>>>(....);