정보공간_1

[2기 전주 박준형] OpenMP 반복루프, 작업의 병렬처리 본문

IT 놀이터/Elite Member Tech & Talk

[2기 전주 박준형] OpenMP 반복루프, 작업의 병렬처리

알 수 없는 사용자 2012. 10. 29. 04:35

 

반복 루프의 병렬처리 

 

  반복 푸르 작업을 여러 개의 스레드에 분할하여 빠르게 처리할 수 있는 방법에 대해 알아보겠습니다.

 

  순차 프로그램의 루프 작업 시간과 병렬처리 프로그램 루프작업의 대한 코드와 수행 시간에 대한 예를 들어 보겠습니다.

 

1억개의 float 배열을 생성하여 Math.h안의 sqrt 함수를 이용해서 루트 값을 계산하는 순차 프로그램입니다. 배열 0~99999999 의 메모리 공간 1억개에 값을 대입한 후 5개의 값과 for 루프 계산 시간을 출력합니다.

 

다음은 OpenMP 병렬처리를 적용한 것입니다.

 

 

약 두배 시간이 단축 되었습니다.

 

#pragma omp parallel num_thread(2) -> 2개의 스레드를 생성해라

#pragma omp for -> 다음 for 루프 작업을 생성된 스레드에 맞춰 배분해라

 

라는 뜻이며 2개의 스레드는

 

0 번 스레드 -> for( i=0; i<50000000; i++)

1 번 스레드 -> for( i=50000000; i<100000000; i++)

 

로 처리가 된다. for 루프 작업을 스레드 개수에 맞추어 자동으로 분배해주는 것입니다.

그림으로 표현하자면...

 

 

 

 

 

 

 

작업의 병렬처리 

 

각기 다른 작업을 여러개의 스레드가 작업 종류별로 처리하는 것입니다.

 

작업은 2가지가 있는 예를 들어보겠습니다.  

작업 0 (0번 스레드) -> 루트 값 계산 

작업 1 (1번 스레드) -> 로그 값 계산 

 

 

 

 

약 1.6초의 시간이 걸립니다. 이번에는 1천만개의 float 배열을 가지고 루트와 로그를 계산한 결과입니다.

순차 프로그램이므로 루트를 계산한 후에 로그를 계산한 것입니다.

 

이번엔 이 작업들을 병렬화한 코드입니다.

 

 

작업 병렬처리는 약 0.9초의 시간이 걸립니다.

 

#pragma omp parallel num_thread(2) -> 2개의 스레드를 생성

#pragma omp sections -> 여러개의 작업을 배분하기 위한 영역

#pragma omp section -> 하나의 스레드를 배분

 

이는 루트 계산 함수와 로그 계산 함수를 각각의 작업 단위로 지정

즉 #pragma omp sections 지시어와 #pragma omp section 지시어를 통해 작업을 배분 받습니다.

 

순차 프로그램에서의 작업시간은 총 작업시간 = 작업 A의 소요시간 + 작업 B의 소요시간입니다.

 하지만 병렬 프로그램에서는 어떠한 스레드가 먼저 끝나게 되지는 알수 없으므로 가장 작업량이 많아 오래 걸리는 작업의 스레드가 총 작업 시간이 됩니다.