c - 如何在 CUDA 中轻松切换单精度和 double ?

标签 c cuda gpgpu precision

调试开发和调试时,我想以 double 运行我的代码。但是,一旦我知道它正在工作,我希望可以选择仅使用单精度(即 floats)运行我的代码。所以我希望能够在不大量重写代码的情况下轻松地在这些精度之间切换。我在想一些 #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 代替 floatdouble 即。 :

__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/

相关文章:

c - 如何获取整个X509证书的大小

c - 为什么这个交换程序不能用 C 语言运行?

OpenCL:GPU 上的单一计算设备?

c++ - OpenCL 在 NVidia 硬件上生成 QNaN

c - 关于 wav 数据子 block

c - 查找给定数字的所有质因数

opencv - BruteForceMatcher_GPU匹配器错误

常量 for 循环产生错误的结果

parallel-processing - CUDA内核如何启动?

c++ - cl::Program::Sources 在哪里定义的?