2015-09-21 5 views
6

Ich habe den folgenden Code:Clang + OpenMP auf Linux verwendet nur 1 CPU-Kern

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; 
} 

Wenn ich es mit g ++ kompilieren dann während der Laufzeit der Code verwendet 4 Kerne:

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

Wenn ich kompiliert es mit Klirren ++ 3.7 dann während der Laufzeit verwendet der Code nur 1 Kern:

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

In beiden Fällen, die ich gesetzt haben:

OMP_NUM_THREADS=4 

Beiden Compiler wurden aus der Debian-Testing-Repository installiert:

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

So, irgendwelche Ideen, warum das Klirren nur einen Kern verwendet? Danke im Voraus.

Antwort

5

Siehe this:

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

Es sieht aus wie Sie die -fopenmp=libomp in Ihrer Zusammenstellung Fahnen verpasst.

+0

Hallo. Mit dieser Option bekomme ich einen Fehler: '/ usr/bin/ld: kann -lomp nicht finden. Ich habe auch versucht, '-fopenmp = libgomp' zu verwenden. Mit diesem Flag kompiliert der Code aber es verwendet immer noch 1 CPU-Kern. – AstrOne

+1

ehrlich gesagt, IDK was ist falsch, aber ich würde entweder versuchen, clang aus Quellen zu installieren, oder das Paket 'libiomp-dev' zu installieren und '-fopenmp = libomp' oder' -fopenmp = libiomp5' zu verwenden ... – Gilles

+1

Stellt libomp aus ist irgendwie mit der intel omp-Bibliothek gebündelt. Außerdem befindet sich das Paket im Debian-Repository derzeit im Umbruch. Und um es noch schlimmer zu machen, wird es derzeit aus dem Testing-Repository entfernt. (aber es existiert auf der Sid). Ich denke, entweder muss warten oder einfach die Sid-Version verwenden. :) Danke für die Hilfe mein Freund! – AstrOne