Opencl 将全局数组的一部分复制到本地内存
我使用PyOpenCL让我的GPU在一个大数据集上做一些回归。现在GPU比CPU慢,可能是因为在每次增量期间(我想…)有一个循环需要访问全局内存。数据集太大,无法存储到本地内存中,但每个循环不需要整个数据集,因此我想将此数组的一部分复制到本地内存中。我的问题是:我如何做到这一点?在Python中,可以很容易地分割一部分,但我认为在OpenCL中不可能这样做 这是我正在使用的OpenCL代码,如果您发现任何潜在的优化,请大声说:Opencl 将全局数组的一部分复制到本地内存,opencl,pyopencl,Opencl,Pyopencl,我使用PyOpenCL让我的GPU在一个大数据集上做一些回归。现在GPU比CPU慢,可能是因为在每次增量期间(我想…)有一个循环需要访问全局内存。数据集太大,无法存储到本地内存中,但每个循环不需要整个数据集,因此我想将此数组的一部分复制到本地内存中。我的问题是:我如何做到这一点?在Python中,可以很容易地分割一部分,但我认为在OpenCL中不可能这样做 这是我正在使用的OpenCL代码,如果您发现任何潜在的优化,请大声说: __kernel void gpu_slope(__global d
__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;
}
\uuuu内核无效gpu斜率(\uuu全局双精度*数据、\uu全局双精度*时间、\uuu全局整数*赢\u结果、常数无符号整数N、常数无符号整数Nmax、常数双精度e、\uu全局双精度*结果){
__局部无符号整数n,长度,leftlim,rightlim,i;
__局部双sumx,sumy,x,y,xx,xy,invlen,a,b;
n=获取全局id(0);
leftlim=赢_结果[n*2];
rightlim=win_结果[n*2+1];
sumx=0;
sumy=0;
xy=0;
xx=0;
长度=rightlim-leftlim;
对于(i=leftlim;i,GPU计算中的主要(ish)点是尽可能多地利用硬件并行性。不要使用循环,而是为每个坐标启动一个具有不同线程的内核。然后,对不同的和使用(快速编码,但性能较慢的选项)或并行缩减
AMD在这个问题上也有自己的想法。(NVidia也有,但他们的想法是基于CUDA的…GPU计算的主要(ish)点是尽可能多地利用硬件并行性。与其使用循环,不如为每个坐标启动一个具有不同线程的内核。然后,使用(快速编码,但性能较慢的选项),或针对各种总和的并行缩减
AMD在这个问题上有自己的见解。(NVidia也有,但他们的将是基于CUDA的…您将在PyOpenCL的示例文件夹中找到复制到本地内存的示例:
我建议您阅读、运行和自定义其中几个示例以进行学习
我还推荐Udacity并行编程课程:这门课程将有助于巩固您对OpenCL基本概念的掌握。您将在PyOpenCL的示例文件夹中找到复制到本地内存的示例:
我建议您阅读、运行和自定义其中几个示例以进行学习
我还推荐Udacity并行编程课程:这门课程将有助于巩固您对OpenCL基本概念的掌握。感谢本教程,它对我的算法非常有用感谢本教程,它对我的算法非常有用感谢有用的链接感谢有用的链接感谢有用的链接