Подтвердить что ты не робот

Как библиотека C++ Eigen работает лучше, чем специализированные библиотеки поставщиков?

Я смотрел тесты производительности: http://eigen.tuxfamily.org/index.php?title=Benchmark

Я не мог не заметить, что eigen по-видимому превосходит все специализированные библиотеки поставщиков. Вопросы: как это возможно? Можно было бы предположить, что mkl/goto будет использовать специфический для процессора настроенный код, а собственный - довольно общий.

Обратите внимание на это http://download.tuxfamily.org/eigen/btl-results-110323/aat.pdf, по существу, на dgemm. Для N = 1000 Eigen получает примерно 17Gf, MKL - только 12Gf

4b9b3361

Ответ 1

У Эйгена есть ленивая оценка. Из Как Eigen сравнивается с BLAS/LAPACK?:

Для операций с комплексными выражениями Eigen по своей сути быстрее, чем любая реализация BLAS, поскольку она может обрабатывать и оптимизировать целая операция по всему миру - в то время как BLAS заставляет программиста разбивать сложные операции на небольшие шаги, соответствующие BLAS API с фиксированной функциональностью, что приводит к неэффективности в связи с внедрением. временные конструкции См. Например, результат теста Y = aX + bY который включает в себя два вызова режима BLAS level1, в то время как Eigen автоматически генерирует один векторный цикл.

Второй график в тегах составляет Y = a*X + b*Y, который Eigen был специально разработан для обработки. Неудивительно, что библиотека выигрывает в тесте, для которого он был создан. Вы заметите, что более общие эталонные тесты, такие как матричное умножение матриц, не показывают преимуществ для Eigen.

Ответ 2

Тесты предназначены для неправильного толкования.

Посмотрим на матричное произведение. Тест, доступный на этой странице на веб-сайте Eigen, говорит вам, что Eigen (со своим собственным BLAS) дает тайминги, похожие на MKL для больших матриц (n = 1000). Я сравнил Eigen 3.2.6 с MKL 11.3 на своем компьютере (ноутбук с ядром i7), а MKL в 3 раза быстрее, чем Eigen для таких матриц, используя один поток, и в 10 раз быстрее, чем Eigen, используя 4 потока. Это выглядит совершенно иначе. Для этого есть две причины. Eigen 3.2.6 (его внутренний BLAS) не использует AVX. Более того, похоже, что он не использует многопоточность. Этот тест скрывает это, поскольку они используют процессор, который не поддерживает AVX без многопоточности.

Обычно эти библиотеки С++ (Eigen, Armadillo, Blaze) приносят две вещи:

  • Хорошая перегрузка оператора: вы можете использовать +, * с векторами и матрицами. Чтобы получить хорошую производительность, им приходится использовать сложные методы, известные как "выражение Smart Template", чтобы избежать временных, когда они сокращают время (например, y = alpha x1 + beta x2 с векторами y, x1, x2) и вводят когда они полезны (например, A = B * C с матрицами A, B, C). Они также могут изменять порядок операций для меньших вычислений, например, если A, B, C являются матрицами A * B * C, можно вычислить как (A * B) * C или * (B * C) в зависимости от их размеров.
  • Внутренний БЛАС: для вычисления произведения из двух матриц они могут либо полагаться на свой внутренний BLAS, либо на внешний (MKL, OpenBLAS, ATLAS). На чипах Intel с большими матрицами MKL il почти невозможно бить. Для небольших матриц можно победить MKL, поскольку он не был разработан для таких проблем.

Обычно, когда эти библиотеки предоставляют тесты для MKL, они обычно используют старое оборудование и не включают многопоточность, поэтому они могут быть наравне с MKL. Они также могут сравнивать операции BLAS уровня 1, такие как y = alpha x1 + beta x2, с 2 вызовами функции BLAS уровня 1, что в любом случае является глупой вещью.

Вкратце, эти библиотеки чрезвычайно удобны для их перегрузки + и *, что чрезвычайно сложно обойтись без потери производительности. Обычно они хорошо справляются с этим. Но когда они дают вам бенчмарк, говорящий, что они могут быть на одном уровне или бить MKL со своей собственной BLAS, будьте осторожны и делайте свой собственный тест. Обычно вы получаете разные результаты: -).

Ответ 3

О сравнении ATLAS против Eigen

Посмотрите эту цепочку в списке рассылки Eigen, начиная здесь:

Это показывает, например, что ATLAS превосходит Eigen на матрично-матричном продукте на 46%:

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

Edit:

В своей лекции "Основы программного обеспечения для высокопроизводительных вычислений" я создал небольшую структуру под названием ulmBLAS. Он содержит набор тестов ATLAS, и учащиеся могут реализовать свой собственный матрично-матричный продукт на основе BLIS. Вы можете посмотреть последние тесты, которые также измеряют Eigen:

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

Также посмотрите

Ответ 4

Я отправил тот же вопрос в список рассылки ATLAS некоторое время назад:

http://sourceforge.net/mailarchive/message.php?msg_id=28711667

Clint (разработчик ATLAS) не доверяет этим критериям. Он предложил несколько заслуживающих доверия контрольных процедур. Как только у меня будет свободное время, я сделаю такой бенчмаркинг.

Если функциональность BLAS Eigen на самом деле быстрее, чем функция GotoBLAS/GotoBLAS, ATLAS, MKL, тогда они должны обеспечить стандартный BLAS-интерфейс. Это позволило бы связывать LAPACK с таким Eigen-BLAS. В этом случае это также будет интересным вариантом для Matlab и друзей.

Ответ 5

Общий код может быть быстрым, потому что Compile Time Function Evaluation (CTFE) позволяет выбрать оптимальную стратегию блокировки регистра (небольшие временные подматрицы, хранящиеся в регистре CPU).

Mir GLAS и Intel MKL быстрее, чем Eigen и OpenBLAS. Mir GLAS более общий по сравнению с Eigen. См. Также контрольную и красную нить.

Ответ 6

Похоже, что он не превосходит других библиотек, как это видно на графиках ниже на той странице, которую вы связали. Таким образом, различные библиотеки оптимизированы для разных случаев использования, а разные библиотеки быстрее подходят для разных задач.

Это неудивительно, поскольку вы обычно не можете идеально оптимизировать все варианты использования. Оптимизация для одной конкретной операции обычно ограничивает параметры оптимизации для других случаев использования.

Ответ 7

Eigen использует высоконастроенный код, как описано в его документации.