2012-05-04 14 views
8

czy jest niejawne bariera OMP po omp krytycznym punkcieistnieje niejawna bariery, po omp krytycznym punkcie

Na przykład, można zmodyfikować ten po numerze wersji-1 w wersji-2.

WERSJA-1

int min = 100; 
#pragma omp parallel 
{ 
    int localmin = min; 

    #pragma omp for schedule(static) 
    for(int i = 0; i < 1000; i++) 
     localmin = std::min(localmin, arr[i]); 

    #pragma omp critical 
    { 
     min = std::min(localmin, min) 
    } 
} 

WERSJA-2

int min = 100; 
#pragma omp parallel 
{ 
    int localmin = min; 

    #pragma omp for schedule(static) nowait 
    for(int i = 0; i < 1000; i++) 
     localmin = std::min(localmin, arr[i]); 

    #pragma omp critical 
    { 
     min = std::min(localmin, min) 
    } 
} // will I get the right "min" after this (because I have included nowait) 

Will uzyskać ten sam wynik dla obu wersji i wersji-1-2?

Czy istnieje domniemana bariera po regionie krytycznym?

EDIT: Niestety jeśli przykładem jest bardzo słaba .. Również chciałbym wiedzieć, czy nie byłoby żadnej różnicy wydajności między wersją-1 i wersji 2-

+0

To chyba nie jest najlepszy przykład, ponieważ po opuszczeniu równoległego regionu będzie bariera. Ale dobre pytanie. +1 – Mysticial

+0

Nie ma korzyści z wydajności w wersji v2 w stosunku do wersji v1 w przykładach, które opublikowałeś, ale w prawdziwym świecie może być. –

Odpowiedz

11

sekcje krytyczne nie mają barier ani na początku, ani na ich końcu. Sekcja krytyczna jest samodzielną konstrukcją synchornizacji, która zapobiega równoczesnemu uzyskiwaniu dostępu do tych samych danych przez wiele wątków. Potrzebujesz dodatkowej bariery po sekcji krytycznej, jeśli chcesz mieć poprawne globalne minimum, zanim opuścisz równoległy region. Jak już zostało powiedziane, region równoległy na końcu ma ukrytą barierę.

0

Otrzymasz korzyści związane z wydajnością, używając nowoit, jeśli istnieje duża liczba iteracji.