Как ускорить матричный продукт Eigen библиотеки?

Я изучаю простое умножение двух больших матриц с использованием библиотеки Eigen. Это умножение, по-видимому, заметно медленнее, чем Matlab и Python для матриц одинакового размера.

Что-нибудь нужно сделать, чтобы ускорить работу Eigen?

Детали проблемы

X: случайная матрица 1000 x 50000

Y: случайная матрица 50000 x 300

Сроки экспериментов (на моем конце 2011 Macbook Pro)

Использование Matlab: X*Y занимает ~1,3 сек.

Использование Enthought Python: numpy.dot( X, Y) занимает ~ 2,2 сек.

Использование Eigen: X*Y занимает ~ 2,7 сек.

Собственные детали

Вы можете получить мой собственный код (как функцию MEX): https://gist.github.com/michaelchughes/4742878

Эта функция MEX считывает две матрицы из Matlab и возвращает их произведение.

Запуск этой функции MEX без операции с матричным продуктом (т.е. просто выполнение ввода-вывода) приводит к незначительным издержкам, поэтому ввод-вывод между функцией и Matlab не объясняет большой разницы в производительности. Это явно фактическая операция матричного продукта.

Я компилирую с g++, с этими флагами оптимизации: "-O3 -DNDEBUG"

Я использую последние стабильные файлы заголовков Eigen (3.1.2).

Любые предложения о том, как улучшить производительность Eigen? Кто-нибудь может повторить пробел, который я вижу?

ОБНОВЛЕНИЕ Компилятор действительно имеет значение. Первоначальная синхронизация Eigen была сделана с использованием версии g ++ для Apple XCode: llvm-g++-4.2.

Когда я использую g++-4.7, загруженный через MacPorts (тот же CXXOPTIMFLAGS), я получаю 2,4 секунды вместо 2,7.

Любые другие предложения о том, как скомпилировать лучше, будет высоко ценится.

Вы также можете получить сырой код C++ для этого эксперимента: https://gist.github.com/michaelchughes/4747789

./MatProdEigen 1000 50000 300

сообщает 2,4 секунды под g ++ - 4,7

3 ответа

Решение

Прежде всего, при сравнении производительности убедитесь, что вы отключили турбо-буст (ТБ). В моей системе, используя gcc 4.5 от macport и без Turbo-Boost, я получаю 3.5 с, что соответствует 8.4 GFLOPS, в то время как теоретический пик моего 2.3 core i7 составляет 9.2GFLOPS, так что не так уж и плохо.

MatLab основан на Intel MKL, и, учитывая заявленную производительность, он явно использует многопоточную версию. Маловероятно, что небольшая библиотека Eigen сможет побить Intel на своем собственном процессоре!

Numpy может использовать любую библиотеку BLAS, Atlas, MKL, OpenBLAS, eigen-blas и т. Д. Я предполагаю, что в вашем случае он использовал Atlas, который тоже быстр.

Наконец, вот как вы можете получить лучшую производительность: включите многопоточность в Eigen путем компиляции с -fopenmp. По умолчанию Eigen использует для номера потока номер по умолчанию, определенный OpenMP. К сожалению, это число соответствует количеству логических ядер, а не физических ядер, поэтому убедитесь, что гиперпоточность отключена, или задайте для переменной среды OMP_NUM_THREADS физическое количество ядер. Здесь я получаю 1,25 с (без ТБ) и 0,95 с ТБ.

Eigen не пользуется преимуществами инструкций AVX, которые были представлены Intel с архитектурой Sandy Bridge. Это, вероятно, объясняет большую часть различий в производительности между Eigen и MATLAB. Я нашел ветку, которая добавляет поддержку AVX на https://bitbucket.org/benoitsteiner/eigen но, насколько я могу судить, он еще не был объединен с Eigen trunk.

Причина, по которой Matlab работает быстрее, заключается в том, что он использует Intel MKL. Эйген тоже может его использовать (см. Здесь), но вам, конечно, нужно его купить.

При этом есть ряд причин, по которым Эйген может быть медленнее. Чтобы сравнить python с matlab против Eigen, вам действительно нужно кодировать три эквивалентные версии операций на соответствующих языках. Также обратите внимание, что Matlab кеширует результаты, поэтому вам действительно нужно начать с нового сеанса Matlab, чтобы убедиться, что его магия не обманывает вас.

Кроме того, издержки Matlab Mex не существуют. ОП сообщает, что более новые версии "исправляют" проблему, но я был бы удивлен, если бы все накладные расходы были полностью очищены.

Другие вопросы по тегам