请问cuda里的三角函数精度

在做项目的时候遇到一个问题

是一个成像算法的相位补偿

利用cuda计算出来的结果图像有一条很明显的亮线

现在我们把问题定位在了一个地方,但是找不出问题

需要计算出的结果精度至少是double型的

ec = cos(M_PI * (ha + pp));
es = sin(M_PI * (ha + pp));

这里的ha,pp都是double型的,请问ec,es是什么类型的数据?

如果是单精度的怎么样才能在gpu里实现double型的,谢谢啦~

楼主您好,根据您的描述,ec和es需要定义为double, 并且得到的结果也是double的。
(请注意,double的sin和cos, 不被1.x/2.x/3.x硬件支持。这个结果将不是SFU计算的,而是纯软件级数展开计算的)。
(以及,一般为了和C保持一致,对float版本的参数/结果使用sinf和cosf函数(注意有f结尾))

关于您的第二个问题,如果您要求出一个float值的sin值或者cos值,为了防止可能存在的编译器自动识别优化为sinf/cosf, 以及可能存在的sin(float)这种C++的重载,我建议您如下使用:
float a = …;
double result = sin((double)a);

LZ您好,这两个函数是双精度的,其单精度版本是cosf()和sinf()。

ec和es是双精度还是单精度取决于您的定义。

详细的说明可见CUDA C Programming Guide Appendix.C

另外,如果您的设备不支持双精度计算,这些双精度函数会被映射为单精度版本。

请您检查一下,祝您编码顺利~

以及,如果您需要同时计算同一个参数的sin和cos值。那么推荐使用sincos函数。

该函数在很多硬件实现上同时得到sin和cos的值,以及,在很多软件实现上可以有效的利用2者的共同中间步骤,减少计算时间。

请注意在1.x/2.x/3.x硬件上,对double的正弦、余弦操作代价较高。

横扫斑竹果然细致,板凳学习中,请LZ参考。

祝LZ周末愉快~

哦哦~谢谢版主先生~这个貌似也是一个可优化点

会不会前面定义的M_PI这个pi常数是float型,然后把sin函数重载了呢?

现在不在实验室,等周一去实验室瞅瞅看看~~谢谢啦~

定位这个问题就定位了半个月。。。。:cry:

:loveliness:同谢谢版主,这么热心的版主,下次一定多多参与论坛讨论

为论坛尽一份力

不过我是cuda初学者,估计前期需要大家多多指导

这应该不至于。因为你后面还要乘以上2个double的和的。就算是,这个常数也会被转换为double,然后和后面括号里的2个double的和做乘法得到double的。