2013-07-31 63 views
0

我正在編寫CUDA程序來處理圖像。我遇到了分段錯誤問題,我完全不知道爲什麼。我可能只是想念一些小事,但經過幾個小時的努力糾正自己,我無法讓它運行。
根據我硬件上的deviceQuery(GeForce310M總shmem:16384,每塊最大線程數:512和最大塊dim 521),我設置了正確的網格,塊和碎片內存值(至少我是這麼認爲的)。 下面是輸出I段故障之前得到: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

分段錯誤*總是*來自主機代碼。您的內核不能在主機上導致段錯誤。當然,您可以在您的主機代碼中生成跟蹤以確定它來自哪裏? – talonmies

+0

哦,我的..我發現我在哪裏設置錯誤的內存大小複製。現在程序完成工作,但我現在得到_nan_而不是價值... – Ufo

+0

如果你自己找到了這個問題的答案,請添加它作爲答案。稍後,您將能夠接受您自己的答案,並從未回答的問題列表中獲得此答案。 – talonmies

回答

1

checkCudaErrors(cudaMemcpy(&min_logLum,outData,sizeof(float)*numRows*numCols,cudaMemcpyDeviceToHost));此函數,產生一個分段錯誤,東陽我fogrot提(我錯過了它,當我在寫代碼)min_logLum是浮子,而不是一個浮子*大小的numRows行*數numCols。所以最後我試圖複製更多已分配的內存。