Я реализовал сопряженный градиент на FORTRAN, заменив подпрограммы линейной алгебры в примере из Википедии на ( Fortran) подпрограммы Intel MKL. (Только DGEMV, DAXPY и DNRM. Получается, что a=b быстрее, чем DCOPY, а a=2*a быстрее, чем DSCAL)
Ответы правильные и проблем с реализацией нет. Однако, когда я компилирую его как ifort CG.f90 -mkl
, результаты следующие:
MKL_SET_DYNAMIC = ИСТИНА; 140 секунд
MKL_SET_DYNAMIC = ЛОЖЬ, MKL_SET_NUM_THREADS=1 ; 70 секунд.
MKL_SET_DYNAMIC = ЛОЖЬ, MKL_SET_NUM_THREADS=2 ; ~100 секунд.
Несколько моментов:
- У меня есть 2 реальных ядра и 2 виртуальных ядра через гиперпоточность. Я не пытаюсь запустить 16 потоков на двухъядерной машине.
- Профилирование дало заумные ссылки на
M16_LAY_GAS16
, которые после долгих поисков сводились кmultpd
ASM. В остальном ничего полезного не вышло (а может быть, я не знал, где искать) FWIW, я использовал VTune. - Размер проблемы не маленький. Приведенные выше примеры предназначены для размеров матрицы, пропорциональных размеру моей оперативной памяти (примерно 13k x 13k для моей системы с 4 ГБ).
KMP_AFFINITY
отображает один поток на один процессор в последовательном случае и 2 потока на 2 процессора в параллельном режиме.
Мой вопрос: Почему MKL_DYNAMIC не устанавливает количество потоков равным 1, если это оптимально? Мне не обязательно использовать 2 потока, если ту же работу (за меньшее время) выполняет 1.
Я что-то делаю не так или что-то не так с Intel MKL?
DGEMV
илиDSYMV
.... - person talonmies   schedule 16.04.2012