후로링의 프로그래밍 이야기

#5 OpenCL 튜토리얼. Convolution Filter와 Local Memory 이론 본문

OpenCL

#5 OpenCL 튜토리얼. Convolution Filter와 Local Memory 이론

후로링 2016. 12. 1. 14:15

Convolution Filter란?


  출력화소를 만들기 위해서 주변의 화소값을 이용하여 계산하는 작업을 말합니다. 블러링, 샤프닝, 미분처리, 미디언필터, 평균값필터 등등이 convolution filter에 포함됩니다.

  픽셀값을 결정하기위해서 픽셀 주변에 필터에 적용하는 NxN크기의 배열을 convolution kernel이라고 합니다. 예를들어 9개 픽셀의 평균값으로 픽셀의 값을 정하는 연산을 하고싶다면 이 연산에 적용되는 커널은 각 1의 원소를 가진 3X3 크기의 배열입니다. 





Convolution FIlter와 복잡도


  단순하게 생각했을때, 한 이미지에 대해 각 픽셀당 한번씩의 연산을 수행하는 시간이 10ms라면 3x3 크기의 필터를 사용하게되면 연산량이 9배 , 9x9 필터를 사용하게 되면 81배 늘어나게 됩니다. 13x13 필터를 사용한다면 169배의 연산량 증가가 있게 되죠. 이러한 급격한 연산량 증가에따라 수행시간도 급격하게 증가합니다. 

  Convolution Filter는 한 픽셀의 주변 픽셀을 이용해서 연산을 하기 때문에 한 스레드가 접근하게 되는 메모리의 위치들이 지역성을 띄게 됩니다. 이러한 점을 이용해서 크게 성능을 향상 시킬 수 있습니다. 



Local Memory란?

  스레드는 하나의 work group 단위로 묶여서 실행되게 됩니다. 보통 Max work group size는 16x16입니다. work group의 크기가 16x16 인것은 GPU의 연산 유닛이 16x16개 묶음으로 되어있기 때문입니다. 그리고, work group단위로 사용 할 수 있는 캐시가 있습니다.  그 캐시메모리가 바로 Local Memory입니다. Global Memory에 있는 이미지를 분할해서 Local Memory에 넣어놓고 work group단위로 접근하도록 한다면 Global Memory에 가해지는 부하를 줄일 수 있습니다. 또한 Local Memory의 접근속도는 Global Memory보다 빠르기때문에 큰 속도 향상을 얻을 수 있습니다. 


 Convolution Filter를 적용 하기 전에 Global Memory에서 Local Memory로 이미지를 분할하여 저장하는 작업을 선행해야 하는데 이 작업 또한 오버헤드 이기 때문에 


(Local Memory로 옮기는 비용) + (Local Memory에서 Convolution Filter 실행 비용) < (Global Memory에서 Convolution Filter 실행 비용)


인 경우에만 Local Memory를 이용한 최적화 작업을 실시 하도록 합니다. 




어떻게 이미지를 로컬메모리로 분할하는가?

  예를들어, 7x7의 필터를 사용한다면, 계산의 대상이 되는 픽셀 주변의 48개의 픽셀의 정보를 이용해서 결과값을 얻게됩니다. 그렇다면 만약 로컬 메모리의 크기가 16x16개라면 로컬 메모리에 가져와야 할 이미지의 크기는 얼마일까요? 정답부터 얘기하면 (6 + 16 + 6) * (6 + 16 + 6)만큼의 픽셀입니다. 눈치가 빠르신 분들은 벌써 이해를 하셨으리라 생각됩니다. 



  work group의 가장 모서리를 보면 모서리의 픽셀이 상하좌우로 6칸 만큼의 픽셀을 참고하여 값을 정한다는 것을 이해 하실 수 있을 것입니다. 따라서 (필터의크기 -1) 만큼의 크기를 padding으로써 로컬 메모리에 함께 저장해야 픽셀의 값을 결정 할 수 있습니다. 조금더 이해를 돕기위해 다른 그림으로 예를 들겠습니다. 



  위 그림과 같이 이미지를 local memory의 크기만큼 분할 할 때, padding 픽셀 만큼을 가져와야 로컬메모리 내의 자원 만으로 픽셀의 값을 결정 할 수 있게 됩니다. 로컬 메모리를 사용하는 이유가 속도가 느린 글로벌 메모리의 참조를 줄이기 위한 것이므로 꼭 수행되어야 할 과정입니다. convolution filter연산 뿐만 아니라 local memory를 활용해서 연산을 가속화 하기 위해서는 global memory를 어떻게 나눌 것인지에 대한 전략을 잘 세워야 합니다. 나누는 전략 자체가 가속화 알고리즘이라고 할 수 있습니다. 


  다음 강좌에서는 코드를 살펴보면서 알아보도록 하겠습니다.


Comments