2012-11-02 17 views
7

Vai a questa funzione (prodotto matrice-vettore):OpenMP: predeterminato 'condiviso' per 'condiviso'?

std::vector<double> times(std::vector<std::vector<double> > const& A, std::vector<double> const& b, int m, int n) { 

    std::vector<double> c; 
    c.resize(n); 

    int i, j; 
    double sum; 

    #pragma omp parallel for default(none) private(i, j, sum) shared(m, n, A, b, c) 
    for (i = 0; i < m; ++i) { 
     sum = 0.0; 
     for (j = 0; j < n; j++) { 
      sum += A[i][j] * b[j]; 
     } 
     c[i] = sum; 
    } 

    return c; 
} 

Quando si cerca di compilare questo con OpenMP, il compilatore non riesce con:

Invoking: GCC C++ Compiler 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -fopenmp -MMD -MP -MF"src/OpemMPTutorial.d" -MT"src/OpemMPTutorial.d" -o "src/OpemMPTutorial.o" "../src/OpemMPTutorial.cpp" 
../src/OpemMPTutorial.cpp:127: warning: ignoring #pragma omp end 
../src/OpemMPTutorial.cpp: In function 'std::vector<double, std::allocator<double> > times(std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >&, std::vector<double, std::allocator<double> >&, int, int)': 
../src/OpemMPTutorial.cpp:200: error: 'b' is predetermined 'shared' for 'shared' 
../src/OpemMPTutorial.cpp:200: error: 'A' is predetermined 'shared' for 'shared' 
make: *** [src/OpemMPTutorial.o] Error 1 

Cosa c'è di sbagliato qui?

(Si noti che semplicemente rimuovendo le const risultati nella stessa errore.)

+1

Ho compilato la tua funzione senza problemi usando 'g ++ 4.6.3'. – Massimiliano

+0

Sto usando 'i686-apple-darwin11-llvm-gcc-4.2'. Potrebbe essere un problema con questa versione del compilatore. Sto cercando di aggiornare a gcc 4.7 – clstaudt

+0

@cls: stavo scherzando. Non uso OpenMP e quindi non ho mai visto prima questo errore GCC. Quindi hai ottenuto un upvote solo per avermi dato un nuovo errore GCC (non l'hai fatto davvero). –

risposta

0

Ciò è causato da un sostegno OpenMP insufficiente gcc-4.2. Il frammento di codice viene compilato senza problemi utilizzando gcc-4.7.

+4

gcc-4.7.2 riporta di nuovo il messaggio. La soluzione è: le costanti non devono essere menzionate in nessuna delle clausole di condivisione dei dati. Funziona anche con 'default (nessuno)'. –

4

Avevo un problema molto simile e ho sperimentato che tale programma può essere compilato utilizzando GCC 4.2 di Apple dopo aver rimosso le variabili condivise const dalla sezione shared della direttiva OpenMP. Sono predeterminati come condivisi poiché sono costanti e non è necessario creare una copia per ogni thread. E il compilatore sembra non accettare di dirlo esplicitamente quando lo sa già ...

Vorrei anche rimuovere la specifica default(none) (ma vedere lo comment below). OpenMP ha lo scopo di ridurre le specifiche esplicite, quindi lascia che faccia il suo lavoro.

+2

È una cattiva idea rimuovere 'default (none)'. Senza la parola chiave 'default' la strategia di condivisione viene determinata implicitamente, che sarà' condivisa' nella maggior parte dei casi (capitolo 2.14.1.1 in [specifica openmp 4.0] (http://www.openmp.org/mp-documents/OpenMP4. 0.0.pdf)). L'accesso ai membri condivisi deve essere sincronizzato. Senza 'default (nessuno)' è facile introdurre gare di dati senza accorgersene. 'default (none)' ti costringe a pensare a come userai un membro. –

Problemi correlati