Флаги компилятора Intel для одноядерного использования - PullRequest
0 голосов
/ 26 сентября 2019

Я заметил, что мне кажется удивительным поведение с кодом Fortran, в основном содержащим умножения матриц / матриц и матриц / векторов.

Первоначально код был скомпилирован с gfortran, а умножения были выполнены с двойным "DO"."циклы по строкам и столбцам матриц.Я скомпилировал код, используя:

gfortran -c -g -O3 ...

Для выполнения кода использовалось одно ядро ​​8-ядерного процессора i7.

Затем я скомпилировал свой код с помощью компилятора intel, используя:

ifort -c -g -O3 ...

Код работал значительно быстрее, все еще используя одно ядро.Затем я решил оптимизировать код, используя хорошо известные функции dgemm и dgemv соответственно для умножения матрицы / матрицы и матрицы / вектора.

Затем я скомпилировал, используя:

ifort -c -g -O3 ...

Полученный код работает правильно, но использует 8 ядер моего i7-процессора без какого-либо значительного улучшения производительности.Есть ли способ контролировать количество ядер, используемых моим кодом, из команды компиляции?

1 Ответ

3 голосов
/ 26 сентября 2019

Сам компилятор не генерирует никакого параллельного кода.Но библиотека Math Kernel Library (MKL) (где живут DGEMM и друзья) выполняет автоматическое распараллеливание и диспетчеризацию процессора.

Документация MKL гласит следующее:

Используйте следующие методы для указанияколичество потоков OpenMP для использования в Intel MKL:

Задайте одну из переменных среды OpenMP или Intel MKL: OMP_NUM_THREADS MKL_NUM_THREADS MKL_DOMAIN_NUM_THREADS

Вызовите одну из функций OpenMP или Intel MKL_с_с___множеством_с__компаний: omp_com____________________________________________::: омплект____мнгу_с_с__жизнах_комп__________:mkl_set_num_threads () mkl_domain_set_num_threads () mkl_set_num_threads_local ()

...