본문 바로가기

Programming/OpenMP

OpenMP 병렬 프로그래밍 구현 순서

병렬 프로그래밍 구현 순서


Multi-Thread 프로그래밍의 특징을 보면 다음과 같다.


1. 병렬화할 부분을 찾아낸다.


순차 프로그램의 모든 부븐을 병렬 프로그램으로 변경할 수는 없다. 병렬화 부분이 많으면 많을 수록 프로그램의 성능이 향상되지만, 그만큼 시간과 자원이 많이 들어가게 된다.

따라서 해당하는 프로젝트의 환경에 따라 얼마나 많은 부분을 병렬화 할지에 대한 판탄을 해야한다.


시간과 자원이 많이 있고, 프로그램의 성능이 향항이 중요하면 병렬화를 최대한 많이 적용하면 될 것이고, 그렇지 않으면 가장 필수적인 부분을 병렬화하도록 선택해야 한다.

병렬화할 부분을 선택하는 기준은 다음과 같다.

1) 프로그램을 실행하였을 때 가장 많은 시간이 할당되는 부분을 찾는다. 동작 시간이 가장 많이 대체로 프로그램의 병목지점이다.

2) 프로그램의 가장 핵심적인 기술이 동작하는 부분을 살펴본다. 핵심적이고 경쟁력을 가진 부분이라고 생각되는 부분의 프로그램의 코어 엔진일 가능성이 크다.

3) 처리해야할 데이터가 많은 부분을 찾는다. 데이터의 양이 많거나 많은 복잡도가 발생하는 알고리즘이 수행되는 부분을 찾는다. 데이터 처리가 많은 부분을 해결하였을 때, 성능개선의 여지가 많다.



2. 병렬화할 부분을 별도 함수로 분리한다.


병렬화할 부분을 찾았다면 각각의 OS가 지원하는 API 함수를 사용하기 위해서 해당하는 부분을 별도의 함수로 분리한다. API 함수가 지원하는 형식에 맞게 인자와 리턴 값을 지정해야 한다.



3. 별도의 스레드로 생성하여 실행할 함수를 연결한다.


API 함수를 호출하여 스레드를 생성하고, 작업을 수행할 함수를 연결하여 동작하도록 한다.



4. 동기화가 필요하면 동기화 기능을 구현한다.


스레드 함수간에 데이터 경합, 또는 데드록 등으로 인한 오류를 방지하기 위해 동기화가 필요한 경우가 많이 있다. 오류를 방지하기 위해서는 동기화가 필요하다면 기능을 추가하여 구현한다.



5. 메인 스레드는 별도 생성된 작업 스레드(Worker thread)의 작업완료를 기다린다.


Windows에서 지원하는 스레드로 병렬 처리를 구현하게 되면, 보통 메인 스레드와 작업 스레드로 구분되게 된다. 메인 스레드는 작업 스레드를 생성, 소멸시키고 순차적인 프로그램 부분을 담당하게 된다.


메인 스레드가 작업 스레드와 별도로 비동기 수행을 할 경우도 있지만, 보통은 작업 스레드의 완료를 기다리게 된다. 작업 스레드가 종료되기 전에 메인 스레드가 종료되면 프로그램의 오류가 발생하게 된다.



6. 테스트와 디버깅을 한다.


프로그램이 원하는 방향과 동일하게 동작하는지 테스트한다. 오류가 발생할 경우 디버깅을 수행한다. 멀티 스레드의 디버깅은 순차 프로그램보다 까다롭다. 멀티 스레드 프로그램에서 버그가 발생했을 때, 스레드 개수를 1개로 줄여서 순차 프로그램처럼 만든 후 같은 오류가 발생하는지 살펴본다. 순차 프로그램에서 수행한 후 오류가 없거나 멀티 스레드 프로그램에서 오류 발생 빈도가 불규칙하다면 데이터 경합에서 발생하는 경우가 많다.


빠른 디버깅을 위해서 인텔 Parallel Studio와 같은 멀티 스레딩 툴의 도움을 받는것도 좋은방법이다.



7. 순차 프로그램과 병렬 프로그램의 성능 평가를 수행한다.


병렬 프로그램으로 변경하였을 경우 반드시 순차 프로그램과 성능 비교 평가를 하여 얼마나 개선되었는지를 분석해야 한다. 만일 순차 프로그램보다 성능이 떨어지거나 개선된 수치가 미비하다면 많은 시간과 노력을 들여 병렬화한 의미가 없다.


반드시 순차 프로그램보다 얼마나 개선되었는지를 계속 평가해얌ㄴ 병렬 프로그램을 개발하는 노하우가 지속해서 쌓이게 된다.




반응형
LIST