Zalecenia dotyczące użytecznej, szybkiej biblioteki macierzy C ++?


158

Czy ktoś ma rekomendacje dotyczące użytecznej, szybkiej biblioteki macierzy C ++?

Mam na myśli to, co użyteczne:

  • Obiekty macierzy mają intuicyjny interfejs (np .: mogę używać wierszy i kolumn podczas indeksowania)
  • Mogę zrobić wszystko z klasą macierzy, co mogę zrobić z LAPACK i BLAS
  • Łatwy w nauce i obsłudze API
  • Stosunkowo bezbolesny w instalacji w Linuksie (teraz używam Ubuntu 11.04)

Dla mnie użyteczność jest teraz ważniejsza niż szybkość lub zużycie pamięci, aby uniknąć przedwczesnej optymalizacji. Pisząc kod, zawsze mogłem używać tablic 1-D (lub wektorów STL) i właściwej arytmetyki indeksu lub wskaźnika do emulacji macierzy, ale wolałbym tego nie robić, aby uniknąć błędów. Chciałbym również skoncentrować mój wysiłek umysłowy na rzeczywistym problemie, który próbuję rozwiązać i zaprogramować w domenie problemowej, zamiast wykorzystywać część mojej skończonej uwagi do zapamiętywania wszystkich małych sztuczek programistycznych, których użyłem do emulacji macierzy jako tablic i zapamiętaj polecenia LAPACK, i tak dalej. Dodatkowo, im mniej kodu muszę napisać, a im bardziej znormalizowany, tym lepiej.

Gęsta kontra rzadka jeszcze nie ma znaczenia; niektóre macierze, z którymi mam do czynienia, będą rzadkie, ale nie wszystkie. Jednak jeśli dany pakiet dobrze radzi sobie z gęstymi lub rzadkimi matrycami, warto o tym wspomnieć.

Tworzenie szablonów również nie ma dla mnie większego znaczenia, ponieważ będę pracować ze standardowymi typami liczbowymi i nie będę musiał przechowywać niczego poza podwójnymi, zmiennoprzecinkowymi lub liczbami całkowitymi. To miłe, ale nie konieczne do tego, co chciałbym zrobić.


1
Czy korzystanie z CUDA jest opcją?
flipchart

1
Może być później. W tej chwili nie interesuje mnie CUDA, ponieważ buduję bibliotekę dla aplikacji, w której mnożenie macierzy jest najmniejsze z moich obaw. Większość wysiłku zostanie poświęcona na wywołanie liniowego solvera programu o mieszanej liczbie całkowitej, więc użycie CUDA byłoby przesadą. Po zakończeniu pracy planuję przyjrzeć się algorytmom, które są bardziej algebry liniowej i mniej skoncentrowane na optymalizacji. Zdecydowanie zachęcam do publikowania postów na temat bibliotek CUDA, jeśli masz z nimi doświadczenie, ponieważ jestem pewien, że inni ludzie byliby zainteresowani poznaniem twoich myśli.
Geoff Oxberry,

Co z Intel MKL i IPP?
Royi

Odpowiedzi:


146

Do tej pory zebrałem następujące informacje z badań online:

Użyłem trochę Armadillo i uznałem, że interfejs jest wystarczająco intuicyjny i łatwo było znaleźć pakiety binarne dla Ubuntu (i zakładam, że inne dystrybucje Linuksa). Nie skompilowałem go ze źródła, ale mam nadzieję, że nie będzie to zbyt trudne. Spełnia większość moich kryteriów projektowych i używa gęstej algebry liniowej. Może wywoływać procedury LAPACK lub MKL. Zasadniczo nie ma potrzeby kompilowania Armadillo, jest to biblioteka oparta wyłącznie na szablonach: wystarczy dołączyć nagłówek i link do BLAS / LAPACK lub MKL itp.

