调试开发和调试时,我想以 double 运行我的代码。但是,一旦我知道它正在工作,我希望可以选择仅使用单精度(即 float
s)运行我的代码。所以我希望能够在不大量重写代码的情况下轻松地在这些精度之间切换。我在想一些 #define
标志,比如
#define PRECISION double
...
thrust::device_vector<PRECISION> myVec;
但编译器似乎不喜欢那样。关于如何实现这个的任何想法?
我知道this question非常相似,因为它解决了编译器标志的问题。但我希望能够直接从我的源代码中直接设置一个标志。
最佳答案
你可以这样做:
#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
即。 :
__global__ void kernel (Real *input, Real *output)
{
...
}
如果您希望同时编译内核代码的单精度和 double 版本,并选择在定义它们的编译单元之外(例如,在库中)使用哪一个,你可以模板化内核:
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>>>(....);
关于c - 如何在 CUDA 中轻松切换单精度和 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383260/