Рекомендации для удобной, быстрой библиотеки C ++ матрицы?


158

У кого-нибудь есть рекомендации по использованию удобной и быстрой матрицы библиотеки C ++?

Что я подразумеваю под юзабилити - это следующее:

  • Матричные объекты имеют интуитивно понятный интерфейс (например, я могу использовать строки и столбцы при индексации)
  • Я могу сделать что-нибудь с классом матрицы, что я могу сделать с LAPACK и BLAS
  • Простой в освоении и использовании API
  • Относительно безболезненно для установки в Linux (сейчас я использую Ubuntu 11.04)

Для меня юзабилити сейчас важнее, чем скорость или использование памяти, чтобы избежать преждевременной оптимизации. При написании кода я всегда мог использовать одномерные массивы (или векторы STL) и правильную арифметику индекса или указателя для эмуляции матрицы, но я бы предпочел этого не делать, чтобы избежать ошибок. Я также хотел бы сосредоточить свои умственные усилия на реальной проблеме, которую я пытаюсь решить, и запрограммировать ее в проблемной области, а не использовать часть моего ограниченного внимания, чтобы запомнить все маленькие хитрости программирования, которые я использовал для эмуляции матриц в качестве массивов. и помните команды LAPACK и так далее. Кроме того, чем меньше кода мне нужно написать, и чем он стандартизирован, тем лучше.

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

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


1
Является ли использование CUDA вариант?
флипчарт

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

А как насчет Intel MKL и IPP?
Рой

Ответы:


146

На данный момент я собрал следующее из онлайн-исследований:

Я немного использовал Armadillo и обнаружил, что интерфейс достаточно интуитивно понятен, и было легко найти бинарные пакеты для Ubuntu (и я предполагаю, что другие дистрибутивы Linux). Я не скомпилировал его из источника, но надеюсь, что это не будет слишком сложно. Он соответствует большинству моих критериев проектирования и использует плотную линейную алгебру. Он может вызывать подпрограммы LAPACK или MKL. Как правило, нет необходимости компилировать Armadillo, это библиотека исключительно на основе шаблонов: вы просто включаете заголовок и ссылку на BLAS / LAPACK или MKL и т. Д.

Я слышал хорошие вещи об Эйгене , но не использовал его. Он претендует на скорость , использует шаблоны и поддерживает плотную линейную алгебру. Он не имеет LAPACK или BLAS в качестве зависимости, но, похоже, способен делать все, что может делать LAPACK (плюс некоторые вещи, которые LAPACK не может). Многие проекты используют Eigen, который является перспективным. У него есть бинарный пакет для Ubuntu, но в качестве библиотеки только для заголовков тривиально использовать ее и в других местах.

Matrix Template Library версия 4 также выглядит многообещающей, и использует шаблонизацию. Он поддерживает как плотную, так и разреженную линейную алгебру, и может вызывать UMFPACK как разреженный решатель. Функции несколько неясны на их сайте. У него есть бинарный пакет для Ubuntu, который можно загрузить с их сайта.

PETSc , созданный командой из Аргоннской национальной лаборатории, имеет доступ к разреженным и плотным линейным решателям, поэтому я предполагаю, что он может функционировать как матричная библиотека. Он написан на C, но, как мне кажется, имеет привязки к C ++ (и даже если нет, вызов C из C ++ не проблема). Документация невероятно тщательная. Пакет немного излишним для того, что я хочу сделать сейчас (умножение матриц и индексирование для создания смешанных целочисленных линейных программ), но может быть полезно в качестве матричного формата для меня в будущем или для других людей, у которых другие потребности чем я.

Trilinos , написанный группой из Национальной лаборатории Sandia, предоставляет объектно-ориентированные интерфейсы C ++ для плотных и разреженных матриц через компонент Epetra, а также шаблонные интерфейсы для плотных и разреженных матриц через компонент Tpetra. У этого также есть компоненты, которые обеспечивают линейный решатель и функциональность eigensolver. Документация не выглядит такой же отточенной или заметной, как PETSc; Trilinos выглядит как аналог Sandia PETSc. PETSc может вызвать некоторых из решателей Трилино. Двоичные файлы для Trilinos доступны для Linux.

Blitz - это объектно-ориентированная библиотека C ++, в которой есть двоичные файлы Linux. Похоже, что он не поддерживается активно (2012-06-29: новая версия только что появилась вчера!), Хотя список рассылки активен, поэтому есть сообщество, которое использует его. Похоже, что она не имеет большого значения для числовой линейной алгебры, кроме BLAS, и выглядит как библиотека с плотной матрицей. Он использует шаблоны.

Boost :: uBLAS является объектно-ориентированной библиотекой C ++ и является частью проекта Boost. Он поддерживает шаблонную и плотную числовую линейную алгебру. Я слышал, это не особенно быстро.

Шаблон Численный Инструментарий представляет собой С ++ объектно-ориентированная библиотека , разработанная NIST. Его автор, Roldan Pozo, кажется, время от времени вносит исправления, но, похоже, он больше не находится в стадии активной разработки (последнее обновление было в 2010 году). Он фокусируется на плотной линейной алгебре и предоставляет интерфейсы для некоторых базовых матричных разложений и решатель собственных значений.

