이 둘의 차이점은 무엇입니까?
[ㅏ]
#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 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
}
답변
다른 답변에서 이미 언급했듯이 특정 예제의 두 버전은 동일하지만 여전히 작은 차이가 하나 있습니다. 첫 번째 버전에는 “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은 새 팀을 만들고 분할을 위해 해당 팀이 루프의 다른 부분을 처리합니다. 프로그램에 병렬 구조가 포함되어 있지 않으면 스레드가 하나만 있습니다. 비-스레딩 프로그램에서와 같이 프로그램을 시작하고 실행하는 마스터 스레드.