cuda:cpu和gpu之间的不同答案减少了

时间:2013-09-24 12:28:03

标签: cuda thrust

我得到了这个非常奇怪的错误。我使用推力减少对矩阵中的所有元素进行了总结。它适用于大多数数据,但在一组中出错了。

代码:

  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

我也尝试过不构建thrust :: device_vector,而是使用原始指针代替。相同的输出。我也尝试过cublas dot产品。相同的输出。

我使用matlab确认上面的cpu结果是否正确。

发生什么事了?这是GPU的下溢吗?谢谢!

1 个答案:

答案 0 :(得分:3)

我只能推测可能出现的问题,但我认为这是一个下溢(或者具体地说,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进行编译。

检查这个问题: Why does changing 0.1f to 0 slow down performance by 10x?