Быстрый LAPACK / BLAS для умножения матриц

Сейчас я изучаю библиотеку Armadillo C ++ для линейной алгебры. Насколько я понял, он использует библиотеку LAPACK / BLAS для базовых матричных операций (например, умножение матриц). Как пользователь Windows, я скачал LAPACK / BLAS отсюда: http://icl.cs.utk.edu/lapack-for-windows/lapack/#running. Проблема в том, что умножение матриц очень медленное по сравнению с Matlab или даже R. Например, Matlab умножает две матрицы 1000×1000 за ~ 0,15 секунды на моем компьютере, R требует ~ 1 секунду, в то время как C ++ / Armadillo / LAPACK / BLAS требует более 10 секунд для этого.

Итак, Matlab основан на высоко оптимизированных библиотеках для линейной алгебры. У меня вопрос, существует ли более быстрый LAPACK / BLAS Brary для использования от Armadillo? В качестве альтернативы, есть ли способ как-нибудь извлечь библиотеки линейной алгебры Matlab и использовать их в C ++?

6

Решение

LAPACK не выполняет умножение матриц. Это BLAS, который обеспечивает умножение матриц.

Если у вас 64-битная операционная система, я рекомендую сначала попробовать 64-битную версию BLAS. Это даст вам немедленное удвоение производительности.

Во-вторых, взгляните на высокопроизводительную реализацию BLAS, такую ​​как OpenBLAS. OpenBLAS использует как векторизацию, так и распараллеливание (т.е. многоядерный). Это бесплатный (бесплатный) проект с открытым исходным кодом.

Matlab внутренне использует Intel MKL библиотека, которую вы также можете использовать с Библиотека Армадилло. Intel MKL является закрытым исходным кодом, но является бесплатным для некоммерческого использования. Обратите внимание, что OpenBLAS может получить производительность умножения матриц на уровне или выше, чем Intel MKL.

Обратите внимание, что высокопроизводительную линейную алгебру обычно проще реализовать в Linux и Mac OS X, чем в Windows.

13

Другие решения

В дополнение к тому, что уже было сказано, вы также должны использовать высокий уровень оптимизации:

  1. Обязательно используйте либо O2 или O3 флаг компилятора.

  2. Ссылка на вышеупомянутое высокая производительность (и, возможно, многопоточный) Библиотеки BLAS. AFAIK MKL доступен только для платформ Unix, хотя, если вы используете Linux-коробку, такую ​​как cygwin, в Windows, то все должно быть в порядке, я думаю. OpenBLAS также многопоточный.

  3. Во многих библиотеках установка символа NDEBUG (например, передача флага компилятора -DNDEBUG) отключает дорогостоящую проверку диапазона и утверждения. Армадилло имеет свой собственный символ, называемый ARMA_NO_DEBUG, которую вы можете либо установить вручную, либо вы можете отредактировать файл заголовка config.hpp (расположенный в каталоге включения armadillo) и раскомментировать соответствующую строку. Я предполагаю, что, поскольку вы смогли включить внешнее использование BLAS в броненосце, вы все равно должны быть знакомы с этим файлом конфигурации …

Я провел быстрое сравнение между armadillo / MKL_BLAS и Matlab на моей рабочей станции Intel Core-i7. Для C ++ exe я использовал -O3, MKL BLAS и определил ARMA_NO_DEBUG. Я умножил 1000×1000 случайных матриц в 100 раз и усреднил времена умножения.
Реализация C ++ была примерно в 1,5 раза быстрее, чем matlab.

Надеюсь это поможет

4

Есть ли способ как-нибудь извлечь библиотеки линейной алгебры Matlab и использовать их в C ++? Да, для вызова функции Matlab в C ++, обратитесь к этой ссылке: Как вызывать функции Matlab из C ++

1

Несколько библиотек C ++ для линейной алгебры предоставляют простой способ связи с высоко оптимизированной библиотекой.

посмотри на http://software.intel.com/en-us/articles/intelr-mkl-and-c-template-libraries

Вы должны быть в состоянии связать Armadillo с MKL для большей производительности, но это коммерческий пакет,

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector