Perché il compilatore intel non consente di specificare che alcune azioni in un blocco parallel for
devono essere eseguite solo dal thread principale?il pragma "master" di OpenMP non deve essere racchiuso dal "parallelo per" pragma
E come posso fare quello che sto cercando di ottenere senza questo tipo di funzionalità?
Quello che sto cercando di fare è aggiornare una barra di avanzamento attraverso una richiamata in un parallelo per:
long num_items_computed = 0;
#pragma omp parallel for schedule (guided)
for (...a range of items...)
{
//update item count
#pragma omp atomic
num_items_computed++;
//update progress bar with number of items computed
//master thread only due to com marshalling
#pragma omp master
set_progressor_callback(num_items_computed);
//actual computation goes here
...blah...
}
Voglio solo il thread principale per chiamare la callback, perché se io non rispettare tale (ad esempio utilizzando omp critical
invece di garantire un solo thread utilizza il callback in una sola volta) ottengo la seguente eccezione di runtime:
The application called an interface that was marshalled for a different thread.
... da qui il desiderio di mantenere tutte le richiamate nel thread master.
Grazie in anticipo.
Questo sembra funzionare, grazie. Ero preoccupato che il thread principale potesse essere diverso da tutti i thread di lavoro ... quindi quella callback non sarebbe mai stata eseguita ... è pensabile all'interno della specifica omp? –
Se il numero di iterazioni è elevato, non si noterà la differenza. E dopo l'aggiunta del ciclo: if (omp_get_thread_num() == 0) set_progressor_callback (num_items_computed); –
da OpenMP standart su pragma omp parallel for(): "Il costrutto del ciclo specifica che le iterazioni di uno o più loop associati verranno eseguite in parallelo dai thread nel team nel contesto delle loro attività implicite.Le iterazioni sono distribuite su thread già esistenti nel team che esegue la regione parallela alla quale si lega l'area del loop. " –