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

Библиотека библиотеки ublas vs. matrix (MTL4)

Я пишу программное обеспечение для гиперболических уравнений в частных производных в С++. Почти все обозначения являются векторными и матричными. Кроме того, мне нужен решатель линейной алгебры. И да, размеры векторов и матриц могут значительно различаться (от 1000 до размеров, которые могут быть решены только с помощью вычислений с распределенной памятью, например кластеров или аналогичной архитектуры). Если бы я жил в утопии, у меня был линейный решатель, который отлично масштабируется для кластеров, графических процессоров и многоядерных процессоров.

Когда мы думаем о структуре данных, которые должны представлять переменные, я пришел к boost.ublas и MTL4. Обе библиотеки совместимы с уровнем blas уровня 3, MTL4 реализует разреженный решатель и намного быстрее, чем ublas. Оба они не реализовали поддержку многоядерных процессоров, не говоря уже о распараллеливании вычислений с распределенной памятью. С другой стороны, разработка MTL4 зависит от единственного усилия двух разработчиков (по крайней мере, как я понял), и я уверен, что есть причина, что ublas находится в библиотеке boost. Кроме того, библиотека intel mkl включает пример связывания их структуры с ublas. Я хотел бы привязать свои данные и программное обеспечение к структуре данных, которая будет твердой, развитой и поддерживаемой в течение длительного периода времени.

Наконец, вопрос. Каков ваш опыт использования ublas и/или mtl4, и что вы бы порекомендовали?

спасибо, mightydodol

4b9b3361

Ответ 1

С вашими требованиями я, вероятно, поеду на BOOST:: uBLAS. Действительно, хорошее развертывание uBLAS должно быть примерно наравне с MTL4 относительно скорости.

Причина в том, что существуют bindings для ATLAS (следовательно, распараллеливание с разделяемой памятью, которое вы можете эффективно оптимизировать для своего компьютера), а также реализованные с помощью поставщика реализации, такие как Intel Math Kernel Library или HP MLIB.

С помощью этих привязок uBLAS с хорошо настроенной библиотекой ATLAS/BLAS, выполняющей математику, должен быть достаточно быстрым. Если вы ссылаетесь на данный BLAS/ATLAS, вы должны быть примерно равны MTL4, связанному с тем же BLAS/ATLAS, используя флаг компилятора -DMTL_HAS_BLAS и, скорее всего, быстрее MTL4 без BLAS в соответствии с их собственным наблюдением (пример см. здесь, где GotoBLAS превосходит MTL4).

Подводя итог, скорость не должна быть вашим решающим фактором, если вы хотите использовать некоторую библиотеку BLAS. Юзабилити и поддержка важнее. Вы должны решить, подходит ли MTL или uBLAS для вас. Я склонен к uBLAS, учитывая, что он является частью BOOST, и MTL4 в настоящее время поддерживает только BLAS выборочно. Вы также можете найти это слегка устаревшее сравнение научных пакетов С++.

Один большой НО: для ваших требований (чрезвычайно большие матрицы), я бы, вероятно, пропустил "синтаксический сахар" uBLAS или MTL и сразу же назвал "металлический" интерфейс C BLAS/LAPACK. Но это только я... Еще одно преимущество заключается в том, что это должно быть проще, чем переключиться на ScaLAPACK (распределенная память LAPACK, никогда не использовала ее ) для больших проблем. Чтобы быть ясным: для проблем с домашним удержанием я бы не предложил напрямую обращаться к библиотеке BLAS.

Ответ 2

Если вы программируете векторы, матрицы и линейную алгебру в С++, я бы посмотрел на Eigen:

http://eigen.tuxfamily.org/

Это быстрее, чем uBLAS (не уверен в MTL4) и гораздо более чистый синтаксис.

Ответ 3

Для новых проектов лучше всего держаться подальше от Boost uBlas. Часто задаваемые вопросы по uBlas имеют это предупреждение с конца 2012 года:

В: Должен ли я использовать uBLAS для новых проектов?  ... последнее крупное улучшение uBLAS произошло в 2008 году, и с 2009 года никаких серьезных изменений не произошло. Производительность? Существуют более быстрые альтернативы. Передовой? uBLAS более 10 лет и пропустил все новые вещи из С++ 11.

Ответ 4

В этом списке отсутствует одна библиотека С++: FLENS

http://flens.sf.net

Отказ от ответственности: Да, это мой ребенок

  • Только заголовок
  • Поставляется с простой, не исполняемой, общей (т.е. шаблонизированной) ссылкой на С++ для BLAS.
  • Если доступно, вы можете использовать оптимизированную реализацию BLAS в качестве бэкэнд. В этом случае это похоже на использование BLAS напрямую (некоторый Benchmark, который я должен обновить).
  • Вы можете использовать перегруженные операторы вместо вызова функций BLAS.
  • Он поставляется с собственной автономной универсальной повторной реализацией функции LAPACK. Мы называем этот порт FLENS-LAPACK.
  • FLENS-LAPACK имеет точно такую ​​же точность и производительность, что и Netlib LAPACK. И по моему опыту (FLENS-) LAPACK + ATLAS или (FLENS-) LAPACK + OpenBLAS дает вам такую ​​же производительность, как ACML или MKL.
  • FLENS имеет другую политику в отношении создания временных векторов/матриц при вычислении выражений линейной алгебры. Политика FLENS: Никогда не создавайте их!!!. Однако в специальном режиме отладки мы позволяем создавать временные "при необходимости". Эта политика "когда это необходимо" является значением по умолчанию в других библиотеках, таких как Eigen или Armadillo или в Matlab.

Ответ 5

Вы можете увидеть различия производительности прямо здесь: http://www.osl.iu.edu/research/mtl/mtl4/doc/performance.php3

Оба являются разумными библиотеками для использования в терминах их интерфейсов, я не думаю, что, поскольку uBLAS прошел через процесс обзора BOOST, он обязательно стал более надежным. У меня была доля кошмаров с неочевидными побочными эффектами и непреднамеренными последствиями из реализаций uBLAS.

Это не значит, что uBLAS - это плохо, это действительно хорошо, но я думаю, что учитывая сегодняшние разницы в производительности для MTL, стоит использовать его вместо uBLAS, хотя это, возможно, немного более рискованно из-за этого ", только 2 разработчика" группа поддержки.

В конце дня, о скорости с матричной библиотекой, перейдите к MTL4.

Ответ 6

Из моего собственного опыта MTL4 намного быстрее, чем uBLAS, и он также быстрее, чем Eigen.

Ответ 7

Существует параллельная версия MTL4. Просто посмотрите simunova