在做项目的时候遇到一个问题
是一个成像算法的相位补偿
利用cuda计算出来的结果图像有一条很明显的亮线
现在我们把问题定位在了一个地方,但是找不出问题
需要计算出的结果精度至少是double型的
ec = cos(M_PI * (ha + pp));
es = sin(M_PI * (ha + pp));
这里的ha,pp都是double型的,请问ec,es是什么类型的数据?
如果是单精度的怎么样才能在gpu里实现double型的,谢谢啦~
在做项目的时候遇到一个问题
是一个成像算法的相位补偿
利用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函数重载了呢?
现在不在实验室,等周一去实验室瞅瞅看看~~谢谢啦~
定位这个问题就定位了半个月。。。。
:loveliness:同谢谢版主,这么热心的版主,下次一定多多参与论坛讨论
为论坛尽一份力
不过我是cuda初学者,估计前期需要大家多多指导
这应该不至于。因为你后面还要乘以上2个double的和的。就算是,这个常数也会被转换为double,然后和后面括号里的2个double的和做乘法得到double的。