Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与opencl的累积和_Opencl_Pyopencl - Fatal编程技术网

与opencl的累积和

与opencl的累积和,opencl,pyopencl,Opencl,Pyopencl,我尝试使用opencl实现累积和,如下所示: __kernel void cumsum(__global float *a) { int gid = get_global_id(0); int n = get_global_size(0); for (int i = 1; i < n; i <<= 1) if (gid & i) a[gid] += a[(gid & -i) - 1]; } 但是

我尝试使用opencl实现累积和,如下所示:

__kernel void cumsum(__global float *a)
{
    int gid = get_global_id(0);
    int n = get_global_size(0);

    for (int i = 1; i < n; i <<= 1)
        if (gid & i)
            a[gid] += a[(gid & -i) - 1];
}

但是,前32个数字是正确的,之后是错误的(太低)。这与工作组的规模有关吗?如何修复此问题?

I变得足够大时,您将读取另一个工作组的输出。OpenCL执行模型中的任何内容都不能保证其他工作组将完成执行


通常情况并非如此,您将读取一个部分和,得到的值比最后预期的值要低。

谢谢。我相信这就是所谓的“扫描算法”?你知道一个好的教程吗?既然你使用的是PyOpenCL,你也许可以看看。@bogdan:谢谢,我确实找到了那个页面,但它不是最清晰的教程。我正在阅读规范PDF,它更完整,但不是最好的。这个答案是正确的。然而,我看到的问题发生在元素32上——比工作组规模(400)小得多。正如Eric所预测的,添加内存屏障导致问题发生在元件400处。
import pyopencl as cl
import pyopencl.array as cl_array
import numpy as np

a = np.random.rand(50000).astype(np.float32)

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

a_dev = cl_array.to_device(queue, a)

with open("imm/cluster.cl", 'r') as f:
    prg = cl.Program(ctx, f.read()).build()

prg.cumsum(queue, a.shape, None, a_dev.data)
print(np.cumsum(a)[:33], a_dev[:33])