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-
To chyba nie jest najlepszy przykład, ponieważ po opuszczeniu równoległego regionu będzie bariera. Ale dobre pytanie. +1 – Mysticial
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ć. –