Memory 如何从全局内存快速复制到本地内存?

Memory 如何从全局内存快速复制到本地内存?,memory,opencl,gpgpu,memory-model,stride,Memory,Opencl,Gpgpu,Memory Model,Stride,我想将一些数据从全局设备内存中的缓冲区复制到处理核心的本地内存中——但是,有点曲折 我知道,这很好(或者更确切地说,这很烦人,但很有效)。但是,我的数据不是连续的-它是跨步的,即,我要复制的每两个连续Y字节之间可能有X字节 显然,我不会复制所有无用的数据,而且它甚至可能不适合我的本地内存。我能做些什么呢?我希望避免编写实际的内核代码来进行复制,例如 threadId = get_local_id(0); if (threadId < length) { unsigned offse

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

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

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

threadId = get_local_id(0);
if (threadId < length) {
    unsigned offset = threadId * stride;
    localData[threadId] = globalData[offset];
}
threadId=get\u local\u id(0);
if(螺纹ID<长度){
无符号偏移量=线程ID*步幅;
localData[threadId]=globalData[offset];
}
您可以使用OpenCLAPI调用

由于@DarkZeros的评论,这里是pyopencl中的一个小例子。让我们假设一个小条纹的RGB图像,如4乘1所示:

img = np.array([58, 83, 39, 157, 190, 199, 64, 61, 5, 214, 141, 6])
您想要访问四个红色通道,即[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];
}

@DarkZeros更新了一个示例谢谢,像你这样的详细示例在函数的官方文档中丢失了。@Andreasniedermir:一个有效的评论,但我在3年前已经问过这个问题了。