2016-11-02 2 views
-2

크기가 3x3 인 수평 마스크와 크기가 3x3 인 수직 마스크로 가장자리 감지를 수행합니다. 먼저 공유 메모리를 사용하지 않고 알고리즘을 구현했으며 공유 메모리를 사용하여 구현하려고했습니다. 공유 메모리를 사용하지 않을 때의 성능은 그 당시의 성능보다 낫습니다. 아무나 제발 설명해 줄 수 있어요.공유 메모리가 더 열악합니다.

코드

__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); 
+0

가 왜 커널 빠르게 공유 메모리에 있어야한다 확인 된 경우 액세스 ? – talonmies

+0

보다 적은 전역 메모리 액세스 – Sarthak

+1

다른 사람이 ** 표시 한 코드보다 ** 좋았거나 나쁜 코드가 왜 보이는지 설명해 줄 사람이 필요하십니까? –

답변

-1

는 3 × 3 마스크의 경계 픽셀

관련 문제