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

Opencl 复制后本地内存和全局内存之间的值不同,opencl,gpu,Opencl,Gpu,我在GPU内核中工作,在将数据从全局内存复制到本地内存时遇到一些问题 这是我的内核函数: __kernel void nQueens( __global int * data, __global int * result, int board_size) 所以我想从全局int*数据复制到局部int辅助数据[OBJ_SIZE] 我尝试像普通阵列一样复制: for(int i = 0; i < OBJ_SIZE; ++i) { aux_data[stack_size*OBJ_SIZE

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

__kernel void nQueens( __global int * data, __global int * result, int board_size)
所以我想从全局int*数据复制到局部int辅助数据[OBJ_SIZE] 我尝试像普通阵列一样复制:

for(int i = 0; i < OBJ_SIZE; ++i)
{
    aux_data[stack_size*OBJ_SIZE + i] = data[index*OBJ_SIZE + i];
}
在这两种情况下,全局内存和本地内存的值都不同。
我不知道我做错了什么…

在第一个答案中,复制数据的方式有一个问题,就是将数据分配给数组中不存在的部分。每当堆栈大小>1时,辅助数据[堆栈大小*对象大小+i]将溢出

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

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

可能的解决办法1:


在第一个答案中,复制数据的方式存在一个问题,即将数据分配给数组中不存在的部分。每当堆栈大小>1时,辅助数据[堆栈大小*对象大小+i]将溢出

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

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

可能的解决办法1:


是的,很抱歉,我在索引本地/全局时遇到问题,所以我的内存重叠。现在我在处理寄存器。谢谢。是的,很抱歉,我的索引本地/全局有问题,所以我的内存重叠。现在我在处理寄存器。谢谢
event_t e = async_work_group_copy ( aux_data,   (data + (index*OBJ_SIZE)),  OBJ_SIZE, 0);
wait_group_events (1, e);
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);
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);