openCL中CPU和GPU处理的数据之间的差异

时间:2013-01-09 09:55:49

标签: matlab opencl mex

我有一些使用几个大型MEX函数的matlab代码,我想通过使用openCL加快速度(我使用openCL API用openCL代码替换部分MEX函数代码)。我已将一小部分代码翻译成openCL内核,我已经遇到了困难。

在GPU上执行后生成的矩阵的某些元素与调用原始MEX函数且误差小于0.01时生成的矩阵的相应元素不同。这会导致最终结果出现一个小错误,但我担心在翻译更多代码时错误会累积。

这可能与CPU和GPU上的计算精度有关。有谁知道如何确保相同的精度?我在Ubuntu 12.04上运行64位matlab R2012b。我使用的硬件是Intel Core2 Duo E4700和NVIDIA GeForce GT 520。

2 个答案:

答案 0 :(得分:3)

如果您已经修改了代码,使用CPU上的双精度(64位)fp数字到使用单精度,那么CPU和GPU上的结果之间的微小差异可以很容易地解释为由浮点精度的差异引起的GPU上的(32位)fp数字。

我不会将这种差异称为错误,而是在具有浮点数的计算机上进行算术运算。您在仅使用CPU的代码上获得的结果已经与理论上的“真实”结果不同。数值计算的许多技术在于在整个计算持续时间内保持理论计算和实际计算之间的差异足够小(无论这意味着什么)。现在需要比现在更多的时间和空间来扩展它,但是由于缺乏对浮点运算的理解而产生的惊喜是SO的一个丰富的问题​​来源。这些问题的一些答案非常有启发性。 This one应该让你开始。

如果您已经注意在CPU和GPU上使用相同的精度,那么您报告的差异可以通过浮点运算的非可交换性来解释:在浮点运算中,不能保证{{1 }}。操作顺序很重要;如果你有任何SIMD,我敢打赌,这两个实现的操作顺序并不相同。即使你没有,你做了什么来确保GPU和CPU上的操作顺序相同?

关于你应该怎么做,这取决于你。您可以(虽然我个人不推荐)编写您自己的例程,以便在GPU上进行双精度f-p算法。如果你选择这样做,期望挥手告别GPU所承诺的大部分加速。

更好的做法是确保您的单精度软件为您的目的提供足够的准确性。例如,在世界上,我在环境中进行的原始测量通常不准确到大约3个有效数字,因此我们的代码产生的任何结果在大约3 s-f之后都没有效果。所以,如果我能够将错误保持在第5和更低的s-fs中就足够了。

不幸的是,从您的角度来看,通过使用(a+b)+c == a+(b+c)全局替换double并重新编译,无法保证从单精度计算中获得足够的准确性,您可能(通常会)需要实现不同的算法,这些算法需要更多的时间来保证更高的准确性,并且在计算进行时不会漂移太多。同样,你将失去GPU承诺的一些速度优势。

答案 1 :(得分:2)

一个常见的问题是,浮点值保存在80位CPU寄存器中,而不是每次都被截断和存储。在这些情况下,额外的精度会导致偏差。因此,您可以检查您的编译器提供哪些选项来解决此类问题。查看发布和调试版本的差异也很有趣。