使用 opencl 添加数组时出现错误输出

I get wrong output when adding arrays with opencl

我试图用 pyopencl 对 2 个数组求和,但我在输出中得到了奇怪的数字。

代码:

def sum_arrays_with_cl(array1, array2):
"""
    Sums 2 arrays with GPU. 
"""
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
a_array = numpy.array(array1)
b_array = numpy.array(array2)
a_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_array)
b_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b_array)
dest_buf = cl.Buffer(ctx, mf.WRITE_ONLY, b_array.nbytes)
prg = cl.Program(ctx, """
__kernel void sum(__global const float *a,
__global const float *b, __global float *res_g)
{
  int gid = get_global_id(0);
  res_g[gid] = a[gid] + b[gid];
}
""").build()
prg.sum(queue, a_array.shape, None, a_buf, b_buf, dest_buf)
a_plus_b = numpy.empty_like(a_array)
cl.enqueue_copy(queue, a_plus_b, dest_buf).wait()
return list(a_plus_b)

a = [1 表示范围 (10) 内的虚拟对象] b = [i for i in range(10)]

打印sum_arrays_with_cl(a,b)

输出:

[0, 0, 0, 0, 0, 5, 6, 7, 8, 9]

我做错了什么?

您需要明确说明数组的类型,否则在主机上创建的数组将与设备期望的不匹配。由于您的内核需要 32 位浮点数据,因此您可以像这样创建数组:

a_array = numpy.array(array1).astype(numpy.float32)
b_array = numpy.array(array2).astype(numpy.float32)