Tak, można - klauzula ograniczenie ma zastosowanie do całego regionu, jak również równolegle do indywidualnych for
Worksharing konstruktów. Pozwala to na np. Redukcję w obliczeń wykonanych w różnych sekcjach równoległych (preferowany sposób restrukturyzacji kodu)
#pragma omp parallel sections private(val) reduction(+:sum)
{
#pragma omp section
{
bla bla code
sum += val;
}
#pragma omp section
{
bla bla code
sum += val;
}
}
Można również użyć OpenMP for
podziału pracy konstrukt automatycznego rozprowadzania iteracji pętli między gwintu w zespole zamiast reimplementing go przy użyciu sekcje:
#pragma omp parallel for private(val) reduction(+:sum)
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
}
pamiętać, że zmienne są prywatne i zmniejszenie ich wartości pośrednie (czyli wartości trzymają przed redukcją na koniec regionu parallel
) są tylko częściowo i niezbyt użyteczne. Przykładowo, następną pętlę seryjny nie może być (łatwo?) Przekształca się równolegle jedna z operacji redukcyjnej
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
if (sum > threshold)
yada yada code
}
Tutaj yada yada code
powinny być wykonywane w każdej iteracji, gdy skumulowana wartość sum
przeszedł wartość threshold
. Gdy pętla działa równolegle, prywatne wartości sum
mogą nigdy nie osiągnąć threshold
, nawet jeśli ich suma się uda.
Jeśli dzwoni zamówiony z tego rodzaju dystrybucją, traci większość paralelizmu. – dreamcrash
@dreamcrash, jeśli jest poprawnie zaimplementowany, wykonanie polecenia może nie zabić większości paralelizmu - patrz [ta odpowiedź] (http://stackoverflow.com/a/13230816/1374437). –
Dokładnie, nie możemy używać statycznego dla domyślnego rozmiaru porcji. – dreamcrash