Kepler GPU에서 컨볼루션 커널 메모리 효율 최적화
초록
본 논문은 Kepler 아키텍처 GPU의 공유 메모리 은행 폭과 스레드 연산 데이터 폭 사이의 불일치를 모델링하고, 이를 해소하기 위한 두 종류의 직접 컨볼루션 커널을 설계한다. 하나는 입력 채널이 하나인 특수 경우에 최적화된 커뮤니케이션‑최소화 커널이며, 다른 하나는 다채널 일반 경우에 은행 충돌을 감소시킨 커뮤니케이션‑감소 커널이다. 실험 결과, 특수 경우에서는 cuDNN 대비 5.16배, 일반 경우에서는 평균 35.5% 향상을 달성하였다.
상세 분석
이 논문은 GPU 메모리 계층 구조, 특히 공유 메모리(SM) 은행 폭(WSMB)과 스레드당 연산 데이터 폭(WCD) 사이의 불일치가 성능 병목을 초래한다는 점을 정량적으로 분석한다. Kepler GPU에서는 WSMB가 8바이트인데, 대부분의 연산이 4바이트(float) 단위로 이루어지므로 n=2인 상황이 발생한다. 이 경우 은행 충돌이 발생해 동일 은행에 접근하는 두 스레드가 직렬화되며, SM 대역폭이 절반으로 감소한다. 저자들은 이를 해결하기 위해 “n개의 기본 요소를 하나의 단위로 처리”하는 접근법을 제안한다. 즉, float2 혹은 float4와 같은 벡터형 데이터를 이용해 한 번의 메모리 접근으로 n개의 연산 데이터를 동시에 읽고 쓰게 함으로써 SM 대역폭을 n배 향상시킨다.
특수 경우(입력 채널 C=1)에서는 블록 단위로 이미지를 H×W 크기로 분할하고, 각 블록을 하나의 스레드 블록(TB)에서 처리한다. 가로 방향 데이터 공유는 SM을 통해, 세로 방향 공유는 각 스레드의 레지스터를 이용해 구현한다. 블록 경계 외부의 halo 픽셀은 최소한으로 재읽으며, 전체 이미지에 대해 거의 한 번만 GM(Global Memory)에서 읽는다. 이는 이론적인 최소 통신량에 근접한 설계이다. 또한, n=2인 Kepler 환경에 맞춰 각 스레드가 연속된 n개의 출력 픽셀을 담당하도록 하여 SM 은행 충돌을 완전히 회피한다.
일반 경우(다중 채널)에서는 입력 채널 수가 많아 한 번에 모든 연산 데이터를 레지스터에 적재할 수 없으므로, K×K 필터를 채널 차원으로 분할하여 여러 단계에 걸쳐 FMA 연산을 수행한다. 각 단계마다 필요한 입력 패치를 SM에 로드하고, 스레드 간에 은행 충돌이 없도록 데이터 배치를 조정한다. 또한, 필터는 상수 메모리(Constant Memory)에 저장해 브로드캐스트 효율을 극대화하고, GM 접근은 연속적인 n픽셀 단위로 공동 접근(coalesced)하도록 설계한다. 프리패칭 메커니즘을 도입해 다음 행 데이터를 미리 SM에 적재함으로써 연산과 메모리 전송을 겹쳐 숨김(overlap) 효과를 얻는다.
성능 평가에서는 Kepler K40m GPU를 사용해 다양한 입력 크기와 필터 크기에 대해 cuDNN 최신 버전과 비교하였다. 특수 경우에서는 5.16배, 일반 경우에서는 평균 35.5%의 실행 시간 감소를 기록했으며, 특히 SM 은행 폭과 연산 폭을 일치시킨 경우에 큰 이득을 보였다. 이러한 결과는 메모리 대역폭이 제한적인 GPU 환경에서 직접 컨볼루션이 여전히 경쟁력 있는 선택임을 재확인한다.
댓글 및 학술 토론
Loading comments...
의견 남기기