gpt4 book ai didi

python - 用 pyopenCL 填充二维数组

转载 作者:行者123 更新时间:2023-11-28 18:43:47 25 4
gpt4 key购买 nike

我正在尝试使用 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)

现在,这似乎工作正常。今天我了解到,使用 workgroups 非常有用。这个,我无法正常工作。我试图用

替换函数调用
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);  

最佳答案

我现在尝试了以下方法,效果很好:

__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 xIdx = get_local_id(0)+get_group_id(0)*get_local_size(0);
int yIdx = get_local_id(1)+get_group_id(1)*get_local_size(1);

a[yIdx + ySize*xIdx] = (cfloat_t)(1, 0);
}
""").build()




prg.makeA(queue, a.shape, (32,32), np.int32(ySize),
np.float32(c), np.int32(x0), np.int32(y0), x_buf, y_buf, a_dest_buf)

由此我引入了一个大小为 32x32 的工作组 [函数调用参数:(32,32)]。看起来这现在使用了多个多流处理器。

关于python - 用 pyopenCL 填充二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22920162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com