2015-09-21 19 views
6

avere il codice seguente:Clang + OpenMP su Linux utilizza solo 1 core CPU

int main(int argc, char** argv) 
{ 
    const int64_t N = 10000000000; 
    float* data = new float[N]; 
    int64_t i; 

    omp_set_dynamic(0); 
    omp_set_num_threads(4); 

    #pragma omp parallel for 
    for(i = 0; i < N; ++i) 
     data[i] = i*i; 

    return 0; 
} 

Se compilo con g ++ poi durante l'esecuzione del codice utilizza 4 core:

g++ -fopenmp -std=c++11 main.cpp 

Se compilare con clangore ++ 3.7 quindi durante l'esecuzione del codice utilizza solo 1 nucleo:

clang++-3.7 -fopenmp -std=c++11 main.cpp 

In entrambi i casi ho impostati:

OMP_NUM_THREADS=4 

Entrambi i compilatori sono stati installati dal repository Debian Testing:

sudo apt-get install g++-5 
sudo apt-get install clang-3.7 

Quindi, tutte le idee perché il clangore utilizza un solo core? Grazie in anticipo.

risposta

5

Vedi this:

OpenMP 3.1 is fully supported, but disabled by default. To enable it, please use the -fopenmp=libomp command line option.

Sembra che vi siete persi la -fopenmp=libomp nei tuoi flag di compilazione.

+0

Ciao. Usando questa opzione ottengo un errore: '/ usr/bin/ld: impossibile trovare -lomp'. Ho anche provato a usare '-fopenmp = libgomp'. Con questo flag il codice viene compilato ma utilizza ancora 1 core della CPU. – AstrOne

+1

onestamente, IDK cosa c'è che non va, ma vorrei provare ad installare clang dai sorgenti, o installare il pacchetto 'libiomp-dev' e usare '-fopenmp = libomp' o' -fopenmp = libiomp5' ... – Gilles

+1

Rileva libomp è in qualche modo integrato con la libreria intel omp. Inoltre, il pacchetto sta attualmente attraversando una fase di transizione importante nel repository Debian. E per peggiorare le cose è attualmente rimosso dal repository Testing. (ma esiste sul sid). Immagino che dovrò aspettare o semplicemente usare la versione sid. :) Grazie per l'aiuto amico mio! – AstrOne