Słyszałem dobre rzeczy o Eigen , ale go nie użyłem. To twierdzi, że jest szybki , wykorzystuje templating i obsługuje gęstą algebry liniowej. Nie ma LAPACK ani BLAS jako zależności, ale wydaje się, że jest w stanie zrobić wszystko, co LAPACK może zrobić (plus niektóre rzeczy, których LAPACK nie potrafi). Wiele projektów korzysta z Eigen, co jest obiecujące. Ma pakiet binarny dla Ubuntu, ale jako biblioteka zawierająca tylko nagłówki jest trywialna w użyciu również w innych miejscach.

Matrix Template Library wersja 4 również wygląda obiecująco i wykorzystuje templating. Obsługuje zarówno gęstą, jak i rzadką algebrę liniową i może wywoływać UMFPACK jako rzadki solver. Funkcje są nieco niejasne na ich stronie internetowej. Ma pakiet binarny dla Ubuntu, do pobrania z ich strony internetowej.

PETSc , napisany przez zespół z Argonne National Laboratory, ma dostęp do rzadkich i gęstych solverów liniowych, więc przypuszczam, że może on działać jako biblioteka macierzowa. Jest napisany w C, ale myślę, że ma powiązania C ++, a nawet jeśli nie, wywołanie C z C ++ nie stanowi problemu. Dokumentacja jest niezwykle dokładna. Pakiet jest nieco przesadny w stosunku do tego, co chcę teraz zrobić (mnożenie macierzy i indeksowanie w celu skonfigurowania programów liniowych o mieszanych liczbach całkowitych), ale może być przydatny jako format macierzy dla mnie w przyszłości lub dla innych osób o różnych potrzebach niż ja.

Trilinos , napisane przez zespół z Sandia National Laboratory, zapewnia zorientowane obiektowo interfejsy C ++ dla gęstych i rzadkich matryc dzięki komponentowi Epetra, a także szablony interfejsów dla gęstych i rzadkich matryc dzięki komponentowi Tpetra. Zawiera również komponenty zapewniające działanie solvera liniowego i eigensolvera. Dokumentacja nie wydaje się tak dopracowana ani widoczna jak PETSc; Trilinos wydaje się być analogiem Sandii z PETSc. PETSc może wywoływać niektóre solvery Trilinos. Pliki binarne dla Trilinos są dostępne dla systemu Linux.

Blitz jest zorientowaną obiektowo biblioteką C ++ z binariami Linuksa. Wydaje się, że nie jest aktywnie utrzymywany (2012-06-29: wczoraj pojawiła się nowa wersja!), Chociaż lista mailingowa jest aktywna, więc istnieje społeczność, która z niej korzysta. Wydaje się, że niewiele robi na drodze numerycznej algebry liniowej poza BLAS i wygląda jak biblioteka gęstej macierzy. Korzysta z szablonów.

Boost :: uBLAS jest biblioteką obiektową C ++ i częścią projektu Boost. Obsługuje szablony i gęstą numeryczną algebrę liniową. Słyszałem, że to nie jest szczególnie szybkie.

Template Numerical Toolkit jest C ++ obiektowego biblioteka opracowany przez NIST. Jego autor, Roldan Pozo, wydaje się od czasu do czasu dodawać łaty, ale wydaje się, że nie jest już aktywnie rozwijany (ostatnia aktualizacja to 2010). Koncentruje się na gęstej algebrze liniowej i zapewnia interfejsy dla niektórych podstawowych rozkładów macierzy i solvera wartości własnych.

Elemental , opracowany przez Jacka Poulsona, to pakiet oprogramowania z gęstą pamięcią (równoległą) o gęstej algebrze liniowej napisany w stylu podobnym do FLAME . Aby zapoznać się z listą funkcji i tła projektu, zobacz jego dokumentację . Sam FLAME ma powiązaną bibliotekę dla gęstej algebry liniowej pamięci sekwencyjnej i współużytkowanej, zwaną libflame , która wydaje się być napisana w obiektowo zorientowanej C. Libflame wygląda bardzo podobnie do LAPACK, ale z lepszą notacją leżącą u podstaw algorytmów w celu szybkiego opracowania numerycznego biblioteki algebry liniowej to raczej nauka, a mniej czarna sztuka.

