在Cuda使用共享内存

时间:2016-08-17 20:56:02

标签: arrays parallel-processing cuda

我在Cuda(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];
            }   
        }
    }   
}

从main调用,对于某个大整数,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;
    }
}

有人可以给我一个方向,我怎样才能采用“正确”的方式? 提前致谢

1 个答案:

答案 0 :(得分:1)

在这一行 int tx=threadIdx.y;int ty=threadIdx.y; 您将tx变量设置为threadIdx.y而不是threadIdx.x

这可以解释索引的问题。