Рекомендації щодо корисної, швидкої бібліотеки матриць C ++?


158

Хтось має рекомендації щодо швидкодіючої бібліотеки матриць C ++?

Що я маю на увазі під придатним, це наступне:

  • Об'єкти матриці мають інтуїтивний інтерфейс (напр .: я можу використовувати рядки та стовпці під час індексації)
  • Я можу зробити все, що стосується класу матриць, що я можу зробити з LAPACK та BLAS
  • Простий у вивченні та використанні API
  • Відносно безболісно встановлювати в Linux (я зараз використовую Ubuntu 11.04)

Для мене зручність використання важливіша, ніж швидкість або використання пам'яті зараз, щоб уникнути передчасної оптимізації. При написанні коду я завжди міг використовувати 1-D масиви (або вектори STL) та належну арифметику з індексом чи покажчиком для емуляції матриці, але я вважаю за краще це не уникати помилок. Я також хотів би зосередити свої розумові зусилля на актуальній проблемі, яку я намагаюся вирішити та запрограмувати в проблемній області, а не використовувати частину моєї обмеженої уваги, щоб запам’ятати всі маленькі прийоми програмування, які я використовував для імітації матриць як масивів , і запам'ятайте команди LAPACK та ін. Плюс, чим менше коду я повинен писати, і чим він більше стандартизований, тим краще.

Щільність та рідкість ще не мають значення; деякі матриці, з якими я маю справу, будуть рідкісними, але не всі. Однак якщо певний пакет добре обробляє щільні або розріджені матриці, варто згадати.

Шаблонування для мене теж не має великого значення, оскільки я буду працювати зі стандартними числовими типами і мені не потрібно зберігати нічого, окрім пар, плавців чи ints. Це приємно, але не обов’язково для того, що я хотів би зробити.


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. У ньому також є компоненти, які забезпечують функціональність лінійного розв'язувача та власного рішення. Документація не виглядає настільки відшліфованою чи видатною, як PETSc; Трилінос здається аналогом Sandia PETSc. PETSc може викликати деякі вирішувачі Trilinos. Бінарні файли для Trilinos доступні для Linux.

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

Boost :: uBLAS - об'єктно-орієнтована бібліотека C ++ та частина проекту Boost. Він підтримує шаблонні та щільні числові лінійні алгебри. Я чув, що це не особливо швидко.

Numerical Toolkit " Шаблон" - це об'єктово-орієнтована бібліотека C ++, розроблена NIST. Його автор, Ролдан Позо, здається, періодично вносить виправлення, але, здається, вже не знаходиться в активному розвитку (останнє оновлення було 2010). Він фокусується на щільній лінійній алгебрі та забезпечує інтерфейси для деяких основних матричних розкладів та власного значення.

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

Є й інші бібліотеки, які можна додати до списку; якщо ми рахуємо розріджені пакети лінійних алгебр як "матричні бібліотеки", найкращий безкоштовний, про який я знаю в C, це SuiteSparse , який запрограмований у об'єктно-орієнтованому стилі. Я використав SuiteSparse і мені стало досить легко підібрати; це залежить від BLAS та LAPACK для деяких алгоритмів, які розкладають розрізнені задачі на безліч малих щільних лінійних підпроблем алгебри. Провідний автор пакету Тім Девіс надзвичайно корисний і чудовий хлопець.

У підпрограму бібліотека Харуелле відома своєю рідкісною лінійних рутини алгебри, і є безкоштовними для академічних користувачів, хоча ви повинні пройти через цей процес заповнення форми та отримання електронної пошти для кожного файлу , який ви хочете завантажити. Оскільки підпрограми часто мають залежність, використання одного розв'язувача може зажадати завантаження п'яти-шести файлів, і процес може отримати дещо виснажливий характер, тим більше, що затвердження форми не є миттєвим.

Існують також інші розріджені лінійні алгебри, але, наскільки я можу сказати, MUMPS та інші пакети орієнтовані здебільшого на рішення лінійних систем, і вирішення лінійних систем є найменшою моєю проблемою зараз. (Можливо, пізніше мені знадобиться ця функціональність, і це може бути корисно для інших.)


2
Я думаю, що ви переплутали Ейґена з Елементалом; Я не працював над Eigen, хоча я дуже вражений проектом. Elemental в основному націлений на машини з розподіленою пам'яттю.
Джек Поульсон

3
Я думаю, моє перше питання було б: Ви хочете щось паралельно запускати?
Метт Кнеплі

1
Я мушу зазначити Trilinos ... хоча він не отримує великої видимості тут (поки), він є життєздатною альтернативою PETSc, з шаблоновим матричним пакетом, власним рішенням та розрідженою матрицею, що вирішує, він також має пакет призначений спеціально для абстрагування бухгалтерського обліку алгоритму, хоча я не знаю, наскільки добре він працює.
Ендрю Спотт

1
Ейген здається чудовим - мій колега використовував це в професійному контексті, і він може вас швидко та швидко працювати, не приносячи шкоди продуктивності.
qdot

7
Я також додав би такі бібліотеки до вашої відповіді: ViennaCL - бібліотека заголовків C ++ на базі OpenCL, яка може інтерфейсувати в Eigen та MTL. PLASMA - перероблений на базі UTK редизайн бібліотек BLAS і LAPACK, який містить декомпозиції на основі плитки. 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, але підтверджує й інші орієнтири (наприклад, ті, що знаходяться у плазмі).

Зауважимо, що для щільної чисельної лінійної алгебри найдоречнішими є матрично-матричні продукти. Особисто мені байдуже, чи швидше Eigen чи ATLAS. Якщо Eigen виявився швидшим, ніж ATLAS, я б застосував Eigen як BLAS-резервний сервер.

Відмова: Так, ФЛЕНС - це моя дитина! Це означає, що я зашифрував приблизно 95%, і кожен рядок коду того вартий :-)


Привіт Майкл, ласкаво просимо до scicomp. Ваша URL-адреса для мене не працює, чи щось не так з вашим сервером?
Арон Ахмадія

Дякую за підказку. URL-адреса правильна, але, здається, у нас є проблема у відділі математики з файловим сервером. Якраз на вихідні ...
Майкл Лен

1
Добре, щойно я створив нову документацію з поточного git repo і скопіював її на інший сервер: apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
Майкл Лен



1

Яка була б найкраща бібліотека матриць для роботи з матрицями малого розміру, які зазвичай використовуються, наприклад, при складанні матриць кінцевих елементів, для виконання тензорних операцій тощо.

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

Що було б найкращим вибором для пари з PETSc? Айген? Армаділло? BOOST :: uBlas? MTL4? Я використовую деякі речі з BOOST, тож спершу я подумав про використання BOOST :: uBlas, але документації, прикладів тощо не так багато ...


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

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

1

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


0

Здивований, ніхто не згадав TooN . Використовували його з радістю вже майже 3 роки.

Це дуже схоже на Eigen хоча і не такий вичерпний. Однак я думаю, що він має приємніший синтаксис.

Він також постачається з класами, які допомагають моделювати загальні перетворення, які часто зустрічаються в графіці та баченні, на основі груп ліг (спеціальний евклідовий / ортогональний у 2 та 3 вимірах тощо) та пов'язані з ними алгебри Лі.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.