我在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;
}
}
有人可以给我一个方向,我怎样才能采用“正确”的方式? 提前致谢
答案 0 :(得分:1)
在这一行
int tx=threadIdx.y;int ty=threadIdx.y;
您将tx变量设置为threadIdx.y而不是threadIdx.x
这可以解释索引的问题。