2015-09-21 3 views
6

У меня есть следующий код:Clang + OpenMP на Linux использует только один процессор ядро ​​

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

Если я скомпилировать его с г ++, то во время выполнения кода использует 4 ядра:

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

Если я скомпилировать его с лязгом ++ 3.7, то во время выполнения кода использует только 1 ядро:

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

в обоих случаях я установили:

OMP_NUM_THREADS=4 

Оба компиляторы были установлены из репозитория Debian Testing:

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

Таким образом, любые идеи, почему лязг использует только одно ядро? Заранее спасибо.

ответ

5

См this:

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

Похоже, вы пропустили -fopenmp=libomp в ваших флагах компиляции.

+0

Здравствуйте. Используя эту опцию, я получаю сообщение об ошибке: '/ usr/bin/ld: не могу найти -lomp'. Я также пытался использовать '-fopenmp = libgomp'. С этим флагом код компилируется, но он все еще использует 1 ядро ​​ЦП. – AstrOne

+1

честно, IDK, что не так, но я либо попытаюсь установить clang из источников, либо установить пакет libiomp-dev и использовать '-fopenmp = libomp' или' -fopenmp = libiomp5' ... – Gilles

+1

Выключает libomp как-то в комплекте с библиотекой intel omp. Кроме того, пакет в настоящее время претерпевает существенный переход в репозиторий Debian. И чтобы усугубить ситуацию, в настоящее время она удаляется из репозитория тестирования. (но он существует на сиде). Думаю, придется либо ждать, либо просто использовать версию sid. :) Спасибо за помощь моему другу! – AstrOne

Смежные вопросы