답변:
나는 차이가 없다고 생각합니다. 하나는 다른 하나의 지름길입니다. 정확한 구현은 다르게 처리 할 수 있습니다.
결합 된 병렬 작업 공유 구성은 하나의 작업 공유 구성 만 포함하고 다른 명령문은 포함하지 않는 병렬 구성을 지정하기위한 바로 가기입니다. 허용되는 조항은 병렬 및 작업 공유 구조에 허용 된 조항의 결합입니다.
http://www.openmp.org/mp-documents/OpenMP3.0-SummarySpec.pdf 에서 가져옴
OpenMP의 사양은 다음과 같습니다.
이것들은 동등합니다.
#pragma omp parallel
스레드 그룹을 생성 #pragma omp for
하고 생성 된 스레드간에 루프 반복 을 나눕니다. fused #pragma omp parallel for
지시문으로 두 가지를 동시에 수행 할 수 있습니다 .
#pragma omp parallel for
지시문을 사용할 때도 똑같은 것이 잘 작동합니다 . 약간의 차이가 있어야합니다.
다음은 Separated parallel
and 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
}
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
가 없으면 루프의 다중 스레드 공유가 전혀 없기 때문 입니다. 그러나 그것은 어쨌든 OP의 경우가 아니 었습니다. #pragma omp for
내부에 추가로 다시 시도 #pragm omp parallel
하면 #pragma omp parallel for
버전 과 비슷하게 (동일하지 않은 경우) 실행 됩니다.
분명히 많은 답변이 있지만 이것은 매우 훌륭하게 답변합니다 (출처 포함)
#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은 새 팀을 만들고 분할을 위해 해당 팀이 루프의 다른 부분을 처리합니다. 프로그램에 병렬 구조가 포함되어 있지 않으면 스레드가 하나만 있습니다. 비-스레딩 프로그램에서와 같이 프로그램을 시작하고 실행하는 마스터 스레드.
schedule(static, chunk)
지시문을 위해 절을 사용 하면 문제가 발생합니다. 코드는 잘 실행되지만 MPI 프로그램에서이 코드를 호출하면 무한 루프가 발생합니다. 루프 카운터는이 루프의 모든 반복에서 0입니다.#pragma omp parallel
지시문에 개인으로 정의 된 루프 카운터가 있습니다. MPI가 코드를 호출 할 때만 실패하는 이유를 모릅니다. 중요한 경우 각 MPI 프로세스가 클러스터의 다른 프로세서에서 실행되고 있다고 확신합니다. 일정이 문제를 일으키는 지 알 수 없습니다.