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

标签 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 下溢吗?谢谢!

最佳答案

我只能推测可能会出现问题,但我认为这是下溢(或者具体来说,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?

关于cuda:cpu和gpu之间的不同答案减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18981633/

相关文章:

frameworks - CUDA 和 OpenCL 之前的 GPGPU

cuda - CUDA 全局内存交易的成本

c++ - 谁可以从mark的文档中给我这个代码的主程序?

cuda - ABI如何定义GPU中的寄存器数量?

使用 Thrust CUDA 对对象进行排序

sorting - 使用 CUDA Thrust 同时对多个数组进行排序

c - cuda 上的 vector 加法未计算某些元素

c++ - 推力位移 vector

cuda - 无法为 thrust::cuda min_element() 函数构建比较谓词

c++ - cuda推力中的多项替换