【问题标题】:Using Shared Memory in Cuda在 Cuda 中使用共享内存
【发布时间】:2016-12-24 16:07:20
【问题描述】:

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

有人可以告诉我如何走“正确”的道路吗? 提前致谢

【问题讨论】:

  • 您提供的共享内存代码不会编译,所以它不是您正在运行的。您的index 计算几乎肯定会超过BLOCKSIZE,因此当您尝试在sdata[index]=... 加载共享内存时,您将立即索引越界。寻求调试帮助的问题应提供minimal reproducible example
  • @RobertCrovella 你是对的。我只是编辑我的代码。有了我现在才工作的那个。它完全可编译。我怀疑某些地方出了问题 sArr[tx+ty]=Arr [....]
  • CUDA 不是 c!
  • @AndreasPapadopoulos:“C 和 C++ 是不同的语言”- 说吧!没有 CUDA-C,CUDA 是基于 C++ 的。 FUN1&lt;&lt;&lt;dimGrid,dimBlock&gt;&gt;&gt;(Array1,M); 看起来像有效的 C 吗?将 C 用于 CUDA 与将 C 标记添加到 C++ 问题的错误概念完全相同:他们认为它们是同一种语言。

标签: arrays parallel-processing cuda


【解决方案1】:

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

这可以解释索引问题。

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 2021-06-16
    • 1970-01-01
    • 2012-04-02
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多