【问题标题】:Passing data from global memory to local memory in OpenCL kernel在 OpenCL 内核中将数据从全局内存传递到本地内存
【发布时间】:2012-05-07 13:21:05
【问题描述】:

假设我有以下内核:

__kernel void classify_data_points( __global float* data,
                                    __local float* datasegment)
{
    int gid0 = get_global_id(0);
    int lid = get_local_id(0);
    dataSegment[lid] = data[gid];
}

正如所见,我想将数据从全局内存中取出到本地内存中。本地内存的大小对于一次执行此操作是否重要?我的意思是,dataSegment 数组大小是 64 字节。然后,通过这一行'dataSegment [lid] = data [gid]',我可以假设整个64字节的内存空间都被从全局内存中获取的数据填充了吗?(全局内存中有足够的数据)或者512字节长的本地内存,我们可以说同样的话吗?

【问题讨论】:

    标签: opencl data-transfer


    【解决方案1】:

    在您的示例中,复制的内存量取决于工作组的大小,而不是数据段的大小。您不能假设将复制 64 字节的内存。

    如果您想将复制作为单个操作执行,请查看async_work_group_copy 函数。

    【讨论】:

    • 如果您的工作组不是多个数据,使用 async() 函数是最佳选择。它也适用于普通副本,因此无论如何都应该使用它。
    【解决方案2】:

    不,在写入本地内存的代码之后,您需要一个带有本地内存栅栏的屏障。像这样的:

    barrier(CLK_LOCAL_MEM_FENCE);
    

    只有这样才能确保您的工作组的本地内存已被完全复制。您还需要确保您的工作组有足够的工作项来初始化工作组的所有本地内存(在您的情况下为 dataSegment。)

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多