私のcudaカーネルは、ブロック実行の最後にホストに供給されるものを生成します。
スケルトンは次のとおりです。
データが書き込まれる host_data は、ホスト マップド メモリとして割り当てられます。
host_data_count は、生成されたデータの数を示すマップされたメモリでもあります。
私が使用している GPU は、Fermi アーキテクチャと CC 2.0 を備えた GTX 580 です。
__global__ void kernel(host_data, host_data_count)
{
__shared__ int shd_data[1024];
__shared__ int shd_cnt;
int i;
if (threadIdx.x == 0)
shd_cnt = 0;
__syncthreads();
while ( ... )
{
if (something happens)
{
i = atomicAdd(&shd_cnt, 1);
shd_data[i] = d;
}
}
__syncthreads();
if (threadIdx.x == 0)
{
i = atomicAdd(host_data_count, shd_cnt);
memcpy(&host_data[i], shd_data, shd_cnt * 4);
}
}
このカーネル コードには何が欠けていますか?
誰でも助けることができますか?