이미지 처리에 CUDA 프로그램을 쓰고 있습니다. 세분화 오류 문제가 발생했으며 이유를 전혀 알 수 없습니다. 나는 아마 사소한 일을 그리워 할 것이지만, 자신을 바로 잡으려 고 노력한 후 나는 그것을 달릴 수 없었다.
내 하드웨어의 deviceQuery (GeForce310M 총 shmem : 16384, 블록 당 최대 스레드 수 : 512 및 최대 블록 흐림 521)에 따라 정확한 그리드, 블록 및 분쇄 메모리 값을 설정합니다 (적어도 그렇게 생각합니다). 여기 출력 나는 세그먼트 오류 전에 얻을 수있다 : 아래 Cuda의 세그먼트 오류
Cols and Rows:
256
384
total:98304 // rows*cols
Block Size:512
Grid Size:192
shared mem:2048
는 커널 코드
__global__ void reduce_min(float *minVar,float* d_logLuminance)
{
extern __shared__ float s_data[]; //shared memeory
unsigned int tId = threadIdx.x;
unsigned int global_id = blockIdx.x*blockDim.x + tId;
//Copy to shared mem
s_data[tId] = d_logLuminance[global_id];
__syncthreads();
for(unsigned int i = 1;i<blockDim.x;i*=2)
{
if(tId%(2*i) == 0)
{
s_data[tId] = min(s_data[tId],s_data[tId+i]);
}
__syncthreads();
}
if(tId == 0)
d_logLuminance[blockIdx.x] = s_data[0];
}
내가 미리 커널에게
size_t size = 512;
size_t sizeOfgrid = (numRows*numCols)/size;
const dim3 blockSize(size,1,1);
const dim3 gridSize(sizeOfgrid,1,1);
unsigned int sharedMem =(sizeof(float)*size); //Shared memory per block
printf("%s\n%d\n%d\n%s%d\n","Cols and Rows:",numCols,numRows,"total:",numRows*numCols);
printf("%s%d\n%s%d\n%s%d\n","Block Size:",size,"Grid Size:",sizeOfgrid,"shared mem:",sharedMem);
float* d_lum;
float* outData;
checkCudaErrors(cudaMalloc(&d_lum,sizeof(float)*numRows*numCols));
checkCudaErrors(cudaMemcpy(d_lum,d_logLuminance,sizeof(float)*numRows*numCols,cudaMemcpyDeviceToDevice));
checkCudaErrors(cudaMalloc(&outData,sizeof(float)*numRows*numCols));
reduce_min<<<gridSize,blockSize,sharedMem>>>(outData,d_lum);
cudaDeviceSynchronize();
checkCudaErrors(cudaGetLastError());
checkCudaErrors(cudaMemcpy(&min_logLum,outData,sizeof(float)*numRows*numCols,cudaMemcpyDeviceToHost));
감사를 호출 메모리를 할당하는 부분입니다 도움.
세그먼트 오류 * 항상 *는 호스트 코드에서옵니다. 커널은 호스트에서 segfault를 발생시킬 수 없습니다. 확실하게 호스트 코드에서 트레이스를 생성하여 어디에서 왔는지 알아낼 수 있습니까? – talonmies
아 .. 내 .. 내가 복사 할 메모리 크기를 잘못 설정 했어. 이제는 프로그램이 끝났지 만 이제는 값 대신에 _nan_을 얻었습니다 ... – Ufo
이 질문에 대한 답을 직접 찾았 으면 대답으로 추가하십시오. 나중에 당신은 당신 자신의 대답을 받아 들일 수 있고 답이없는 질문 목록에서 이것을 얻을 수있을 것입니다. – talonmies