gpt4 book ai didi

memory - 如何从全局内存到本地内存进行跨步复制?

转载 作者:行者123 更新时间:2023-12-01 01:07:22 26 4
gpt4 key购买 nike

我想将全局设备内存中的缓冲区中的一些数据复制到处理核心的本地内存中 - 但是,有一个转折。

我知道 async_work_group_copy ,而且它很好(或者更确切地说,它笨拙而烦人,但有效)。但是,我的数据不是连续的 - 它是跨步的,即我想要复制的每两个连续的 Y 字节之间可能有 X 字节。

显然我不会复制所有无用的数据 - 它甚至可能不适合我的本地内存。我可以做什么?我想避免编写实际的内核代码来进行复制,例如

threadId = get_local_id(0);
if (threadId < length) {
unsigned offset = threadId * stride;
localData[threadId] = globalData[offset];
}

最佳答案

您可以使用 async_work_group_strided_copy() OpenCL API 调用。

感谢@DarkZeros 的评论,这是pyopencl 中的一个小例子。让我们假设一个 RGB 图像的小条纹,像这样 4 x 1:

img = np.array([58, 83, 39, 157, 190, 199, 64, 61, 5, 214, 141, 6])

并且您想访问四个红色 channel ,即 [58 157 64 214] 你会这样做:
def test_asyc_copy_stride_to_local(self):
#Create context, queue, program first
....
#number of R channels
nb_of_el = 4
img = np.array([58, 83, 39, 157, 190, 199, 64, 61, 5, 214, 141, 6])
cl_input = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=img)
#buffer used to check if the copy is correct
cl_output = cl.Buffer(ctx, mf.WRITE_ONLY, size=nb_of_el * np.dtype('int32').itemsize)
lcl_buf = cl.LocalMemory(nb_of_el * np.dtype('int32').itemsize)
prog.asynCopyToLocalWithStride(queue, (nb_of_el,), None, cl_input, cl_output, lcl_buf)
result = np.zeros(nb_of_el, dtype=np.int32)
cl.enqueue_copy(queue, result, cl_output).wait()
print result

内核:
kernel void asynCopyToLocalWithStride(global int *in, global int *out, local int *localBuf){
const int idx = get_global_id(0);
localBuf[idx] = 0;
//copy 4 elements, the stride = 3 (RGB)
event_t ev = async_work_group_strided_copy(localBuf, in, 4, 3, 0);
wait_group_events (1, &ev);
out[idx] = localBuf[idx];
}

关于memory - 如何从全局内存到本地内存进行跨步复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17724836/

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