共享内存性能更差
Shared memory performing worse
我正在使用大小为 3x3 的水平掩码和大小为 3x3 的垂直掩码执行 sobel 边缘检测。
我首先在不使用共享内存的情况下实现了该算法,现在我尝试使用共享内存实现它。不使用共享内存时的性能比使用时要好。谁能解释一下。
代码
__global__ void image(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}};
__shared__ int sIn[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[(row*width) + col];
__syncthreads();
if(row == 0 || row == width-1 || col == 0 || col == width-1){
out[row*width + col] = 0;
}else{
for(int i = -1; i < 2; i++){
for(int j = -1; j < 2; j++){
int pixel;
if(r == 0 || r == (t-1) || c == 0 || c == (t-1))
pixel = in[(row + i) * width + (col + j)];
else
pixel = sIn[r + i][c + j];
sumX += pixel * Mx[i+1][j+1];
sumY += pixel * My[i+1][j+1];
}
}
int ans = abs(sumX) + abs(sumY);
if(ans > 255) ans = 255;
if(ans < 0) ans = 0;
out[row*width + col] = ans;
}
}
t 是图块大小。
内核调用:
image<<<dim3(width/t, width/t, 1),dim3(t, t, 1)>>>(d_input, d_output, width);
当检查 3x3 掩码的边界像素时,我使用围裙像素因此增加了图块宽度以减少全局内存访问
我正在使用大小为 3x3 的水平掩码和大小为 3x3 的垂直掩码执行 sobel 边缘检测。 我首先在不使用共享内存的情况下实现了该算法,现在我尝试使用共享内存实现它。不使用共享内存时的性能比使用时要好。谁能解释一下。
代码
__global__ void image(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}};
__shared__ int sIn[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[(row*width) + col];
__syncthreads();
if(row == 0 || row == width-1 || col == 0 || col == width-1){
out[row*width + col] = 0;
}else{
for(int i = -1; i < 2; i++){
for(int j = -1; j < 2; j++){
int pixel;
if(r == 0 || r == (t-1) || c == 0 || c == (t-1))
pixel = in[(row + i) * width + (col + j)];
else
pixel = sIn[r + i][c + j];
sumX += pixel * Mx[i+1][j+1];
sumY += pixel * My[i+1][j+1];
}
}
int ans = abs(sumX) + abs(sumY);
if(ans > 255) ans = 255;
if(ans < 0) ans = 0;
out[row*width + col] = ans;
}
}
t 是图块大小。
内核调用:
image<<<dim3(width/t, width/t, 1),dim3(t, t, 1)>>>(d_input, d_output, width);
当检查 3x3 掩码的边界像素时,我使用围裙像素因此增加了图块宽度以减少全局内存访问