2013-07-31 2 views
0

이미지 처리에 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)); 

감사를 호출 메모리를 할당하는 부분입니다 도움.

+3

세그먼트 오류 * 항상 *는 호스트 코드에서옵니다. 커널은 호스트에서 segfault를 발생시킬 수 없습니다. 확실하게 호스트 코드에서 트레이스를 생성하여 어디에서 왔는지 알아낼 수 있습니까? – talonmies

+0

아 .. 내 .. 내가 복사 할 메모리 크기를 잘못 설정 했어. 이제는 프로그램이 끝났지 만 이제는 값 대신에 _nan_을 얻었습니다 ... – Ufo

+0

이 질문에 대한 답을 직접 찾았 으면 대답으로 추가하십시오. 나중에 당신은 당신 자신의 대답을 받아 들일 수 있고 답이없는 질문 목록에서 이것을 얻을 수있을 것입니다. – talonmies

답변

1

checkCudaErrors(cudaMemcpy(&min_logLum,outData,sizeof(float)*numRows*numCols,cudaMemcpyDeviceToHost)); min_logLum은 플로트 아닌 플로트 * 사이즈numRows의 * NUMCOLS 것을 제가 언급 fogrot beacause를이 함수 세그먼트 오류를 ​​생성 하였다 (및 I 코드를 작성했을 때 그것을 누락). 그래서 결국에는 할당 된 훨씬 많은 메모리를 복사하려고했습니다.