[求助] 用opencl在GPU上的float运算和CPU上的float计算

moon8150 2013-12-09 06:17:14
用opencl在GPU上的float运算和CPU上的float计算,结果精度相差很大,整数就没问题,是少设置了什么还是怎么回事?
...全文
2368 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcwyylcwyy 2014-02-18
  • 打赏
  • 举报
回复
另外,编程方面也应该注意一下,尽量用相近的数相加吧,大加大,小加小。
menzi11 2014-02-11
  • 打赏
  • 举报
回复
为了速度,GPU计算ieee标准浮点数会将非规格浮点数认为是0.而CPU默认不是.
outstander 2013-12-12
  • 打赏
  • 举报
回复
虽然GPU浮点运算,CPU的SSE浮点运算以及CPU普通CPU浮点运算这三类指令都以IEEE754标准存储float变量,但它们实现浮点运算的加减乘除的方式是不一样的,这就导致了前两者与CPU普通浮点运算精度不一致 将GPU的运算结果和CPU的SSE指令相对比,精度会是一样的。它们在硬件上实现是类似,GPU和SSE的设计更加低功耗和快速。 请参考:http://developer.download.nvidia.com/assets/cuda/files/NVIDIA-CUDA-Floating-Point.pdf
fronteer 2013-12-10
  • 打赏
  • 举报
回复
这个问题以前也有人提出,我们也很感兴趣,我建议将问题细化一下: 1) 不用 Runtime 函数的情况,如在kernel上做两个float类型数的除法,看 CPU 和 GPU 设备上的结果有多大差距. 这种情况,结果只和编译器有关。在GPU上应该没太多可选择的,在CPU上编译器可选择用x387或SSE指令集作浮点运算, 我记得在CPU上,如果是64位Binary, 编译器会用SSE指令集做浮点运算;如果是32位Binary,则编译器保留用x387做浮点 运算,若要用SSE做浮点运算,需手工用 enable-sse的选项. SSE和x387所能达到的精度是不一样的,因为x387有80位寄存器,SSE只是64位寄存器. SSE的优势是和通用寄存器之间传数据更方便. 2) 如果用了Runtime 函数,则问题更复杂,因为我们目前没有文档知道在 kernel 中是如何使用外部函数的。 不象在 CPU 上用一般C语言写的程序中,我们很容易将一个.dll或.so库中的代码通过反汇编,来确定其函数用的具体的指令集. 这种情况我建议先定位是那个 Runtime 函数导致的精度差别. 如是 sqrt(), sin() 或 exp(),还是所有这些函数都或多或少都会导致精度问题。以后我们获得了更多的关于GPU上ALU及指令集的资料及Runtime的实现方式,也许能作出解释 3)另外,你的 OpenCL 浮点代码在 CPU 设备上运行的结果,和用 CPU上 native-C 写的代码的结果,有差别吗?

608

社区成员

发帖
与我相关
我的任务
社区描述
异构开发技术
社区管理员
  • OpenCL和异构编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