Istnieją inne biblioteki, które można dodać do listy; jeśli liczymy rzadkie pakiety algebry liniowej jako „biblioteki macierzy”, najlepszym wolnym, jaki znam w C, jest SuiteSparse , który jest programowany w stylu obiektowym. Korzystałem z SuiteSparse i odkryłem, że dość łatwo go odebrać; zależy od BLAS i LAPACK dla niektórych algorytmów, które rozkładają rzadkie problemy na wiele małych, gęstych podproblemów algebry liniowej. Główny autor pakietu, Tim Davis, jest niezwykle pomocny i jest wszechstronnym facetem.

The Harwell Podprogram Biblioteki słyną z nielicznych procedur algebry liniowej i są bezpłatne dla użytkowników akademickich, choć trzeba przejść przez ten proces wypełniania formularza i odbieranie wiadomości e-mail dla każdego pliku, który chcesz pobrać. Ponieważ podprogramy często mają zależności, użycie jednego solwera może wymagać pobrania pięciu lub sześciu plików, a proces może być nieco żmudny, zwłaszcza, że ​​zatwierdzenie formularza nie jest natychmiastowe.

Istnieją również inne rzadkie solwery algebry liniowej, ale o ile wiem, MUMPS i inne pakiety koncentrują się głównie na rozwiązaniu układów liniowych, a rozwiązywanie układów liniowych jest obecnie najmniejsze z moich obaw. (Może później będę potrzebował tej funkcji i może być przydatny dla innych).


2
Myślę, że pomyliłeś Eigen z Żywiołakiem; Nie pracowałem nad Eigenem, ale jestem pod wielkim wrażeniem projektu. Elemental atakuje głównie maszyny z pamięcią rozproszoną.
Jack Poulson,

3
Myślę, że moje pierwsze pytanie brzmiałoby: czy kiedykolwiek chciałbyś uruchomić coś równolegle?
Matt Knepley,

1
Powinienem wspomnieć o Trilinos ... chociaż nie ma tutaj dużej widoczności (jeszcze), jest realną alternatywą dla PETSc, z matrycowym pakietem matryc, eigensolver i rzadkim solwerem macierzy, ma również pakiet przeznaczone specjalnie do wyodrębnienia księgowości algorytmu, chociaż nie wiem, jak dobrze to działa.
Andrew Spott,

1
Eigen wydaje się świetny - mój kolega używał go w kontekście zawodowym, dzięki czemu możesz szybko zacząć działać bez poświęcania wydajności.
qdot

7
Do twojej odpowiedzi dodałbym również następujące biblioteki: ViennaCL - biblioteka nagłówków C ++ oparta na OpenCL, która może łączyć się z Eigen i MTL. PLASMA - oparta na UTK przeprojektowanie bibliotek BLAS i LAPACK z dekompozycjami opartymi na kafelkach. MAGMA - kolejny projekt UTK, który koncentruje się na poprawie wydajności LAPACK / BLAS.
Aron Ahmadia,

24

Ten dokument został napisany w marcu 2009 roku, aby pomóc w wyborze biblioteki algebry liniowej dla biblioteki naukowej. Ocenia przenośność, interfejs wysokiego poziomu i licencje dla kilku bibliotek, w tym Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos i uBlas. Wydaje się, że szczególnie lubi Flensa i Seldona . (Jednym z wymagań było wsparcie szablonów C ++ i rzadkich macierzy).


17

