[openmp] omp 병렬 대 omp 병렬

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

[ㅏ]

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

[비]

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



답변

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

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

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

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

https://openmp.org/specifications/


답변

이것들은 동등합니다.

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


답변

다음은 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
}


답변

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


답변

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


답변

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

#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/


답변