나는 cuda에서 2 차원 어레이를 생성하고 초기화하려고 시도하지만 비참하게 실패하고 있습니다. 여기 내 초기화 커널의 :cudaMallocPitch로 할당 된 메모리에 액세스
__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());
을, 나는 2 차원 배열을 분할 할 일은 노력하고있어 32x32 청크로 변환하고 각각을 0.5로 채울 블록에 지정합니다. 그러나 배열을 디스크에 쓰거나 다른 커널에서 요소에 액세스하려고하면 많은 QNAN이 있다는 것을 알 수 있습니다. 그래서 전체 배열을 채우지 않고 일부 스팟이 누락 된 것 같습니다. 이 같은
nevermind, 초기화 할 때 idy + idMR 주위에 대괄호를 넣는 것을 잊어 버렸습니다. – Orgrim
여전히 올바르지 않습니다. 작동하는 동안 우연히 만 작동합니다. 피치가 할당 워드 크기의 라운드 배수라는 보장은 없습니다. cudaMallocPitch에 대한 문서에는 커널 코드의 정확한 피치 사용이 포함되어 있습니다. – talonmies
그것은 (char *)로 캐스트 된 것입니다. 맞습니까? 나는 그곳에서 무엇이 행해졌는지에 관해서는 분명히 밝혀지지 않았기 때문에 그것을 사용하지 않았습니다. 나 한테 설명해 줄래? 감사! – Orgrim