Ze wszystkich wymienionych powyżej projektów są tak naprawdę tylko dwa bardzo ciężkie, które są niezwykle szeroko stosowane (i nie bez powodu): PETSc i Trilinos. Oba są profesjonalnie opracowane i mają dużą bazę programistów. Wszystkie pozostałe są raczej małymi projektami w porównaniu do tych dwóch, i zalecałbym pójście z nimi, ponieważ (i) będą one wspierane przez długi czas i (ii) prawdopodobnie będą już miały wszystkie funkcje, których kiedykolwiek będziesz potrzebować algebra liniowa (i wiele więcej).


4
PETSc nie ma nic więcej niż nieco abstrakcyjny interfejs do ScaLAPACK i PLAPACK. Jeśli Geoff jest zainteresowany wygodną gęstą algebrą liniową, myślę, że PETSc to przesada (nie wiem wystarczająco dużo o gęstych zdolnościach Trilinosa do komentowania)
Aron Ahmadia

@AronAhmadia: W tym momencie myślę, że odpowiedź zmieniła się w bardziej zasób wiki społeczności, dlatego dodałem pakiety na prośbę komentujących.
Geoff Oxberry

3
@WolfgangBangerth: Myślę, że ważne jest, aby wspomnieć o celach projektowych. Jeśli celem jest napisanie trwałego oprogramowania, które ma być używane przez innych, a algebra liniowa jest integralną częścią tego oprogramowania, PETSc i Trilinos są dobrym wyborem. Są jednak przypadki, w których preferowane i przydatne są bardziej lekkie opcje, ponieważ mają one prostsze interfejsy API i mogą wykonać prawie to samo zadanie w mniejszej liczbie wierszy kodu. Wreszcie, błąd selekcji odgrywa rolę w przetrwaniu kodów. Jeśli nikt nie użyje mniejszych kodów, nie przetrwają ani nie zbudują bazy takiej jak PETSc i Trilinos.
Geoff Oxberry

1
Aby dodać do tego, co powiedział Geoff, ogromna większość funkcjonalności PETSc i Trilinos pochodzi z owijarek wokół bibliotek zewnętrznych. Stwierdzenie, że nikt nie powinien bezpośrednio używać wspomnianych bibliotek zewnętrznych, wydaje mi się dziwne.
Jack Poulson

1
@JackPoulson: Właściwie podtrzymuję mój komentarz. Tak, PETSc pakuje wiele pojedynczych paczek. Ale robi to z jednolitym interfejsem i dlatego łatwiej jest się tego nauczyć raz niż poznać osobliwości każdej konwencji nazewnictwa i stylu każdego pakietu. Innymi słowy, chociaż każdy pojedynczy projekt może równie dobrze korzystać z zapakowanych pakietów, istnieje synergia wynikająca z ich używania za pośrednictwem PETSc za każdym razem.
Wolfgang Bangerth,

11

Jeśli chcesz

  • Zajęcia z macierzy z intuicyjnym interfejsem
  • Wszystkie funkcje LAPACK i BLAS
  • Łatwy w nauce i obsłudze API
  • Łatwe do zainstalowania

Następnie polecam zajrzeć do mojej biblioteki FLENS . Zaprojektowałem go do takich właśnie zadań. Wymaga to jednak kompilatora zgodnego z C ++ 11 (np. Gcc 4.7 lub clang).

FLENS zapewnia dokładnie taką samą wydajność jak bazowa implementacja BLAS. Pokazuje to kilka (raczej starych) testów porównawczych

To samo można powiedzieć o FLENS-LAPACK, który zapewnia dokładnie taką samą wydajność jak LAPACK firmy Netlib, jeśli używana jest ta sama implementacja BLAS.

Jeśli chodzi o nowe testy porównawcze, pozwól mi bardziej szczegółowo ...

