Sì, è possibile - la clausola di riduzione è applicabile a tutta la regione in parallelo, così come ai singoli for
costrutti condivisione del lavoro. Ciò consente ad es. riduzione su calcoli realizzati in diverse sezioni parallele (il modo preferito di ristrutturare il codice):
#pragma omp parallel sections private(val) reduction(+:sum)
{
#pragma omp section
{
bla bla code
sum += val;
}
#pragma omp section
{
bla bla code
sum += val;
}
}
È anche possibile utilizzare l'OpenMP for
worksharing costrutto di distribuire automaticamente le iterazioni del ciclo tra i fili nella squadra invece reimplementando utilizzando sezioni:
#pragma omp parallel for private(val) reduction(+:sum)
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
}
nota che le variabili di riduzione sono private ei loro valori intermedi (cioè il valore tengono prima della riduzione alla fine della regione parallel
) sono solo parziali e non molto utile. Ad esempio il seguente ciclo seriale non può essere (facilmente?) Trasformato in uno parallelo con operazione di riduzione:
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
if (sum > threshold)
yada yada code
}
Qui il yada yada code
deve essere eseguito in ogni iterazione volta il valore accumulato di sum
ha superato il valore di threshold
. Quando il ciclo viene eseguito in parallelo, i valori privati di sum
potrebbero non raggiungere mai threshold
, anche se la loro somma lo fa.
fonte
2012-11-08 14:13:03
Se egli chiama ordinato con quel tipo di distribuzione, perde la maggior parte del parallelismo. – dreamcrash
@dreamcrash, se implementato correttamente, l'esecuzione ordinata potrebbe non uccidere la maggior parte del parallelismo - si veda [questa risposta] (http://stackoverflow.com/a/13230816/1374437). –
Esattamente, non dobbiamo usare la statica con la dimensione del blocco predefinito. – dreamcrash