Elemental , разработанный Джеком Полсоном, представляет собой программный пакет плотной линейной алгебры с распределенной памятью (параллельный), написанный в стиле, похожем на FLAME . Список возможностей и фона проекта см. В его документации . Сам FLAME имеет связанную библиотеку для плотной линейной алгебры с последовательной и разделяемой памятью, называемую libflame , которая, кажется, написана на объектно-ориентированном языке C. Libflame очень похожа на LAPACK, но с улучшенной нотацией, лежащей в основе алгоритмов для создания быстрой числовой разработки библиотеки линейной алгебры больше науки и меньше черного искусства.

Есть другие библиотеки, которые можно добавить в список; если мы считаем пакеты разреженной линейной алгебры «матричными библиотеками», лучшим из известных мне бесплатных приложений на C является SuiteSparse , который запрограммирован в объектно-ориентированном стиле. Я использовал SuiteSparse и нашел его довольно легко подобрать; это зависит от BLAS и LAPACK для некоторых алгоритмов, которые разлагают разреженные задачи на множество небольших, плотных подзадач линейной алгебры. Тим Дэвис, ведущий автор пакета, невероятно услужливый и отличный универсальный парень.

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

Существуют и другие разреженные решения для линейной алгебры, но, насколько я могу судить, MUMPS и другие пакеты ориентированы в основном на решение линейных систем, и решение линейных систем является наименьшей из моих проблем на данный момент. (Возможно, позже мне понадобятся эти функции, и они могут быть полезны для других.)


2
Я думаю, что вы спутали Эйгена с Элементаль; Я не работал над Eigen, хотя я очень впечатлен проектом. Elemental в основном предназначен для машин с распределенной памятью.
Джек Полсон

3
Наверное, мой первый вопрос будет таким: хочешь ли ты когда-нибудь запустить что-нибудь параллельно?
Мэтт Кнепли

1
Я должен упомянуть Trilinos ... хотя он здесь не очень хорошо виден (пока), это жизнеспособная альтернатива PETSc, с шаблонным матричным пакетом, eigensolver и разреженным матричным решателем, он также имеет пакет предназначено специально для абстрагирования бухгалтерского учета алгоритма, хотя я не знаю, насколько хорошо он работает.
Эндрю Спотт

1
Эйген кажется великолепным - мой коллега использовал его в профессиональном контексте, и он может заставить вас работать достаточно быстро, не жертвуя при этом производительностью.
qdot

7
Я также добавил бы к вашему ответу следующие библиотеки: ViennaCL - библиотека заголовков C ++ на основе OpenCL, которая может взаимодействовать с Eigen и MTL. PLASMA - редизайн библиотек BLAS и LAPACK на основе UTK с разложением на основе плиток. MAGMA - еще один проект UTK, который фокусируется на улучшении производительности LAPACK / BLAS.
Арон Ахмадиа

24

Этот документ был написан в марте 2009 года, чтобы помочь в выборе библиотеки линейной алгебры для научной библиотеки. Он оценивает мобильность, высокоуровневый интерфейс и лицензирование для нескольких библиотек, среди которых Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos и uBlas. Кажется, он особенно любит Фленса и Селдона . (Одним из требований было поддерживать шаблоны C ++ и разреженные матрицы.)


17

Из всех проектов, перечисленных выше, на самом деле есть только два тяжеловеса, которые чрезвычайно широко используются (и по уважительным причинам): PETSc и Trilinos. Оба профессионально развиты и имеют большую базу разработчиков. Все остальные - довольно небольшие проекты по сравнению с этими двумя, и я бы порекомендовал идти с ними, потому что (i) они будут поддерживаться в течение длительного времени и (ii) они, вероятно, уже будут иметь все функциональные возможности, которые вам когда-либо понадобятся в отношении линейная алгебра (и многое другое).


4
PETSc не обладает гораздо более абстрактным интерфейсом для ScaLAPACK и PLAPACK. Если Джефф интересуется удобной плотной линейной алгеброй, я думаю, что PETSc излишен (я не знаю достаточно о плотных способностях Трилиноса комментировать)
Арон Ахмадиа

@AronAhmadia: На данный момент, я думаю, что ответ превратился в вики-ресурс сообщества, поэтому я добавляю пакеты по запросу комментаторов.
Джефф Оксберри

3
@WolfgangBangerth: Я думаю, что важно упомянуть цели дизайна. Если цель состоит в том, чтобы написать программное обеспечение, которое будет работать долго и предназначено для использования другими, и линейная алгебра является неотъемлемой частью этого программного обеспечения, тогда PETSc и Trilinos - хороший выбор. Однако есть случаи, когда более легкие варианты предпочтительны и полезны, потому что они имеют более простые API и могут выполнять почти ту же задачу в меньшем количестве строк кода. Наконец, смещение выбора играет роль в выживании кодов. Если никто не использует меньшие коды, они не будут существовать или создавать базу, такую ​​как PETSc и Trilinos.
Джефф Оксберри

