본문 바로가기

Programming

Parallel Computing(병렬 컴퓨팅) 3

사용자 삽입 이미지
그림 1. 병렬컴퓨팅의 개략도



병렬 컴퓨팅의 개략도 입니다.

싱글코어와 멀티프로세서의 작업 진행의 개략도이며

당연히 멀티프로세서를 사용할 경우 업무를 동시에 분산하여 계산시간은 짧아집니다.

다만, 대부분의 병렬컴퓨팅은 각 프로세서 사이의 네트웍을 요구하게 됩니다.

매 스텝 계산을 마치고 정보를 상호 공유하여 업데이트를 하는 과정이 필요하기 때문인데,

이러한 네트워크 때문에, 실제로는 계산시간이 1/n (이 때, n 은 프로세서의 갯수)로

줄어드는 것이 아니라 어느정도의 한계치가 존재하게 됩니다.


그에 대한 언급은 여러 문헌에서 찾아볼 수 있는데, OpenMP 홈페이지의 자료에서도

쉽게 설명하고 있습니다.

사용자 삽입 이미지
그림 2. 코어 갯수에 따른 계산시간 절감효과 (출처 : http://openmp.org/wp/)


이 그림에서 보시면, 프로세서의 갯수가 증가함에 따라, 계산시간 절감의 효율은 점차 떨어져서

일정 갯수 이상의 프로세서는 거의 의미가 없음을 나타내고 있습니다.




게다가, 다시 그림 1로 돌아가서 보면 멀티프로세서를 사용할 경우

각 프로세서에 주어진 로드는 각기 달라서 끝나는 시간 역시 각각 다릅니다.

각 프로세서간 데이터를 업데이트할 필요가 없는 경우에는 문제가 되지 않지만

동기화가 필요한 경우에는 다른 프로세서가 계산을 마칠때 까지 기다려야 하기 때문에

(MPICH나 OPENMP에서는 Barrier 기능을 활용하여 이 작업을 수행합니다.

또는 특정 통신 명령어는 자동적으로 Barrier 기능을 수행하기도 합니다.)


이와 같은 문제로 인하여 속도는 더욱 감소하게 됩니다.


따라서 병렬 컴퓨팅을 활용하여 계산속도를 극대화 하고자 한다면

이러한 논리적 문제를 최적화 해야만 합니다.

가장 큰 문제는 역시 네트워크이며, 멀티코어 프로세서가 아닌 여러개의 독립적인

컴퓨터를 네트웍으로 묶을 경우 랜카드의 속도에 절대적으로 영향을 받는 인자가 됩니다.

최근에는 1000Mbps를 지원하는 랜카드가 많지만 이전에는 100Mbps가 고작이었고

이런 경우, 거대한 스케일의 시뮬레이션 등을 수행할 때 문제가 되는 부분입니다.


저의 경우에도 매 순간 네트워크 부하가 50% 이상이 되곤 했으니, 네트워크가 잡아먹는

시간이 굉장했던 셈입니다.




다시 말해서, 각 프로세서간의 통신을 최소화 해야합니다.

단지 프로그래밍이 귀찮고, 어렵다는 이유만으로 모든 데이터를 통째로

Broadcasting 해버린다거나 한다면, 코어갯수가 늘어나는 만큼, 네트워크 부하도

비례해서 증가하게 됩니다.




참고해볼 자료

http://jacking75.cafe24.com/MSDN_MagaZine/2005-10-3.htm

http://openmp.org/wp/

그 외 계속 추가할 예정입니다^^;