2010-10-18 17 views
10

Poszukuję porad dotyczących wysokowydajnych wielowymiarowych bibliotek/klas dla C++. Co naprawdę potrzebne jest:Wysokowydajne tablice wielowymiarowe w C++

  • zdolność do dynamicznie przydzielać tablic o rozmiarze określonym czasie wykonywania

  • możliwość dostępu i modyfikowania wartości jednej tablicy (szybko)

  • do móc użyć prostego tablicy arytmetyczne takie jak array1 = array2 + 2 * array3

  • dobrze utrzymywane biblioteki

mam natknąć różnych bibliotek, w tym:

  • Blitz++, która wygląda dokładnie to, czego potrzebuję, ale które nie wydają się bardzo dobrze utrzymane (najnowsza wersja stabilna było 5 lat temu)

  • Boost, który nie obsługuje arytmetyki tablic i wydaje się być dość powolny w porównaniu do powiedzmy Blitz ++.

  • Jonn Bowman's array.h, który nie ma dokumentacji.

Czy ktoś ma jakieś inne sugestie lub komentarze na temat powyższych opcji?

+0

Dzięki za odpowiedzi. Dla wyjaśnienia, nie interesuje mnie algebra liniowa, tylko tablice tablicowe i proste operacje arytmetyczne. – astrofrog

Odpowiedz

2
  • uBlas, część wzmocnienia. Oferuje pełny poziom BLAS 1-3, a więc wiele arytmetycznych funkcji tablicowych.
  • Armadillo wydaje się również być biblioteką algebry liniowej C++, która jak widzę opcjonalnie używa LAPACK/Atlas (co oczywiście czyni ją kanonicznie szybką).
  • GNU Scientific Library oferuje pełne BLAS. Nie wiem, jak szybko to działa, ani czy może używać LAPACK/Atlas.
  • Jeśli nie potrzebujesz niczego bardziej wymyślnego niż to, co wymieniasz, możesz całkiem łatwo owinąć np. BLASKA Atlas'a. Ale prawdopodobnie nie chcesz odkrywać koła, jeśli nie musisz.
3

Istnieje szeroka i stosunkowo niedawna ankieta, w tym testy porównawcze, here.

Wierzę, że możesz przyspieszyć Boost.UBlas, wiążąc go z bibliotekami numerycznymi, takimi jak LAPACK lub Intel MKL, ale tego nie zrobiłeś.

fwiw, implementacje, które wydają się pojawiać najczęściej jako kandydaci to Boost.UBlas i MTL. Z mojego doświadczenia wynika, że ​​powszechna adopcja z większym prawdopodobieństwem będzie wspierać stałe wsparcie i rozwój.

4

Eigen jest bardzo dobrze utrzymany (przynajmniej teraz, co miesiąc pojawiają się nowe wersje) i wspiera inne operacje, których potrzebujesz.

+2

Eigen nie obsługuje wielowymiarowych macierzy. – Ran

+3

Eigen (master) ma teraz w pełni funkcjonalną bibliotekę tensorów (wielowymiarowe tablice) – iNFINITEi

0

Z perspektywy wydajności próbowałem boost :: MultiArray i Armadillo. Żaden z nich nie był szybki, ponieważ oba miały wolny czas dostępu w porównaniu z tablicami lub wektorami i mogłem pokonać te pakiety w operacji, takiej jak x1 (4:10) = x2 (1: 6) + x2 (2: 7) + x2 (3: 8) za pomocą prostej, ręcznie kodowanej pętli (jestem pewien, że przy pomocy optymalizacji mojego kompilatora). Kiedy dostaniesz się do multiplikacji macierzy, te pakiety mogą przynieść pewne korzyści poprzez LAPACK i BLAS, ale możesz zawsze używać tych interfejsów samodzielnie.

0

z zastrzeżeniem, że jest to bezwstydny autopromocji,

https://github.com/ndarray/ndarray

może warto przeanalizować.

Chociaż nie zapewnia zoptymalizowanych operatorów matematycznych, zapewnia w tym celu interfejs do Eigen. Tam, gdzie naprawdę się wyróżnia, zapewnia współdziałanie z Python/NumPy poprzez SWIG lub Boost.Python.

0

również inny bezwstydny autopromocji,

https://github.com/dwwork/FortCpp/

ja pisał mój osobisty rozwiązanie tego problemu w górę na GitHub. Nie jestem ekspertem C++ w żadnym stopniu, ale pomyślałem, że przynajmniej go tam wyrzucę.

2

Necomi wydaje się zapewniać funkcje, które chcesz.

Obejmuje obsługę arbitralnych liczb wielowymiarowych, których wymiary można ustalić w czasie wykonywania, zapewnia szybki dostęp do pojedynczych elementów, a jednocześnie obsługuje wyrażenia arytmetyczne (między innymi).