OpenMP를 사용하여 병렬 처리 한 outer for 루프가 있습니다. 그러나이 for 루프에는 병렬로 실행될 수있는 코드 섹션이 있습니다.omp 병렬 섹션 내에서 openmp 병렬 섹션?
OpenMP 섹션 절을 사용하여 병렬 처리 할 수 있습니까? 이것은 가능한가? for 루프의 각 반복은 단 하나의 스레드에 의해 실행되므로 각 반복 내에서 병렬로 여러 스레드에서 실행되는 코드 섹션을 요청할 수 있습니까? 나머지 코드는 하나의 스레드, 즉 해당 루프 반복이 할당 된 스레드에 의해 실행되어야합니다.
예 :
omp_p = omp_get_max_threads();
omp_set_nested(1);
#pragma omp parallel for num_threads(omp_p/2)
for(int p=0;p<omp_p/2;p++){
size_t a = (p*N)/(omp_p/2);
size_t b = ((p+1)*N)/(omp_p/2);
for(int i=a;i<b;i++){
/*Work on A[a]->A[b]*/
for(int j=0;j<n;j++){
for(int k=0;k<N;k++){
/*Serial code*/
#pragma omp parallel sections
{
#pragma omp section
{
}
#pragma omp section
{
}
}
/*Serial work*/
#pragma omp parallel sections
{
#pragma omp section
{
}
#pragma omp section
{
}
}
/*Serial code*/
}
}
}
}
이것은 내가 모든 병렬 부분을 사용하지 않은 경우보다 훨씬 느리게 갈 수있는 프로그램을 일으키는 ..
중첩 된 병렬 처리로 인한 엄청난 오버 헤드 외에도 'i','j' 및'k' 루프 카운터는 기본 공유 클래스 인'shared'를 가져 오며 명시 적으로'private'로 선언되어야합니다. –
아, 죄송합니다. for() 중괄호 안에 int로 선언하는 것을 잊었습니다. 이걸 수정했습니다 .. – user1715122
단순히 모든 스레드 사이에서 루프를 분해하고 내부 루프의 모든 것을 직렬로 실행하지 못하게하는 이유는 무엇입니까? 'N'은 쓰레드의 수에 비해 너무 적습니까? –