병렬화, 병렬 프로그래밍 #3
병렬화는 컴퓨터 공학에서 매우 중요한 기법으로 여러 작업을 동시에 처리하여 계산 속도를 높이는 기법입니다. 프로젝트를 진행하며 병렬화에 대해 공부해 나갔고 이를 기록하는 김에 글을 작성하게 됐습니다. 이번에는 최적화하는 프로젝트 도중에 알게된 사실을 정리하고자 글을 쓰게 됐습니다.
병렬화(parallelism)란?
병렬화(parallelism)란 여러 작업을 동시에 처리하여 계산 속도를 높이는 기법입니다.
참고 : Windows-BALM
제 깃허브에 올린 BALM을 윈도우 환경에서 돌아가게 한 코드이며 병렬화 코딩을 통해 최적화를 시켰으며 처리 시간 성능을 원본 코드 대비 최대 30% 향상시켰습니다. 참고하시면 좋을 거 같습니다. 해당 코드 특성상 win size 마다 thread를 할당하는데에 시간이 많이 걸려, win size가 thread 수에 비해 3배 이상 크지 않으면 할당하는 데 시간이 좀 더 오래 걸리는 오버 헤드 현상이 발생하였다. 이를 줄이기 위해 thread를 재사용하는 방식으로 코드를 개선했습니다.
Thread 재사용 하는 방법
위와 같은 이유로 같은 수의 thread를 계속 선언하고 할당하고 지우고 하는데에는 시간이 많이 걸리게 되므로 thread를 처음에 선언하고 그 뒤로는 선언한 thread에 함수만 넣고 재사용하여 작동하도록 함수를 짜게 하면 시간을 좀 더 줄일 수 있게 되었다.
프로젝트 코드를 올릴 순 없지만 알려드리면 속도면에서 약 20 퍼센트 정도 향상하게 되었다.
thread를 자주 사용하는 프로젝트에서는 더 큰 폭으로 성능 향상을 보일 것으로 보인다.
thread 짜면서 느낀점들
-
코드 분석 가장 중요하면서 기본. 코드에서 어떠한 함수(수식)들이 다른 것과 상과없이 병렬화 진행할 수 있는 지 분석하는 것이 정말 중요하다. 안 그러면 오만 thread 문제 일어나는 듯 ㅋㅋ 병렬화하지 않아야할 거를 병렬화시키면 결과값이 아예 바껴버리거나, 병렬화를 잘못 사용하면 데드락이 걸리고, 병렬화 할당하는데에 시간이 걸려 오히려 시간이 더 걸릴 수도 있고(이 부분은 직접 실험을 진행해야 알 수 있는 게 대부분인 듯) 되게 고려할 게 많다… 하나씩 병렬화하면서 샘플 코드로 결과를 확인해가면서 실험하자…
-
thread 코딩 시 함수 변수 조심!!! thread는 디버깅할때 어느 부분이 잘못됐는지 알려주지도 않는다. (이런 xx)
cpp 기준, 위와 같은 경고 메시지만 뜨고 어디를 잘못 병렬화했는지는 나오지도 않는다 하… 이것도 하나씩 병렬화하면서 어느 부분을 추가할 때 잘못되는지 잘 봐야할 필요가 있다.
- thread 최대한 재사용 thread를 매번 선언하고 지우지 말고 가장 처음에 선언하고 그 이후는 함수만 넣어서 재사용할 수 있게 만들면 코드에 따라서 크게 성능 향상을 보인다. 꼭 재사용하도록 하자.
댓글남기기