Рекомендации для удобной, быстрой библиотеки 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.