Parallel processing 共享内存性能更差

Parallel processing 共享内存性能更差,parallel-processing,cuda,shared-memory,Parallel Processing,Cuda,Shared Memory,我正在使用大小为3x3的水平遮罩和大小为3x3的垂直遮罩执行sobel边缘检测。 我第一次实现该算法时没有使用共享内存,现在我尝试使用共享内存实现它。未使用共享内存时的性能比使用共享内存时的性能要好。谁能解释一下吗 代码 \uuuu全局\uuuuu无效图像(int*in,int*out,int-width){ int Mx[3][3]={-1,0,1},{-2,0,2},{-1,0,1}; int My[3][3]={{1,2,1},{0,0,0},{-1,-2,-1}; __在[t][t]中共

我正在使用大小为3x3的水平遮罩和大小为3x3的垂直遮罩执行sobel边缘检测。 我第一次实现该算法时没有使用共享内存,现在我尝试使用共享内存实现它。未使用共享内存时的性能比使用共享内存时的性能要好。谁能解释一下吗

代码

\uuuu全局\uuuuu无效图像(int*in,int*out,int-width){
int Mx[3][3]={-1,0,1},{-2,0,2},{-1,0,1};
int My[3][3]={{1,2,1},{0,0,0},{-1,-2,-1};
__在[t][t]中共享的信息;
int-sumX=0,sumY=0;
int row=blockIdx.y*blockDim.y+threadIdx.y;
int col=blockIdx.x*blockDim.x+threadIdx.x;
int r=threadIdx.y;
int c=threadIdx.x;
sIn[r][c]=in[(行*宽)+col];
__同步线程();
如果(行==0 | |行==width-1 | |列==0 | |列==width-1){
out[行*宽+列]=0;
}否则{
对于(int i=-1;i<2;i++){
对于(int j=-1;j<2;j++){
整数像素;
如果(r==0 | | r==(t-1)| | c==0 | | c==(t-1))
像素=英寸[(行+i)*宽度+(列+j)];
其他的
像素=sIn[r+i][c+j];
sumX+=像素*Mx[i+1][j+1];
sumY+=像素*My[i+1][j+1];
}
}
int ans=abs(sumX)+abs(sumY);
如果(ans>255)ans=255;
如果(ans<0)ans=0;
out[行*宽+列]=ans;
}
}
t是瓷砖的尺寸

内核调用:

image<<<dim3(width/t, width/t, 1),dim3(t, t, 1)>>>(d_input, d_output, width);
图像(d_输入、d_输出、宽度);

当检查3x3掩码的边界像素时,我使用了“围裙”像素,从而增加了平铺宽度,从而减少了全局内存访问

为什么内核使用共享内存会更快?全局内存访问更少您希望有人向您解释为什么您显示的代码比其他未显示的代码更好或更差显示了吗?我知道了。。。我需要使用额外的瓷砖来存储像素
image<<<dim3(width/t, width/t, 1),dim3(t, t, 1)>>>(d_input, d_output, width);