Jakiś czas temu zapytałem Clinta Whaleya (autora ATLAS), co myśli o testach opublikowanych na stronie Eigen. Właśnie potwierdził moje podejrzenie, że te testy porównawcze najprawdopodobniej nie są wiarygodne. W międzyczasie kilka innych zrealizowanych testów porównawczych, jak sugerował Clint. Szczegóły można znaleźć na stronie ATLAS i liście mailingowej Eigen. Testy porównawcze nie są ładnie przedstawione na wykresach, ale pokazują, że ATLAS jest zawsze o około 40% szybszy niż Eigen. Jest to sprzeczne z testami porównawczymi z witryny Eigen, ale potwierdza inne testy porównawcze (np. Te z blaze-lib).

Zauważ, że dla gęstej numerycznej algebry liniowej produkty macierz-macierz są najbardziej odpowiednie. Osobiście nie dbam o to, czy Eigen czy ATLAS jest szybszy. Jeśli Eigen był szybszy niż ATLAS, użyłbym Eigen jako backendu BLAS.

Oświadczenie: Tak, FLENS to moje dziecko! Oznacza to, że kodowałem około 95%, a każda linia kodu była tego warta :-)


Cześć Michael, witamy w scicomp. Twój adres URL nie działa dla mnie, czy coś jest nie tak z twoim serwerem?
Aron Ahmadia

Dzięki za podpowiedź. Adres URL jest poprawny, ale wydaje się, że mamy problem z działem matematyki z serwerem plików. W samą porę na weekend ...
Michael Lehn

1
Ok, właśnie utworzyłem nową dokumentację z bieżącego repozytorium git i skopiowałem ją na inny serwer: apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
Michael Lehn



1

Jaka byłaby najlepsza biblioteka macierzy do radzenia sobie z macierzami o małych rozmiarach, które są powszechnie używane, na przykład podczas składania macierzy elementów skończonych, do wykonywania operacji tensorowych i tak dalej.

Już używam PETSc do rozwiązania dużych rzadkich systemów liniowych powstających w mojej aplikacji, ale obecnie używam własnej prostej biblioteki do radzenia sobie z tymi macierzami / wektorami ... Zastanawiam się nad przejściem do szybszej biblioteki jak te wymienione powyżej.

Jaki byłby najlepszy wybór do połączenia z PETSc? Eigen? Pancernik? BOOST :: uBlas? MTL4? Używam niektórych rzeczy z BOOST, więc najpierw pomyślałem o użyciu BOOST :: uBlas, ale nie ma dużo dokumentacji, przykładów itd. ...


2
Zdecydowanie odradzam używanie uBlasu, ponieważ wiadomo, że jest o rząd wielkości wolniejszy niż zoptymalizowane procedury BLAS. Myślę, że Eigen świeci najbardziej dla bardzo małych matryc ze względu na sprytne sztuczki z szablonami.
Jack Poulson,

1
Prawdopodobnie lepiej dla osobnego pytania. Wiem, że Eigen, MTL4 i Armadillo mają sztuczki w rozwiązywaniu systemów małych rozmiarów, ale myślę, że pytasz o to, jak złożyć matryce, a do tego nie wiem. Zazwyczaj układam macierze element po elemencie. Nie jestem pewien, czy którakolwiek z wymienionych bibliotek nadaje się do łączenia z PETSc; Nie jestem jeszcze użytkownikiem PETSc. Drugi komentarz Jacka na temat Boost :: uBlas, ponieważ jest powolny.
Geoff Oxberry


0

Zaskoczony, jak dotąd nikt nie wspomniał o TooN . Z radością korzystam z niego od prawie 3 lat.

Jest bardzo podobny do Eigen, choć nie tak kompleksowy. Myślę jednak, że pod pewnymi względami ma ładniejszą składnię.

Zawiera również klasy, które pomagają modelować typowe transformacje, które często występują w Grafice i Wizji, w oparciu o Grupy Liego (Specjalny Euklidesowy / Ortogonalny w 2 i 3 wymiarach itp.) I powiązane Algebry Liego.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.