【问题标题】:Copy portion of global array to local memory将全局数组的一部分复制到本地内存
【发布时间】:2013-12-05 19:43:52
【问题描述】:

我正在使用 PyOpenCL 让我的 GPU 对大型数据集进行一些回归。现在GPU比CPU慢,可能是因为有一个循环需要在每次增量期间访问全局内存(我认为......)。数据集太大,无法存储到本地内存中,但是每个循环都不需要整个数据集,所以我想将这个数组的一部分复制到本地内存中。我的问题是:我该怎么做?在 Python 中可以轻松地切一部分,但我认为这在 OpenCL 中是不可能的。

这是我正在使用的 OpenCL 代码,如果您发现任何更多潜在的优化,请大喊:

__kernel void gpu_slope(__global double * data, __global double * time, __global int * win_results, const unsigned int N, const unsigned int Nmax, const double e, __global double * result) {
    __local unsigned int n, length, leftlim, rightlim, i;
    __local double sumx, sumy, x, y, xx, xy, invlen, a, b;

    n = get_global_id(0);

    leftlim = win_results[n*2];
    rightlim = win_results[n*2+1];

    sumx = 0;
    sumy = 0;
    xy = 0;
    xx = 0;
    length = rightlim - leftlim;

    for(i = leftlim; i <= rightlim; i++) {
        x = time[i];   /* I think this is fetched from global memory */
        y = data[i];
        sumx += x;
        sumy += y;
        xy += x*y;
        xx += x*x;
    }

    invlen = 1.0/length;
    a = xy-(sumx*sumy)*invlen;
    b = xx-(sumx*sumx)*invlen;
    result[n] = a/b;
}

我是 OpenCL 新手,请多多包涵。谢谢!

【问题讨论】:

    标签: opencl pyopencl


    【解决方案1】:

    GPU 计算的主要(ish)点是尝试尽可能多地利用硬件并行性。不要使用循环,而是为每个坐标启动一个具有不同线程的内核。然后,对各种总和使用atomic operations(快速编码但性能慢的选项)或并行归约。

    AMD 在这个主题上有A tutorial。 (NVidia 也是,但他们的将是基于 CUDA 的......)

    【讨论】:

    • 感谢您的教程,它将对我的算法非常有用
    【解决方案2】:

    您将在 PyOpenCL 的示例文件夹中找到复制到本地内存的示例:https://github.com/inducer/pyopencl/tree/master/examples 我建议您阅读、运行和自定义其中几个示例来学习。

    我还推荐 Udacity 并行编程课程:https://www.udacity.com/course/cs344 该课程将帮助您巩固对基本 OpenCL 概念的掌握。

    【讨论】:

    • 感谢您提供有用的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2012-08-28
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多