OpenCL双精度计算结果不一致,A卡不正确
最近把一个CPU计算代码翻译为OpenCL进行运行,已经调试并验证通过(使用GTX1060).
计算过程是一个按迭代过程,计算结果以残差(后一迭代步与前一迭代步直接的结果差值)方式呈现,残差变小的过程称为收敛过程;
计算环境VS2015,全部fp64,Kernel函数依次在同一命令队列中调用,基于event等待进行约束;
现象是:
1.使用CUDA 9.2(OpenCL1.2)在GTX1060上的运行,各迭代步结果与CPU串行运行基本一致(在小数点12后有细微偏差);
2.A卡具有Debug与Release的区别(仅改变VS的Debug与Release)
a)使用Debug直接运行,第3个迭代步就发散(计算结果nan),前面2步结果不正确且表现出随机性(多次运行结果均不一致);
b)使用Release运行,能够计算且不发散,但各迭代步的值和CPU/GTX1060有很大差别;
c)使得Debug调试,若对包含调用多个clEnqueueNDRangeKernel()的函数step over(逐过程)运行,结果出错,但是,如果进入该函数后,逐个运行clEnqueueNDRangeKernel()函数,结果又正确一致;
d)尝试更改AMD驱动版本,更换AMD显卡(2片r9 390,1片r9 280x),添加OpenCL编译选项(如-cl-std=CL1.2 -cl-opt-disable)等均没效果;
e)本身未启用乱序执行,怀疑有不按照流程执行,于是使用了clSetEventCallback设置回调函数监控时间,发现流程正确。
综上,尤其是那个逐个监控就正确,不看时就不正确,感觉是这个“薛定谔事件”极为不科学.