2016-08-17 3 views
-1

habe ich diese Funktion in Cuda (C):Verwendung von Shared Memory in Cuda

__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]; 
      } 
     } 
    } 
} 

von Haupt Aufruf, für einige große ganze Zahl, M, und ein Array (2d in flache Ausführung) [M] gegeben wie folgt aus:

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

Gitter rechteckig ist.

Meine Funktion reagiert gut und implementiert das APSP (ALL SHORTEST PATH) -Problem. Allerdings, wenn ich versuche, dies mit Shared Memory zu implementieren, wurde ich gestapelt und bekomme die Hälfte meiner Ergebnisse, wie ich erwartet hatte, und die andere Hälfte Müll.

Dies ist mein Versuch für Shared-Memory:

__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; 
    } 
} 

Kann mir jemand eine Richtung auf, wie kann ich auf den „richtigen“ Weg zu gehen? Vielen Dank im Voraus

+1

Der von Ihnen bereitgestellte Code für den gemeinsamen Speicher wird nicht kompiliert, daher ist es nicht das, was Sie ausführen. Ihre 'Index'-Berechnung überschreitet fast sicher" BLOCKSIZE ", also würden Sie sofort außerhalb der Grenzen indexieren, wenn Sie versuchen, Shared Memory unter' sdata [index] = ... 'zu laden. Fragen, die nach Debugging-Hilfe fragen, sollten ein [mcve] bereitstellen. –

+0

@RobertCrovella du hast Recht.Ich redigiere nur meinen Code.Mit dem einen, ich arbeite gerade jetzt.Ist voll compilable.Ich vermute, dass etwas Unrecht in Teil ist sArr [tx + ty] = Arr [....] – alphjheon

+0

CUDA ist ** nicht ** [Tag: C]! – Olaf

Antwort

1

Auf dieser Linie int tx=threadIdx.y;int ty=threadIdx.y; Sie Ihre tx variable Einstellung statt threadIdx.x threadIdx.y

Diese Probleme mit Indizierung erklären könnte.