Последовательная версия медленнее, чем параллельная с MKL_DYNAMIC=TRUE

Я реализовал сопряженный градиент на 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 секунд.

Несколько моментов:

  1. У меня есть 2 реальных ядра и 2 виртуальных ядра через гиперпоточность. Я не пытаюсь запустить 16 потоков на двухъядерной машине.
  2. Профилирование дало заумные ссылки на M16_LAY_GAS16, которые после долгих поисков сводились к multpd ASM. В остальном ничего полезного не вышло (а может быть, я не знал, где искать) FWIW, я использовал VTune.
  3. Размер проблемы не маленький. Приведенные выше примеры предназначены для размеров матрицы, пропорциональных размеру моей оперативной памяти (примерно 13k x 13k для моей системы с 4 ГБ).
  4. KMP_AFFINITY отображает один поток на один процессор в последовательном случае и 2 потока на 2 процессора в параллельном режиме.

Мой вопрос: Почему MKL_DYNAMIC не устанавливает количество потоков равным 1, если это оптимально? Мне не обязательно использовать 2 потока, если ту же работу (за меньшее время) выполняет 1.

Я что-то делаю не так или что-то не так с Intel MKL?


person Community    schedule 15.04.2012    source источник
comment
Мне любопытно, почему вы не упомянули DGEMV или DSYMV....   -  person talonmies    schedule 16.04.2012


Ответы (1)


MKL_DYNAMIC функционально такой же, как OMP_DYNAMIC/omp_set_dynamic() из стандарта OpenMP.

Это не означает «волшебным образом изменить количество потоков, чтобы выполнить код как можно быстрее». Это означает, что среда выполнения может при некоторых обстоятельствах изменить количество потоков от заданного пользователем значения или системного значения по умолчанию, если для этого есть системные ресурсы или другие причины, связанные с реализацией. Учитывая, что вы не указали количество потоков и доступно 4 параллельных аппаратных потока, я предполагаю, что в вашем случае MKL_SET_DYNAMIC = TRUE используются четыре потока.

Если вы запустите что-то вроде MKL_SET_DYNAMIC=TRUE MKL_SET_NUM_THREADS=16, вы можете обнаружить, что среда выполнения снизит количество потоков до 4, а производительность будет лучше, чем MKL_SET_DYNAMIC=FALSE MKL_SET_NUM_THREADS=16, потому что среда выполнения может обнаружить, что вы запрашиваете больше, чем количество доступных параллельные аппаратные потоки. Но это все, чего я ожидал от него.

person talonmies    schedule 16.04.2012
comment
Запуск с MKL_NUM_THREADS=16 с MKL_DYNAMIC=TRUE ограничивает его до 2 (оказывается, 2 оптимально для решения проблемы), а с FALSE идет на 4 потока. Нет ли механизма для волшебного изменения количества потоков до оптимального значения? - person ; 16.04.2012
comment
@Nunoxic: к сожалению, ни среда выполнения компилятора OpenMP не является экстрасенсом, они не могут прори знать, какие настройки использовать для оптимального выполнения кода. - person talonmies; 16.04.2012
comment
Это интересно. Я изучу, как MKL_DYNAMIC сколько выделить. Большое спасибо! - person ; 16.04.2012