opencl的累积总和

时间:2013-09-02 02:56:13

标签: 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];
}

我使用pyopencl调用了这段代码:

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])

然而,前32个数字是正确的,之后它们是错的(太低)。这与工作组规模有关吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

i 变得足够大时,您将读取另一个工作组的输出。 OpenCL执行模型中没有任何内容可以保证其他工作组已经完成执行。

一般情况下情况并非如此,你会读到一部分金额,结果的价值低于预期。

相关问题