1

我在 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);

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

4

1 回答 1

5

在第一个答案中复制数据的方式的一个问题是,您正在将数据分配给不存在的数组部分。每当> 1aux_data[stack_size*OBJ_SIZE + i]时都会溢出。stack_size

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

要确保的一件事是了解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);
于 2012-11-12T19:27:54.967 回答