在调试开发和调试时,我想以双精度运行我的代码。但是,一旦我知道它正在工作,我想选择使用单精度(即float
s)运行我的代码。因此,我希望能够轻松地在这些精度之间切换而无需大量重写代码。我在考虑一些#define
标志,如
#define PRECISION double
...
thrust::device_vector<PRECISION> myVec;
但编译器似乎不喜欢这样。关于如何实现这个的任何想法?
我知道this question非常相似,因为它解决了编译器标志的问题。但我希望能够直接在我的源代码中直接设置标志。
答案 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
代替float
或double
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>>>(....);