如何在CUDA中轻松切换单精度和双精度?

时间:2013-05-05 09:43:44

标签: c cuda gpgpu precision

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

#define PRECISION double
...

thrust::device_vector<PRECISION> myVec;

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

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

1 个答案:

答案 0 :(得分:8)

你可以这样做:

#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 ie。 :

__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>>>(....);