0

画像のノイズ除去のコードを書いているのですが、処理された画像に縞模様があるという奇妙な問題に遭遇しました。基本的に、画像の X 勾配を計算すると、横縞が表示されます (または Y 方向の縦縞) Lena X gradientアルゴリズム全体が正常に動作し、迷惑なストライプLena resultを除いて、正しい答えが得られているようです (C のプログラムと比較しています) 。

ストライプ間の距離は、ブロック サイズが異なると変化します。また、プログラムを実行するたびにストライプの位置が異なります。これは、勾配計算に関連するプログラムの部分です。私はとてもばかげたことをしているような気がします:)ありがとう!

 #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;
  }
}
}
}
4

1 に答える 1

1

A の要素は、使用される前に上書きされる場合と上書きされない場合があるため、カーネル内で競合状態が発生します。

入力と出力に異なる配列を使用します。

于 2013-03-15T15:28:44.260 に答える