OpenMP를 사용하여 간단한 응용 프로그램을 작성하려고합니다. 불행히도 나는 speedup에 대한 문제가있다. 이 응용 프로그램에서는 루프가 하나 있습니다. 이 루프의 본문은 순차적으로 수행되어야하는 명령어와 루프에 대한 명령어로 구성됩니다. 나는이 루프를 병렬로 만들기 위해 #pragma omp parallel for
을 사용한다. 이 루프는 많은 작업을하지는 않지만 매우 자주 호출됩니다.OpenMP - 한 번만 스레드 만들기
두 개의 for 루프 버전을 준비하고 1, 2 및 4 코어에서 응용 프로그램을 실행합니다.
버전 1 (for 루프의 반복 횟수 : 22 초, 23 초, 26 초).
버전 2 (for 루프에서 100000 반복) : 20 초, 10 초, 6 초
앞에서 볼 수 있듯이 for 루프에 많은 작업이 없으면 2 코어 및 4 코어의 시간이 1 코어보다 높습니다. 그 이유는 #pragma omp parallel for
은 while 회 돌이마다 새로운 스레드를 생성한다는 것입니다. 그래서, 나는 당신에게 물어볼 것이다. - while 루프 이전에 한 번 쓰레드를 만들 수있는 가능성이 있는가? while 루프의 일부 작업이 순차적으로 수행 될 수 있도록 보장 할 것인가?
#include <omp.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char* argv[])
{
double sum = 0;
while (true)
{
// ...
// some work which should be done sequentially
// ...
#pragma omp parallel for num_threads(atoi(argv[1])) reduction(+:sum)
for(int j=0; j<4; ++j) // version 2: for(int j=0; j<100000; ++j)
{
double x = pow(j, 3.0);
x = sqrt(x);
x = sin(x);
x = cos(x);
x = tan(x);
sum += x;
double y = pow(j, 3.0);
y = sqrt(y);
y = sin(y);
y = cos(y);
y = tan(y);
sum += y;
double z = pow(j, 3.0);
z = sqrt(z);
z = sin(z);
z = cos(z);
z = tan(z);
sum += z;
}
if (sum > 100000000)
{
break;
}
}
return 0;
}