2013-03-15 21 views
0

我正在爲圖像去噪編寫代碼,並遇到了處理圖像中條紋的奇怪問題。基本上,當我計算圖像的X梯度時,出現水平條紋(或垂直於Y方向)Lena X gradient。 整個算法工作正常,它看起來像我得到正確的答案(我與C程序進行比較),除了那些令人討厭的條紋Lena result使用CUDA計算圖像漸變時的條紋

條紋之間的距離隨着不同的塊大小而變化。每次我運行程序時,我也有不同的條紋位置!這是與梯度計算相關的程序的一部分。我有一種感覺,我正在做一件非常愚蠢的事情:)謝謝!

#define BLKXSIZE 16 
#define BLKYSIZE 16 
#define idivup(a, b) (((a)%(b) != 0) ? (a)/(b)+1 : (a)/(b)) 
void Diff4th_GPU(float* A, float* B, int N, int M, int Z, float sigma, int iter, float tau, int       type) 
{ 
    float *Ad; 

dim3 dimBlock(BLKXSIZE,BLKYSIZE); 
dim3 dimGrid(idivup(N,BLKXSIZE), idivup(M,BLKYSIZE)); 

cudaMalloc((void**)&Ad,N*M*sizeof(float));   


cudaMemcpy(Ad,A,N*M*sizeof(float),cudaMemcpyHostToDevice); 

cudaCheckErrors("cc1"); 
int n = 1; 
while (n <= iter) { 
    Diff4th2D<<<dimGrid,dimBlock>>>(Ad, N, M, sigma, iter, tau, type); 
    n++; 
    cudaDeviceSynchronize(); 
    cudaCheckErrors("kernel");} 

cudaMemcpy(B,Ad,N*M*sizeof(float),cudaMemcpyDeviceToHost); 
cudaCheckErrors("cc2"); 
cudaFree(Ad); 
} 

    __global__ void Diff4th2D(float* A, int N, int M, float sigma, int iter, float tau, int type) 
{ 

float gradX, gradX_sq, gradY, gradY_sq, gradXX, gradYY, gradXY, sq_sum, xy_2, Lam, V_norm, V_orth, c, c_sq, lam_t; 


int i = blockIdx.x*blockDim.x + threadIdx.x; 
int j = blockIdx.y*blockDim.y + threadIdx.y; 

int index = j + i*N; 

if ((i < N) && (j < M)) 
    { 
    float gradX = 0, gradY = 0, gradXX = 0, gradYY = 0, gradXY = 0; 

    if ((i>1) && (i<N)) { 
     if ((j>1) && (j<M)){ 
    int indexN = (j)+(i-1)*(N); 
    if (indexN > ((N*M)-1)) indexN = (N*M)-1; 
    if (indexN < 0) indexN = 0; 
    int indexS = (j)+(i+1)*(N); 
    if (indexS > ((N*M)-1)) indexS = (N*M)-1; 
    if (indexS < 0) indexS = 0; 
    int indexW = (j-1)+(i)*(N); 
    if (indexW > ((N*M)-1)) indexW = (N*M)-1; 
    if (indexW < 0) indexW = 0; 
    int indexE = (j+1)+(i)*(N);   
    if (indexE > ((N*M)-1)) indexE = (N*M)-1; 
    if (indexE < 0) indexE = 0; 

    gradX = 0.5*(A[indexN]-A[indexS]); 
    A[index] = gradX; 
    } 
} 
} 
} 

回答

1

在內核中有一個競爭條件,因爲A的元素在使用之前可能會被覆蓋,也可能不會被覆蓋。

使用不同的數組進行輸入和輸出。

+0

非常感謝,它做到了!看起來應該重新考慮CPU編程習慣:) – Daniel 2013-03-15 15:40:49