omp 병렬 대 omp 병렬


105

이 둘의 차이점은 무엇입니까?

[ㅏ]

#pragma omp parallel
{ 
    #pragma omp for
    for(int i = 1; i < 100; ++i)
    {
        ...
    }
}

[비]

#pragma omp parallel for
for(int i = 1; i < 100; ++i)
{
   ...
}

답변:


65

나는 차이가 없다고 생각합니다. 하나는 다른 하나의 지름길입니다. 정확한 구현은 다르게 처리 할 수 ​​있습니다.

결합 된 병렬 작업 공유 구성은 하나의 작업 공유 구성 만 포함하고 다른 명령문은 포함하지 않는 병렬 구성을 지정하기위한 바로 가기입니다. 허용되는 조항은 병렬 및 작업 공유 구조에 허용 된 조항의 결합입니다.

http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf 에서 가져옴

OpenMP의 사양은 다음과 같습니다.

https://openmp.org/specifications/


66

이것들은 동등합니다.

#pragma omp parallel스레드 그룹을 생성 #pragma omp for하고 생성 된 스레드간에 루프 반복 을 나눕니다. fused #pragma omp parallel for지시문으로 두 가지를 동시에 수행 할 수 있습니다 .


내 코드에서는이 구조를 사용하고 있습니다. 그러나 schedule(static, chunk)지시문을 위해 절을 사용 하면 문제가 발생합니다. 코드는 잘 실행되지만 MPI 프로그램에서이 코드를 호출하면 무한 루프가 발생합니다. 루프 카운터는이 루프의 모든 반복에서 0입니다. #pragma omp parallel지시문에 개인으로 정의 된 루프 카운터가 있습니다. MPI가 코드를 호출 할 때만 실패하는 이유를 모릅니다. 중요한 경우 각 MPI 프로세스가 클러스터의 다른 프로세서에서 실행되고 있다고 확신합니다. 일정이 문제를 일으키는 지 알 수 없습니다.
Rohit Banga 2011 년

#pragma omp parallel for지시문을 사용할 때도 똑같은 것이 잘 작동합니다 . 약간의 차이가 있어야합니다.
Rohit Banga 2011 년

1
업데이트 : 결과적으로 일정 절을 사용할 때만이 문제를 관찰하고 있으므로 결합 된 병렬을 사용하는지 아니면 두 가지 다른 지시문을 사용하는지에 의존하지 않는 것 같습니다.
Rohit Banga 2011 년

28

다음은 Separated paralleland for here 사용의 예입니다 . 요컨대 for여러 스레드에서주기를 실행하기 전에 OpenMP 스레드-개인 배열의 동적 할당에 사용할 수 있습니다 . parallel for경우에 따라 동일한 초기화를 할 수 없습니다 .

UPD : 질문 예에서 단일 pragma와 두 pragma간에 차이가 없습니다. 그러나 실제로는 분리 된 병렬 및 지시문을 사용하여 더 많은 스레드 인식 동작을 만들 수 있습니다. 예를 들어 일부 코드 :

#pragma omp parallel
{ 
    double *data = (double*)malloc(...); // this data is thread private

    #pragma omp for
    for(1...100) // first parallelized cycle
    {
    }

    #pragma omp single 
    {} // make some single thread processing

    #pragma omp for // second parallelized cycle
    for(1...100)
    {
    }

    #pragma omp single 
    {} // make some single thread processing again

    free(data); // free thread private data
}

9

다른 답변에서 이미 언급했듯이 특정 예제의 두 버전은 동일하지만 여전히 작은 차이가 하나 있습니다. 첫 번째 버전에는 "omp for"끝에있는 불필요한 암시 적 장벽이 포함되어 있습니다. 다른 암시 적 장벽은 평행 영역의 끝에서 찾을 수 있습니다. "omp for"에 "nowait"를 추가하면 최소한 OpenMP 관점에서 두 코드가 동일하게됩니다. OpenMP 컴파일러가 두 경우에 대해 약간 다른 코드를 생성 할 수 있기 때문에 이것을 언급합니다.


7

g ++ 4.7.0에서 for 루프를 사용하고 사용할 때 완전히 다른 런타임이 보입니다.

std::vector<double> x;
std::vector<double> y;
std::vector<double> prod;

for (int i = 0; i < 5000000; i++)
{
   double r1 = ((double)rand() / double(RAND_MAX)) * 5;
   double r2 = ((double)rand() / double(RAND_MAX)) * 5;
   x.push_back(r1);
   y.push_back(r2);
}

int sz = x.size();

#pragma omp parallel for

for (int i = 0; i< sz; i++)
   prod[i] = x[i] * y[i];

직렬 코드 (아니오 openmp)는 79ms에 실행됩니다. "parallel for"코드는 29ms 안에 실행됩니다. 를 생략하고 for를 사용 #pragma omp parallel하면 런타임이 최대 179ms까지 촬영되며 이는 직렬 코드보다 느립니다. (머신은 8의 hw 동시성을 가짐)

코드 링크 libgomp


2
나는 omp parallel이 스레드로 나누지 않고 별도의 스레드에서 루프를 실행하기 때문에 메인 스레드가 두 번째 스레드가 완료되기를 기다리고 있기 때문이라고 생각합니다. 동기화에 시간이 소요됩니다.
Antigluk

7
왜냐하면 a #pragma omp for가 없으면 루프의 다중 스레드 공유가 전혀 없기 때문 입니다. 그러나 그것은 어쨌든 OP의 경우가 아니 었습니다. #pragma omp for내부에 추가로 다시 시도 #pragm omp parallel하면 #pragma omp parallel for버전 과 비슷하게 (동일하지 않은 경우) 실행 됩니다.
Christian Rau

2
나는 그들이 "동등"없습니다 같이 최선의 하나로서이 답변을 참조
과학자 실패

6

분명히 많은 답변이 있지만 이것은 매우 훌륭하게 답변합니다 (출처 포함)

#pragma omp for현재 팀의 다른 스레드에 대해 루프의 일부만 위임 합니다. 팀은 프로그램을 실행하는 스레드 그룹입니다. 프로그램 시작시 팀은 프로그램을 실행하는 마스터 스레드 인 단일 구성원 으로 만 구성됩니다 .

새 스레드 팀을 만들려면 parallel 키워드를 지정해야합니다. 주변 컨텍스트에서 지정할 수 있습니다.

#pragma omp parallel
{
   #pragma omp for
   for(int n = 0; n < 10; ++n)
   printf(" %d", n);
}

과:

무엇입니까 : 병렬, for 및 팀

parallel, parallel for 및 for의 차이점은 다음과 같습니다.

팀은 현재 실행중인 스레드 그룹입니다. 프로그램 시작시 팀은 단일 스레드로 구성됩니다. 병렬 구조는 다음 블록 / 문의 기간 동안 현재 스레드를 새 스레드 팀으로 분할 한 후 팀이 다시 하나로 병합합니다. for는 현재 팀의 스레드간에 for 루프의 작업을 나눕니다.

스레드를 생성하지 않고 현재 실행중인 팀의 스레드간에 작업을 나눕니다. parallel for는 한 번에 두 명령 인 parallel 및 for의 약어입니다. Parallel은 새 팀을 만들고 분할을 위해 해당 팀이 루프의 다른 부분을 처리합니다. 프로그램에 병렬 구조가 포함되어 있지 않으면 스레드가 하나만 있습니다. 비-스레딩 프로그램에서와 같이 프로그램을 시작하고 실행하는 마스터 스레드.

https://bisqwit.iki.fi/story/howto/openmp/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.