2

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

#define PRECISION double
...

thrust::device_vector<PRECISION> myVec;

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

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

4

1 回答 1

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即。:

__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>>>(....);
于 2013-05-05T10:47:24.047 回答