我收到了这个非常奇怪的错误。我使用推力缩减对矩阵中的所有元素求和。对于大多数数据来说,它运行得很好,但是在一组数据上却出错了。
码:
lbfgsfloatval_t sum(const DeviceVector& A){
thrust::device_ptr<lbfgsfloatval_t> ptr(A.getPtr());
thrust::device_vector<double> A_p(ptr, ptr + A.rows()*A.cols());
lbfgsfloatval_t sums = 0.0;
// reduce on host
for(int i = 0; i < A.rows()*A.cols();i++)
sums += A_p[i];
// reduce on device
lbfgsfloatval_t res = thrust::reduce(A_p.begin(), A_p.end());
cout << "cpu: " << sums << endl;
cout << "gpu: " << res << endl;
return res;
}
注意第二组出了错。
输出:
cpu: -568.691
gpu: -568.691
cpu: 3.4972e-14
gpu: 1.40998e-14
cpu: 0.234375
gpu: 0.234375
我还尝试过不构建推力:: device_vector,而是改用原始指针。输出相同。我也尝试了cublas dot产品。输出相同。
我使用matlab确认上述cpu结果正确。
发生了什么事?这是GPU上的下溢吗?谢谢!
我只能推测出可能出问题的地方,但我会认为这是下溢(或者具体地说,CPU和GPU处理IEEE-754非规范化数字的方式不同)
http://en.wikipedia.org/wiki/Denormal_number
基本上,CPU按照IEEE-754标准对其进行处理,尽管效率很低。
另一方面,GPU通常将它们等于0。我不知道是否有CUDA方式强制CPU也出于开发目的而刷新非规范化的数字(我主要使用OpenCL),但是C / C ++方式通常是
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
或者,在gcc中,使用进行编译-ffast-math
。
请检查以下SO问题:为什么将0.1f更改为0会使性能降低10倍?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句