2011-01-06 14 views
5

In una funzione membro, posso parallelizzare usando la variabile membro condiviso int *x come questoPerché la variabile membro della classe x non può essere condivisa (x) in OpenMP?

#pragma omp parallel for default(shared) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

Ma se provo

#pragma omp parallel for default(none) shared(x,size) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

ottengo l'errore: 'obj::x' is not a variable in clause 'shared'. Preferirei la seconda versione perché annuncia le variabili condivise con cui sta lavorando, ricordandomi che non ci sono condizioni di gara o problemi simili.

Cosa sta succedendo che OpenMP afferma che obj::x non è una variabile?

+0

hai provato questo-> x? anche quale compilatore stai usando? – Beanz

+0

il compilatore è g ++ 4.4. Provando '#pragma omp parallelo per default (nessuno) condiviso (this-> x, dimensione)' fornisce l'errore 'error: id non previsto prima di 'this'' –

risposta

11

La maggior parte delle implementazioni di OpenMP delineano regione parallelo. Cioè, lo rendono una funzione. Le variabili private vengono generalmente passate a questa funzione e le variabili condivise possono essere passate o rientrare nell'ambito della funzione. Il problema con i membri dei dati di classe è che non sono uguali alle variabili.

Quando il compilatore delinea una regione parallela, le variabili hanno posizioni di memoria definite che il compilatore può impostare per passare alla funzione. I membri di dati non possono essere istanziati (cioè, allocazione di memoria) finché la classe non viene chiamata durante l'esecuzione del programma. Ciò significa che il compilatore non può privatizzare da solo i membri dei dati. Dovrebbe anche essere fatto nel runtime e questo causerebbe molto più lavoro e influenzerebbe le prestazioni di entrambi i programmi seriali e paralleli. Finora nessuna implementazione ha provato a fare questo lavoro e poiché la specifica OpenMP è stata scritta per consenso è stata presa la decisione di non consentire ai membri dei dati in tutte le clausole. Altrimenti, è sembrato troppo confusionario dire che sono permessi in clausole condivise, ma nessuna altra clausola.

1

Non so precisiely - ma uno sguardo attraverso 32 OpenMP traps for C++ developers per sistemare la maggior parte dei problemi di OpenMP

+1

Grazie per il collegamento! –

+0

Non ho trovato alcun riferimento alla mia domanda nel documento collegato. Può essere più preciso? –

+0

Scusa se non ho una risposta precisa, speravo che ci fosse qualcosa nel link per aiutarti –

Problemi correlati