1

GPUカーネルで作業していますが、グローバルメモリからローカルメモリにデータをコピーする際に問題が発生します。カーネル関数は次のとおりです。

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

__globalint*データから__localintaux_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

最初の回答でデータをコピーする方法の問題の 1 つは、存在しない配列の部分にデータを割り当てていることです。> 1 のaux_data[stack_size*OBJ_SIZE + i]場合はいつでもオーバーフローします。stack_size

答え 2 の問題は、単一のイベントだけでなく、一連のイベントを渡す必要があることかもしれません。

index確認すべきことの 1 つは、何を参照しているのかを理解することです。私のソリューションでは、スレッド 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 に答える