본문 바로가기

Programming/OpenMP

(6)
OpenMP 동기제어 지시어 OpenMP 동기제어 멀티스레딩으로 프로그램을 제작할 때, 자주 발생하면서도 찾기 어려운 것이 동기화로 인해 발생하는 문제이다. OpenMP는 병렬영역에서 데이터 액세스 동기나 코드 실행의 동기를 제어하는 지시어를 지원한다.master, atomic, critical, barrier, taskwait, flush, ordered 지시어가 있는데 각각 지시어들의 사용법과 특징을 알아본다. 1. master 지시어스레드 팀에서 마스터 스레드에 의해서만 해당 코드가 실행되도록 한다.#pragma omp master 지시어는 암시적 동기화를 지원하지 않기 때문에, 다른 스레드들은 이후에 나오는 코드를 수행하게 된다. 마스터 스레드의 처리 완료때 까지 대기하려면 barrier 지시어를 사용해야 한다. 2. bar..
OpenMP 작업 분할(Work Sharing) 지시어 작업 분할(Work Sharing) 지시어 수행해야 할 작업들을 생성된 스레드 팀에 적절하게 배분하여, 병렬 수행하도록 지정하는 지시어를 작업 분할 지시어라고 한다. for 지시어, sections 지시어, single 지시어, task 지시어가 있다. 1. for 지시어for 지시어는 #pragma omp parallel 영역 안에서 사용되며, #pragma omp for 지시어 다음에 오는 for루프 문을 병렬화 한다.for 루프 문을 수행할 때 작업을 배분해주는 양이나 방법을 정하는 규칙을 스케줄(schedule)이라고 한다. for 루프 문의 디폴트 스케줄은 static으로 반복 루프 수행할 총 횟수를 스레드에 개수로 나누어 스레드 별로 동일하게 배분해준다. 문법#pragma omp for [보조..
OpenMP 지시어(Directive) OpenMP 지시어 OpenMP지시어의 사용법을 익히면 생성된 멀티 스레드를 더 자유롭게 제어하고 순차 프로그램보다 훨씬 뛰어난 성능을 얻을 수 있다.OpenMP 지시어는 #pragma omp 구문 이후에 단독으로 지시어를 사용하여 병렬처리에 대한 주된 활용을 지정할 때 사용한다. 스레드의 병렬영역, 작업 분할, 실행 순서, 동기화와 같은 큰 흐름을 정의한다. (1) 병렬처리 제어OpenMP에 의한 병렬 영역을 정의한다. - 병렬영역(Parallel Regions) 지시어#pragma omp parallel 지시어 - 작업분할(Worksharing) 지시어#pragma omp for 지시어 #pragma omp sections 지시어#pragma omp single 지시어#pragma omp task 지..
OpenMP 스레드 메모리 공간 이해하기 스레드 메모리 공간 각각의 객체는 고유한 메모리 영역을 가지게 된다. 클래스, 글로벌, 정적변수, 동적 메모리와 같이 다양한 객체들이 자신들 변수를 소유한다. OpenMP가 지원하는 스레드들도 각각의 고유한 메모리 영역을 가지게 되는데, 이것을 잘 구분해야만 병렬처리를 하면서 작업을 배분하거나 결과를 얻어낼 때 데이터 경쟁 같은 오류를 막을 수 있다. 공유 메모리 영역#pragma omp parallel 지시어 영역 밖에 있는 메모리 변수는 생성된 스레드가 공유할 수 있다. 모든 스레드가 읽고 쓰기를 할 수 있다고 하여 공유 메모리(shared)변수라고 한다. 만일 2개의 스레드가 하나의 변수의 값을 수정하면 어떻게 동작하게 될지 살펴보자. 0으로 초기화 된 공유 메모리 변수 x가 있다. 0번 스레드가 ..
OpenMP (반복루프, 작업, 태스크)의 병렬처리 방법 반복 루프의 병렬처리 반복 루프 작업을 여러 개의 스레드로 나누어 빠르게 처리할 수 있는 방법을 알아본다. OpenMP 지시어는 다음과 같은 의미로 쓰이게 된다. 1. #pragma omp parallel : 지정된 스레드에 맞춰 스레드를 생성해 주세요.2. #pragma omp for : 다음에 나오는 for 루프 작업을 생선된 스레드에 맞춰서 배분해 주세요. // for 루프 작업 분할이 된 병렬프로그램 // forparallel.c #include "stdafx.h" #include #include "math.h" int _tmain(int argc, _TCHAR* argv[]) { const int MAX = 100000000; float* Data; Data = new float[MAX]; in..
OpenMP 병렬 프로그래밍 구현 순서 병렬 프로그래밍 구현 순서 Multi-Thread 프로그래밍의 특징을 보면 다음과 같다. 1. 병렬화할 부분을 찾아낸다. 순차 프로그램의 모든 부븐을 병렬 프로그램으로 변경할 수는 없다. 병렬화 부분이 많으면 많을 수록 프로그램의 성능이 향상되지만, 그만큼 시간과 자원이 많이 들어가게 된다.따라서 해당하는 프로젝트의 환경에 따라 얼마나 많은 부분을 병렬화 할지에 대한 판탄을 해야한다. 시간과 자원이 많이 있고, 프로그램의 성능이 향항이 중요하면 병렬화를 최대한 많이 적용하면 될 것이고, 그렇지 않으면 가장 필수적인 부분을 병렬화하도록 선택해야 한다.병렬화할 부분을 선택하는 기준은 다음과 같다.1) 프로그램을 실행하였을 때 가장 많은 시간이 할당되는 부분을 찾는다. 동작 시간이 가장 많이 대체로 프로그램의..