본문 바로가기

프로그래밍 기록/교내 프로젝트

CUDA 코어를 활용한 JEM 디블로킹 필터 병렬화

CUDA 코어를 활용하여 차세대 비디오 코덱 표준 프로그램 JEM에서의 루프 필터링 병렬화



1 JEM에서의 디블로킹 필터 CUDA 화 과정
 Jem에서의 디블로킹 필터를 담당하는 클래스인 TComLoopFilter 이며 이는 인코더와 디코더가 모두 활용하는 COM 프로젝트에 속한 클래스로 QTBT구조로 재귀적으로 분할을 한 뒤에 해당엣지를 필터링하게 된다. 이때 CUDA에서 host와 device간 정보 전달에 사용하는 cudaMemcpy는 비용이 높은 작업이다 따라서 CU 단위에서 CUDA함수를 호출하기 위해 CU단위에서 cudaMemcpy를 사용하게 되면 수많은 cudaMemcpy가 호출되어 성능 하락 확실시된다. 따라서 본 논문에서는 xDeblockCU에서는 필터링을 해야 할 픽셀정보를 저장하고 xDeblockCU의 재귀과정이 모두 끝난 후에 저장된 정보를 이용하여 모든 픽셀을 한번에 CUDA함수로 처리할 것이다.

2 CUDA 함수 구현
 Jem은 TComPicYuv 에서 픽셀의 배열로된 픽쳐의 버퍼를 가지고 있고 필터링을 수행할 픽셀의 포인터를 이용하여 접근하고 이를 필터링하게 된다. 따라서 해당 픽셀 포인터의 정보를 가지고 있어도 이는 Host의 주소값 이기 때문에 이를 CUDA에서 활용할 수가 없다. 따라서 본 논문에서는 이 주소 값은 버퍼의 시작지점으로부터의 오프셋으로 변경하여 해당 오프셋을 CUDA메모리에 복사된 픽셀배열로부터 더하여 CUDA에서 필터링과정을 수행할 수 있도록 하였다. 또한 오프셋을 구하는 과정도 CUDA함수로 한 번에 처리하도록 하여 성능을 최대한 상승시켰다.


QTBT구조로 재귀적으로 분할되는 과정은 이미 인코더 혹은 디코더에서 수행한 작업이나 Jem에서 디블로킹을 공통부분 프로젝트로 따로 생성되어있어 해당 QTBT구조 분할을 다시 수행하는 것이다. 이때 CUDA화를 위하여 필터링 픽셀을 저장하는 과정에서 많은 비용이 소요되게 된다. 실험결과를 확인해보면 실제 쿠다가 실행되는 시간은 굉장히 적으나 이러한 구조변경으로 인하여 디블로킹 시간은 오히려 크게 상승한 것을 볼 수 있다. 따라서 JEM의 구조적인 특성상 CUDA를 적용하여 얻는 이득은 없지만 JEM이 아닌 JEVT의 표준을 따른 인코더를 만들 때 구조를 병렬화에 맞게 제작한다면 CUDA를 활용하여 성능향상을 할 수 있을 것으로 예상된다

728x90