1
В дополнение к тому, что сказал Джефф, подавляющее большинство функциональных возможностей PETSc и Trilinos создаются оболочками вокруг внешних библиотек. Сказать, что никто не должен использовать указанные внешние библиотеки, мне кажется странным.
Джек Полсон,

1
@JackPoulson: я действительно поддерживаю мой комментарий. Да, PETSc упаковывает много отдельных пакетов. Но это происходит с единообразным интерфейсом, и поэтому проще узнать это один раз, чем изучать особенности соглашения и стиля именования каждого пакета. Другими словами, хотя каждый отдельный проект может одинаково хорошо использовать упакованные пакеты, существует синергия, возникающая при их использовании через PETSc каждый раз.
Вольфганг Бангерт

11

Если ты хочешь

  • Матричные классы с интуитивно понятным интерфейсом
  • Все функции LAPACK и BLAS
  • Простой в освоении и использовании API
  • Прост в установке

Тогда я рекомендую вам взглянуть на мою библиотеку FLENS . Я разработал его именно для таких задач. Однако для этого требуется компилятор, соответствующий C ++ 11 (например, gcc 4.7 или clang).

FLENS обеспечивает ту же производительность, что и базовая реализация BLAS. Есть некоторые (довольно старые) тесты, показывающие это

То же самое можно сказать и о FLENS-LAPACK, он просто дает вам ту же производительность, что и LAPACK Netlib, если используется та же реализация BLAS.

Что касается новых ориентиров, позвольте мне перейти к более подробным ...

Некоторое время назад я спросил Клинта Уэйли (автора ATLAS), что он думает о тестах, опубликованных на сайте Eigen. Он только подтвердил мое подозрение, что эти критерии, скорее всего, не являются надежными. В то же время некоторые другие реализованные ориентиры, как предложил Клинт. Подробности можно найти на сайте ATLAS и в списке рассылки Eigen. Тесты не очень хорошо представлены на графиках, но они показывают, что ATLAS всегда примерно на 40% быстрее, чем Eigen. Это противоречит тестам с сайта Eigen, но подтверждает другие тесты (например, от Blaze-lib).

Отметим, что для плотной числовой линейной алгебры матрично-матричные произведения являются наиболее актуальными. Лично мне все равно, быстрее Eigen или ATLAS. Если бы Eigen был быстрее, чем ATLAS, я бы использовал Eigen в качестве BLAS-бэкенда.

Отказ от ответственности: Да, FLENS мой ребенок! Это означает, что я написал около 95% кода, и каждая строка кода того стоила :-)


Привет Майкл, добро пожаловать в Scicomp. Ваш URL не работает для меня, что-то не так с вашим сервером?
Арон Ахмадиа

Спасибо за подсказку. URL-адрес правильный, но, похоже, в математическом отделе возникла проблема с файловым сервером. Как раз вовремя на выходные ...
Майкл Лен

1
Хорошо, я только что создал новую документацию из текущего репозитория
Майкл Лен,



1

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

Я уже использую PETSc для решения больших разреженных линейных систем, возникающих в моем приложении, но в настоящее время я использую свою собственную простую библиотеку для работы с этими матрицами / векторами ... Я подумываю перейти на более быструю библиотеку как упомянутые выше.

Что было бы лучшим выбором для пары с PETSc? Эйген? Armadillo? BOOST :: uBlas? MTL4? Я использую некоторые вещи из BOOST, так что сначала я подумал об использовании BOOST :: uBlas, но там не так много документации, примеров и так далее ...


2
Я настоятельно рекомендую не использовать uBlas, поскольку известно, что он примерно на порядок медленнее, чем оптимизированные процедуры BLAS. Я думаю, что Eigen лучше всего подходит для очень маленьких матриц из-за хитрости шаблонов.
Джек Поулсон

1
Это, вероятно, лучше для отдельного вопроса. Я знаю, что у Eigen, MTL4 и Armadillo есть хитрости для решения систем небольшого размера, но я думаю, что вы спрашиваете, как собирать матрицы, и для этого, я не знаю. Я обычно собираю матрицы поэлементно. Я не уверен, что любая из упомянутых библиотек хороша для связи с PETSc; Я еще не пользователь PETSc. Я второй комментарий Джека о Boost :: uBlas, хотя, потому что это медленно.
Джефф Оксберри

1

Armadillo, Boost и другие теперь включены как часть Ceemple, быстрой вычислительной среды C ++ на основе JIT. Доступно (бесплатно) с http://www.ceemple.com .


0

Удивленный никто не упомянул TooN до сих пор. Счастливо пользуюсь им уже почти 3 года.

Это очень похоже на Eigen, хотя и не так всесторонне. Тем не менее, я думаю, что в некоторых отношениях он имеет более хороший синтаксис

Он также поставляется с классами, которые помогают моделировать общие преобразования, которые часто встречаются в Graphics и Vision, на основе групп Ли (специальных евклидовых / ортогональных в 2 и 3 измерениях и т. Д.) И связанных алгебр Ли.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.