cudaで2次元配列を作成して初期化しようとしていますが、惨めに失敗しています。これが私の初期化カーネルです:
__global__ void initMap(float* map, size_t pitch, int w, int h, int numX, int numY){
int idx=blockIdx.x*blockDim.x+threadIdx.x;
int idy=blockIdx.y*blockDim.y;
int i;
int j;
for (i=0; i<numX; i++){
for (j=0; j<numY; j++){
int idMC=idx+i;
int idMR=threadIdx.y+j;
if(idMC<w && idy+idMR<h){
float* row=(float*)(map+idy+idMR*pitch);
row[idMC]=0.5;
}
}
}
__syncthreads();
}
そして、配列を割り当て、メインで初期化カーネルを呼び出す方法は次のとおりです。
int width=map_size;
int height=map_size;
float* map;
size_t pitch;
checkCudaErrors(cudaMallocPitch(&map, &pitch, width*sizeof(float), height));
int numT=32;
int numBX=(int)ceil((float)width/numT);
int numBY=(int)ceil((float)height/numT);
dim3 numBlocks(numBX, numBY);
dim3 numThr(numT, numT);
initMap <<<numBlocks, numThr>>> (map, pitch/sizeof(float), width, height, 1, 1);
cudaError_t err=cudaGetLastError();
if (err != cudaSuccess)
printf("Error: %s\n", cudaGetErrorString(err));
checkCudaErrors(cudaDeviceSynchronize());
基本的に、私がやろうとしているのは、2D 配列を 32x32 のチャンクに分割し、それらのそれぞれをブロックに割り当てて、それを 0.5 で埋めることです。ただし、配列をディスクに書き込もうとしたり、別のカーネルからその要素にアクセスしようとしたりすると、そこに多くの QNAN があることがわかります。そのため、配列全体を埋めているのではなく、いくつかのスポットを見逃していると思います。