월요일마다 평생 눈 안뜨고 싶은 레온입니다. 오늘은 업무 얘기를 좀 하려고 합니다.
저는 에기평에서 내 준 과제를 하나 맡고 있습니다. 이 과제는 제가 입사하기 전 부터 계속 진행되었던 과제라서 숟가락만 얹고 오우 개꿀ㅋ 했으면 얼마나 좋았을까 싶지만 역시 인생은 날먹이 아닌지라 몇 가지 트러블이 존재합니다.
1. 학교와 같이 하는 과제라 공대생들의 영원한 친구인 MATLAB으로 코드를 짜놨습니다. FPGA는 Xilinx를 사용하고 있고 Xilinx가 ISE라는 툴을 사용했을 땐 MATLAB(Simulink)을 이용한 VHDL CodeGen 툴을 만들어 놨는데 이 놈들이 ISE에서 Vivado로 아예 툴을 새로 만들더니 이 CodeGen 툴을 짜잔! 하고 없앴습니다.
덕분에 CodeGen을 사용하려면 제한된 환경에서 제한된 ISE 버전을 통해서 만들어야 합니다.
자일링스 망했으면 좋겠네요.
2. 여기에 한 술 더 떠 MATLAB으로 프론트 엔드마저 만들어 놨습니다. 덕분에 GUI도 MATLAB으로 짜야되는 상황.
물론 MATLAB 자체에서도 Deploytool을 통해 객체 라이브러리를 비주얼 스튜디오로 이식할 수 있지만...
그 짓을 언제 다하지? 소스는 누가 새로 짜고 소는 누가 키우지?
물론 MATLAB에서도 GUI를 만들 수 있게 GUIDE 툴을 따로 제공은 해주지만 버린 자식 취급인지 추가할 수 있는 콜백 GUI 구성도 몇 개 없습니다. 한 10개 되는 것 같은데 꽤 많은 선택지를 주는 C#이나 Measurement Studio와 비교해 보면 매우 초라하고 볼 품 없죠. 쓰레깁니다. 그냥.
3. 저 혼자 짭니다. 설명 생략.
4. 여기가 본론인데, 프로그램이 느립니다. 최적화를 해도 느립니다. MATLAB한테 뭘 바랬겠냐만은...
말하기 전에 구조적인 부분을 먼저 간략하게 설명하면 FPGA에는 DAQ가 달려있어 실시간으로 데이터를 받습니다. 한 번에 1024 byte로 빠르면 0.2초씩 받습니다. 문제는 이걸 실시간으로 표현해줘야 하는데 당연히 느릴 수 밖에....
그래서 뭔가 효율적인 방법이 없을까 하다가...
이 두 함수를 발견하게 됩니다.
Parallel Pool을 통한 비동기적 함수 호출을 가능케 만드는 함수와 병렬 연산 루프입니다.
쓰는 방법은 굉장히 간단하지만 귀찮은 조건이 걸려있어요.
1) Parallel Pool을 통한 병렬 연산은 전역 변수를 이용할 수 없다.
2) 연산만 병렬이지 다른 함수들을 병렬로 사용할 수 있다는 얘기는 아니다.
3) 핸들은 Parallel Pool로 넘길 수 있고 실행도 되지만 결과에 반영되지 않는다.
4) 디버깅 불가 ( 오류를 객체를 열어서 알아서 찾아야함 )
1번은 병렬 연산의 특성상 그럴 수 있다고 넘어갈 수 있는데 2,3번은 무슨 말이냐면...
MATLAB에서 자주 사용하는 plot, imshow같은 Image Processing 관련 함수들은 병렬 호출이 안됩니다.
(다른 특정 함수도 아마 그럴 가능성이 높음)
GUI로부터 만들어진 핸들을 Parallel Pool로 넘겨주면 얘들이 이게 핸들인지 인식을 못합니다.
결론 : 안됨
:((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
이럴거면 왜 만들었나.
솔직히 병렬 연산까진 기대 안하더라도 비동기적 함수 호출은 필요했거든요. MATLAB 함수들이 꽤 느린 편이라...
그래... 희소/비희소 행렬 연산, 2-D 컨벌루전, 영상 처리등을 부분적이라도 병렬 연산하면 좀 나아지지 않을까?
그래서 결국 병렬 연산이 가능할 만한 구간을 병렬 연산으로 만들어서 적용을 하고 총 연산 시간을 실험한 결과
기존 : 1분 40초
적용 후 : 10분 40초
ㅎㅎ.....
* 추가
MATLAB도 지들 GUI 툴이 X신같다는걸 알았는지 JAVA Swing 라이브러리가 존재하긴 합니다.
근데 이 라이브러리는 차후 릴리즈 버전에서 폐기된다는 말이 있고, 현재 GUI와 충돌이 일어나는 부분이 간혹 있습니다.
게다가 라이브러리만 있지 딱히 툴이 있는 건 아니라서 정말 쓸려면 코드를 일일히 다 써줘야 합니다. 그리고 라이브러리에 관련된 레퍼런스도 그렇게 많지는 않네요.