我正在尝试使用 pyOpenCL
填充一个二维数组。下面是计算内核及其调用:
ctx = cl.Context([cl.get_platforms()[0].get_devices()[0]])
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
x_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=x)
y_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=y)
a_buf = cl.Buffer(ctx, mf.WRITE_ONLY, a.nbytes)
prg = cl.Program(ctx, """
//#define PYOPENCL_DEFINE_CDOUBLE
#include "pyopencl-complex.h"
__kernel void makeA(const unsigned int ySize, const float cov,
const int x0, const int y0, __global const float *x, __global const float *y,
__global cfloat_t *a)
{
int gid0 = get_global_id(0);
int gid1 = get_global_id(1);
a[gid1 + ySize*gid0] = (cfloat_t)(1, 0);
}
""").build()
prg.makeA(queue, a.shape, None, np.int32(ySize),
np.float32(c), np.int32(x0), np.int32(y0), x_buf, y_buf, a_dest_buf)
cl.enqueue_copy(queue, a, a_dest_buf)
现在,这似乎运行良好。今天我学到了使用
工作组
非常有用。但是,我无法使其正常工作。我已经尝试通过替换函数调用来解决问题。prg.makeA(queue, a.shape, (16,16), np.int32(ySize),
np.float32(c), np.int32(x0), np.int32(y0), x_buf, y_buf, a_dest_buf)
但我不知道如何正确计算数组的新x和y索引,因此无法更改。
a[yIdx + ySize*xIdx] = (cfloat)( x[xIdx] , 0);