2021년 8월 1일 일요일

Line Scan Imaging을 위한 buffer 다루기와 Thread의 설계

# Memory 설계

기본적으로 메모리 사용량의 효율성 보다 서로 다른 Thread가 하나의 메모리 공간을 가지고 경쟁하는 상황을 피하기 위해서,

라인 스캔된 영상들은 하나의 영역을 구성하는 기본 영상을 저장하는데 필요한 크기보다 큰 circular buffer(boost::circular_buffer)에 차곡차곡 쌓아 놓아야 한다. 이를 통해서 영상을 획득하는 Thread(Acquisition Processing)는 circular buffer에 적재만 하고 ciruclar buffer가 어떻게 사용되는지는 고려하지 않아도 된다. 그리고 영상이 완성된 이후의 영상처리 기능을 분산하기 위해서 라인 스캔된 영상단위로 처리할 수 있는 영상처리를 수행하고 처리된 결과를 저장할 추가적인 circular buffer를 마련해서 computing cost를 분산시킨다.

# Thread 설계 

라인 스캔 영상을 처리학 위해서 최소한 3개의 Thread가 필요하다. 첫째는 라인 스캔된 영상을 획득하고 circular buffer에 적재하는 Thread(+가능하다면 라인스캔 단위로 처리할 영상처리를 수행), 둘째는 하나의 기본단위 영상 크기에 대한 영상처리 thread, 그리고 마지막 셋째는 영상 처리 결과를 30혹은 60hz 주기로 GUI에 뿌려주는 Thread로 구성하면된다.

이와 같은 Thread가 순차적으로 동작하도록 하기 위해선 QThreadPool과 QRunnable이라는 Qt 인스턴스를 활용해야한다.

# 최적화

속도의 문제가 발생할 수 있는 우려되는 영역은 영역 단위의 영상처리 Thread의 수행 속도이다. 이 부분의 우려를 불식시키기 위해서는 병렬처리를 고려해 볼 수 있다. 기본적으로 OpenCV를 사용할 경우 GPU나 SIMD를 활용한 Custom 라이브러리를 사용하는 것을 첫번째로 고려하고 아니면 수작업으로 SIMD나 CUDA를 이용한 방법을 고려해보자.

# 배워야할 거리들

boost::circular_buffer, QThreadPool, QRunnable, OpenCV with SIMD, and CUDA enabled, SIMD, CUDA