2013-05-05 356 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>>>(....);