【发布时间】: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<<<dimGrid,dimBlock>>>(Array1,M);看起来像有效的 C 吗?将 C 用于 CUDA 与将 C 标记添加到 C++ 问题的错误概念完全相同:他们认为它们是同一种语言。
标签: arrays parallel-processing cuda