AI
수정·

카타고 신규 백엔드 제작기 2편

by Dohoon Kim · 26년 03월 01일 15:34:53

Winograd 컨볼루션 알고리즘 적용

기존 대비 성능 향상 18블럭 -> 5visits/secs To 60visits/secs 약 1200% 향상.

기존 쉐이더 코드는 직관적인 NCHW 포맷을 이용한 컨볼루션을 이용했음

GPU에서 WorkItem.x WorkItem.y 가 하나의 픽셀을 처리하되, z축으로 배치를 처리하도록 만들었으나, 실질적으로 z축으로 데이터 접근 시 메모리 정렬이 깨지면서 성능이 극히 좋지 않았음.

OpenCL 백엔드 쪽 구현을 가져와 이식한 결과

Filter 의 메모리 레이아웃은 [ InTileY, InTileX, InChannelsPadded, OutChannelsPadded ] 레이아웃이 되었 Winograd 도메인으로 변환된 입력은 [InTileY, InTileX, InChannelsPadded, Batch, NumTileY, NumTileX] 레이아웃으로 구성됨.

이를 고성능 XGEMM 커널로 처리하면 기존 Naive 컨볼루션에 비해 굉장히 빠르게 처리 가능

A = Winograd Domain Input 으로 InTileY x nTileX 크기를 z축으로 dispatch 한 워크 아이템 관 메모리 레이아웃은 [InChannelsPadded, Batch, NumTileY, NumTileX] B = Winograd Domain Filter로 한 워크 아이템 관점에서 [InChannelsPadded, OutChannelsPadded] 형태로 취급

행렬곱 관점에서 M, N ,K(내적 축) M = Batch x NumTileY x NumTileX, K = InChannelsPadded, N = OutChannelsPadded가 됨. 따라서 A = [ K x M ] B = [K X N] 형태로 취급할 수 있고 AT x B 또는 B^T x A 형태로 행렬곱 커널을 사용하면, 커널 픽셀 (x,y) 당 컨볼루션 결과를 행렬곱 취급 가능