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

fri*_*ter 1 opencl gpu-programming

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

__kernel void nQueens( __global int * data, __global int * result, int board_size)
Run Code Online (Sandbox Code Playgroud)

所以我想从__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];
}
Run Code Online (Sandbox Code Playgroud)

还有复制功能:

event_t e = async_work_group_copy ( aux_data,   (data + (index*OBJ_SIZE)),  OBJ_SIZE, 0);
wait_group_events (1, e);
Run Code Online (Sandbox Code Playgroud)

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

KLe*_*ee1 5

在第一个答案中复制数据的方法之一是您将数据分配给不存在的数组部分.aux_data[stack_size*OBJ_SIZE + i]只要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);
Run Code Online (Sandbox Code Playgroud)

可能的方案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);
Run Code Online (Sandbox Code Playgroud)