정보공간_1

[2기 전주 박준형] OpenMP 프로그래밍 개요 본문

IT 놀이터/Elite Member Tech & Talk

[2기 전주 박준형] OpenMP 프로그래밍 개요

알 수 없는 사용자 2012. 9. 26. 06:20

OpenMP 프로그래밍??

OpenMP(Open Multi-Processing)는 공유 메모리 다중 처리 프로그래밍 API로 C, C++, 포트란 언어와, 유닉스 및 마이크로소프트 윈도우 플랫폼을 비롯한 여러 플랫폼을 지원합니다..

이는 공유 메로리 병렬화를 이용하고자 수행하던 작업들을 간편화하여 손쉽게 사용할 수 있습니다. 윈도우와 리눅스에서 사용하던 복잡한 부가적인 과정을 개선하고, 기존의 싱글스레드 프로그램에서 3~4개의 지시어만 추가하면 멀티스레도 동작하게 됩니다.

 

 

싱글스레드 Hello World를 Windows 병렬 Hello World로 바꿔주었으며, Thread의 갯수를 4개 정하고 이를 생성하기 위해 4개의 핸들을 가진 배열에 할당하였습니다..

CreateThread -> 스레드를 생성하기 위한 Windows API 함수

WaitForMultipleObjects -> 모든 스레드가 작업을 완료할 때까지 메인 함수가 완료 되는 것을 방지

 

병렬화 코드에서 미리 설정된 스레드 개수에 따라 복수의 스레드가 프로그램의 동작을 실행하게 됩니다.

#paragma omp parallel -> 마스터 클래스가 자신을 포함하여 설정된 개수에 맞게 복수의 스레드

생성(FORK)

num_threads(4) -> 보조 지시어. 스레드 4개로 동작하라!! 마스터 스레드(1) + 슬레이브 스레드(3)

JOIN -> 병렬 영역의 스레드가 지정된 작업을 모두 완료하여 마스터 스레드를 제외한 슬레이브

스레드가 모두 소멸하는 것입니다.

 

윈도우와 리눅스의 멀티스레드 구현

  • 병렬화할 부분을 찾아낸다. ex) printf("Hello world\n")
  • 병렬화할 부분을 별도 함수로 분리시킨다. ex) PrintHelloWorld(LPVOID arg)
  • 별도의 스레드를 생성하여 작업할 함수를 연결한다. ex) CreateThread( , , PrintHelloWorld, , ,)
  • 동기화가 필요하면 동기화 기능을 구현한다.
  • 메인 스레드는 별도 생성된 작업 스레드의 작업 완료를 기다린다. ex) WaitForMultipleObjects

 

OpenMP의 멀티스레드 구현

  • 병렬화할 부분을 찾아낸다.
  • 동기화가 필요하면 동기화 기능을 구현한다.
  • 프로그램의 오류가 발생하면 디버깅을 한다.
  • 순차 프로그램과 병렬 프로그램의 성능을 평가한다.

기존의 윈도우나 리눅스에서 멀티스레드 프로그래밍을 위해 구현했던 과정이 줄어든 것을 확인 할 수 있습니다.

생략된 부분은 프로그래머가 구현할 필요가 없이 OpenMP에서 자동으로 지원해줍니다.

OpenMP는 3~4개의 지시어 추가로 멀티스레드 지원을 받을 수 있고, 병렬화할 부분을 별도 함수로 만들거나 스레드를 생성하는 코드를 직접 만들 필요가 없습니다. 메인 스레드도 작업 구문을 함께 수행하며 디폴트로 작업 스레드의 작업 완료를 기다립니다.