2015-09-21 9 views
6

Mam następujący kod:Clang + OpenMP na Linux używa tylko 1 CPU rdzeń

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

Gdybym go skompilować z g ++ następnie podczas wykonywania kodu wykorzystuje 4 rdzenie:

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

Gdybym skompilować go z brzękiem ++ 3.7 następnie podczas wykonywania kodu używa tylko 1 rdzeń:

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

w obu przypadkach mam ustawić:

OMP_NUM_THREADS=4 

obu kompilatorów zostały zainstalowane z repozytorium Debian Testing:

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

Więc jakieś pomysły dlaczego tylko brzęk wykorzystuje jeden rdzeń? Z góry dziękuję.

Odpowiedz

5

Zobacz this:

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

Wygląda przegapiłeś -fopenmp=libomp w swoich flag kompilacji.

+0

Witam. Korzystając z tej opcji, pojawia się błąd: '/ usr/bin/ld: can not find -lomp'. Próbowałem również użyć '-fopenmp = libgomp'. Za pomocą tej flagi kod się kompiluje, ale nadal używa 1 rdzenia procesora. – AstrOne

+1

Szczerze mówiąc, IDK, co jest nie tak, ale chciałbym albo spróbować zainstalować clang ze źródeł, albo zainstalować pakiet 'libiomp-dev' i użyć '-fopenmp = libomp' lub' -fopenmp = libiomp5' ... – Gilles

+1

Wyłącza libomp jest w jakiś sposób dołączony do biblioteki intel. Ponadto pakiet przechodzi obecnie ważną zmianę w repozytorium Debiana. Co gorsza, jest ona obecnie usuwana z repozytorium testowego. (ale istnieje na sid). Chyba będę musiał poczekać lub po prostu użyć wersji sid. :) Dzięki za pomoc przyjacielu! – AstrOne