复制后本地和全局内存之间的值不同

时间:2012-11-12 18:48:58

标签: opencl gpu-programming

我正在使用GPU内核,我在将数据从全局内存复制到本地内存时遇到了一些问题 这是我的核心功能:

__kernel void nQueens( __global int * data, __global int * result, int board_size)

所以我想从 __ global int * data 复制到 __ local int aux_data [OBJ_SIZE] 我试图像普通数组一样复制:

for(int i = 0; i < OBJ_SIZE; ++i)
{
    aux_data[stack_size*OBJ_SIZE + i] = data[index*OBJ_SIZE + i];
}

以及复制功能:

event_t e = async_work_group_copy ( aux_data,   (data + (index*OBJ_SIZE)),  OBJ_SIZE, 0);
wait_group_events (1, e);

在这两种情况下,我在全局和本地内存之间获得不同的值。 我不知道我做错了什么......

1 个答案:

答案 0 :(得分:5)

在第一个答案中复制数据的方式之一是您将数据分配给不存在的数组部分。只要aux_data[stack_size*OBJ_SIZE + i]&gt; stack_size会溢出1。

答案二的问题可能是你需要传递一系列事件,而不仅仅是一个事件。

要确保一件事是要了解index指的是什么。我假设我的解决方案是指组ID而不是线程ID。如果它确实是线程ID,那么我们还有其他问题。

可能的解决方案1:

int gid = get_group_id(0);
int lid = get_local_id(0);
int l_s = get_local_id(0);
for(int i = lid; i < OBJ_SIZE; i += l_s)
{
    aux_data[i] = data[gid*OBJ_SIZE + i];
}
barrier(CLK_LOCAL_MEM_FENCE);

可能的解决方案2:

int gid = get_group_id(0);
event_t e = async_work_group_copy (aux_data, data + (gid*OBJ_SIZE), OBJ_SIZE, 0);
wait_group_events (1, &e);