我正在使用 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 的新手,所以请多多包涵。谢谢!