在OpenCL内核中将数据从全局内存传递到本地内存

时间:2012-05-07 13:21:06

标签: opencl data-transfer

假设我有以下内核:

__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数组大小是64bytes。那么,通过这行'dataSegment [lid] = data [gid]',我可以假设整个64字节的内存空间是从全局内存中获取的数据填充的吗?(全局内存中有足够的数据)或512字节长的本地内存,我们能说同样的话吗?

2 个答案:

答案 0 :(得分:3)

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

barrier(CLK_LOCAL_MEM_FENCE);

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

答案 1 :(得分:3)

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

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