collide函数的循环中一个奇怪的错误
-
上面是collide函数的一个循环,这个循环我放在从核中运行。这个循环奇怪的地方是如果我将中间结果保存在临时变量中,结果就会报错。如上图所示,example1是正确的结果,example2和example3是错误的结果,错误的原因是用cc变量保存了一部分计算结果。下图是example3的err.log文件。
请问这种情况是什么原因造成的,是编译器优化选项造成的吗?应该如何解决这个问题?
-
有几个点的误差怎么那么大,10.72,32.17...
-
@桑薇 交换运算顺序有可能影响精度吗
-
@桑薇
然后这是我用自动向量化做的一些结果,也是这种错误,不用自动向量化结果是正确的
我怀疑交换运算顺序会影响精度
-
自动向量化这个工具这么凉,你居然还尝试,勇气可嘉。另外这个核心kernel上从核不会出现精度差异大的问题。所以如果结果错,你就要怀疑怀疑自己的代码是不是有问题了。
-
@Tashkent 交换计算顺序是会影响精度,但是影响是不大的,不会出现你发的这种问题。
-
我找到原因了,我把双精度浮点数赋值给单精度导致精度出现损失。
话说这个程序本来就写得不好吧,单精度和双精度的浮点数放在一起混合运算。
如果不区分单精度和双精度,别说自动向量化了,手动向量化都会出问题
-
@Tashkent 这个程序是单精度的应用。我们的赛题是经过大量验证,且不存在不能向量化的问题。
-
@popo 举个例子,以上面Real cc = 1.5 * tmp_u为例。C语言默认实型常量1.5是双精度(如果要定义成单精度要写成1.5f),tmp_u是单精度。双精度乘单精度C语言会将其自动转换成双精度(参考https://blog.csdn.net/cherish_2012/article/details/21243047),然后我把双精度的1.5 * tmp_u赋值给单精度的cc导致结果出错。
把我上面所说的推广一下,你们的程序在collide函数中有很多运算是双精度与单精度混合运算。
我没有说不存在不能向量化,我目前做向量化的时候碰到了精度损失的现象,上面是我找到的原因。
-
@tashkent 同学你好,我现在碰到的问题和你这个很像,也是在做向量化优化时候产生的错误,想请问同学你是怎么解决的这个问题?