【问题标题】:Computing the mean of a 2D array CUDA计算二维数组 CUDA 的平均值
【发布时间】:2017-01-04 23:16:54
【问题描述】:

我需要使用 CUDA 计算二维数组的平均值,但我不知道如何进行。我首先进行列缩减,然后对结果数组求和,最后一步计算均值。

为此,我需要同时在设备上完成所有工作吗?或者我只是一步一步做,每一步都需要在 CPU 和 GPU 之间来回切换。

【问题讨论】:

    标签: cuda gpu gpgpu


    【解决方案1】:

    如果它是二维数组中所有元素的简单算术平均值,则可以使用推力:

    int* data;
    int num;
    get_data_from_library( &data, &num );
    
    thrust::device_vector< int > iVec(data, data+num);
    
    // transfer to device and compute sum
    int sum = thrust::reduce(iVec.begin(), iVec.end(), 0, thrust::plus<int>());
    double mean = sum/(double)num;
    

    如果您想编写自己的内核 - 请记住,二维数组本质上是一个一维数组,分为行大小的块并通过 SDK“并行缩减”示例:Whitepaper

    【讨论】:

    • 感谢@pSoLT 的回答,我真的是 CUDA 的新手,我从你的回答中了解到,已经有内核可以做到这一点?是的,它是优化的还是我可以做一个更好的内核?什么是更好的?使用这个或创建我自己的内核?提前谢谢你
    • 欢迎您@alae。有一个名为Thrust 的库,它基本上是一个基于STL 的CUDA 模板库。它允许您在一些典型问题中使用 CUDA,而无需付出太多努力(您可能已经注意到了)。 Thrust 算法非常理想,所以我怀疑您是否可以使用自己的内核在数组缩减方面取得更好的结果。不过,这将是一个很好的练习。
    • 非常感谢@pSoLT 的回答非常清晰和准确^^
    猜你喜欢
    • 2019-06-14
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多