1

假设我有以下内核:

__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字节长的本地内存,我们可以说同样的话吗?

4

2 回答 2

3

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

barrier(CLK_LOCAL_MEM_FENCE);

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

于 2012-05-07T23:57:15.593 回答
3

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

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

于 2012-05-14T23:55:58.470 回答