2016-08-17 3 views
-1

でIはクーダ(C)は、この機能を持って:はクーダ

__global__ void FUN1(float *data,int M){ 

    int I=blockIdx.x * blockDim.x + threadIdx.x; 
    int J=blockIdx.y * blockDim.y + threadIdx.y;int k; 
    int index=I+J*M; 

    if((J<N)&&(I<N)){ 
     Arr2[index]=Arr1[index]; 
     for(k=0;k<M;k++){ 
      if(Arr2[index]>(Arr2[I+M*k] + Arr2[k+M*J])){ 
       Arr2[index]=Arr2[I+M*k] + Arr2[k+M*J]; 
      } 
     } 
    } 
} 

は、いくつかの大きな整数、Mのために、主からの呼び出し、およびアレイ(平坦なバージョンで2D)データ[M]所与 は次のとおりです。

FUN1<<<dimGrid,dimBlock>>>(Array1,M); 

グリッドは長方形です。

私の関数は良い反応を示し、APSP(ALL SHORTEST PATH)の問題を実装しています。しかし、私は共有メモリでこれを実装しようとすると、私は積み重なって、期待通りに私の結果の半分を得て、残りの半分のゴミ。

これは、共有メモリを使用するための私の試みです:

__global__ void fmDistC(float *Arr1,float *Arr2,int N){ 

    unsigned int k,m;int bx=blockIdx.x;int by=blockIdx.y; 
    int tx=threadIdx.y;int ty=threadIdx.y; 

    int I=bx*blockDim.x + tx; 
    int J=by*blockDim.y + ty; 
    int index=J+I*N; 

    __shared__ float sArr[2*BLOCKSIZE]; 

    if((I<N)&&(J<N)){ 
     float con=0.0f; 
     for(m=0;m<(gridDim.y);m++){ 
      Arr2[index]=Arr1[index]; 
      sArr[tx+ty]=Arr2[I*N+(m*by)+ty]; 
      sArr[tx+ty]=Arr2[J+N*(m*bx+tx)]; 
      __syncthreads(); 

      for(k=0;k<bx;k++){ 
       if(Arr2[index]>(sArr[k+tx]+sArr[ty+k])) 
        con=sArr[k+tx]+sArr[ty+k]; 
        __syncthreads(); 
      } 
     } 
     Arr2[index]=con; 
    } 
} 

は、誰かが私に私が「正しい」やり方に行くことができる方法についての方向性を与えることはできますか?あなたはこれがインデックスの問題を説明することができる代わりにthreadIdx.x

のthreadIdx.yにごTX変数を設定している。このライン int tx=threadIdx.y;int ty=threadIdx.y; に予め

+1

あなたが提供している共有メモリコードはコンパイルされないため、実行しているものではありません。あなたの 'index'の計算は' BLOCKSIZE'をほぼ確実に超過していますので、 'sdata [index] = ...'で共有メモリを読み込もうとするとすぐに範囲外のインデックスになります。デバッグのヘルプを求める質問は、[mcve]を提供する必要があります。 –

+0

@RobertCrovellaあなたが正しいです。私はコードを編集するだけです。私はただ今働いています。完全にコンパイルできます。私は、何かが間違っていると思っていますsArr [tx + ty] = Arr [....] – alphjheon

+0

CUDAは**ではありません** [タグ:C]! – Olaf

答えて

関連する問題