2013-07-14 21 views
6

Obecnie badam bibliotekę Caddillo C++ dla algebry liniowej. Z tego co rozumiem, wykorzystuje bibliotekę LAPACK/BLAS do podstawowych operacji macierzy (np. Mnożenie macierzy). Jako użytkownik systemu Windows pobrałem LAPACK/BLAS stąd: http://icl.cs.utk.edu/lapack-for-windows/lapack/#running. Problem polega na tym, że multiplikacje macierzy są bardzo powolne w porównaniu do Matlab lub nawet R. Na przykład Matlab mnoży dwie macierze 1000x1000 w ciągu ~ 0,15 sekundy na moim komputerze, R potrzebuje ~ 1 sekundę, podczas gdy C++/Armadillo/LAPACK/BLAS potrzebuje więcej niż 10 sekund na to.Szybkie LAPACK/BLAS dla mnożenia macierzy

Tak, Matlab oparty jest na wysoce zoptymalizowanych bibliotekach dla algebry liniowej. Moje pytanie brzmi: czy istnieje szybsza braterka LAPACK/BLAS do użycia z Armadillo? Alternatywnie, czy istnieje sposób na wyodrębnienie bibliotek algebry liniowej Matlab i użycie ich w C++?

+2

Jeśli umieścisz -1, proszę dać mi wskazówkę, w jaki sposób mogę poprawić moje pytanie. – Kasablanca

Odpowiedz

12

LAPACK nie robi mnożenia macierzy. To BLAS zapewnia mnożenie macierzy.

Jeśli masz 64-bitowy system operacyjny, polecam najpierw wypróbować 64-bitową wersję BLAS. To zapewni natychmiastowe podwojenie wydajności.

Po drugie, przyjrzyj się wysokowydajnej implementacji BLAS, takiej jak OpenBLAS. OpenBLAS wykorzystuje zarówno wektoryzację jak i równoległość (tj. Wielordzeniowość). Jest to darmowy (bezpłatny) projekt open source.

Matlab korzysta wewnętrznie z biblioteki Intel MKL, której można również używać z Armadillo library. Intel MKL jest zamkniętym źródłem, ale jest darmowy do użytku niekomercyjnego. Zauważ, że OpenBLAS może uzyskać wydajność mnożenia macierzy, która jest równa lub lepsza niż Intel MKL.

Należy pamiętać, że algebra liniowa o wysokiej wydajności jest zwykle łatwiejsza do osiągnięcia w systemach Linux i Mac OS X niż w systemie Windows.

+0

Dziękuję za tak wyczerpującą odpowiedź! – Kasablanca

+0

Myślę, że twoje ostatnie stwierdzenie jest błędne. Na przykład MATLAB działa szybciej na Windowsie niż na Linuksie. Ogólnie rzecz biorąc, Intel MKL jest szybszy w systemie Windows. – Royi

+0

MKL dla systemów Windows i Linux używa tej samej podstawy kodu – mtall

1

czy istnieje sposób, aby wyodrębnić Matlab bibliotek algebry liniowej jakoś i wykorzystywać je w C++ Tak, dla C++ funkcji połączeń Matlab, odnoszą się do tego linku: How to Call Matlab Functions from C++

+0

Kompilator Matlab dużo kosztuje! – alexbuisson

+0

@alexbuisson To dlaczego matlab? Znam jeszcze jedną bibliotekę algebry liniowej, BLAS, która nadaje się do obliczeń o wysokiej wydajności. – lulyon

+0

Tak, dlatego używam Octave. To była tylko uwaga, aby zauważyć, że Matlab IDE i Compiler to dwie różne rzeczy. – alexbuisson

4

Dodając do tego, co już zostało powiedziane, należy użyć także wysoki poziom optymalizacji:

  1. Należy używać albo O2 lub kompilator Flaga O3.

  2. łączą się z wyżej wysoką wydajność (ewentualnie wielowątkowym) BLAS biblioteki. AFAIK MKL jest dostępny tylko na platformach Unix, ale jeśli używasz systemu Linux, takiego jak cygwin w oknach, to powinno być OK, tak myślę. OpenBLAS jest również wielowątkowy.

  3. W wielu bibliotekach ustawianie symbolu NDEBUG (np. Przekazanie flagi kompilatora -DNDEBUG) wyłącza kosztowne sprawdzanie zakresu i asercje.Pancernik ma swój własny symbol, nazwany ARMA_NO_DEBUG, który możesz albo ustawić ręcznie, albo możesz edytować plik nagłówkowy config.hpp (znajdujący się w katalogu zawierającym pancernik) i odkomentować odpowiedni wiersz. Jestem zgadywania, ponieważ byli w stanie włączyć zewnętrznego BLAS stosowania w pancernik, należy zapoznać się z tym plikiem konfiguracyjnym anyways ...

Zrobiłem krótkie porównanie między Armadillo/MKL_BLAS i Matlab na moim Core Intel -i7 stacja robocza. Dla ex-C++ użyłem -O3, MKL BLAS i zdefiniowałem ARMA_NO_DEBUG. Mnożyłem 1000 razy 1000 losowych macierzy 100 razy i uśredniałem czasy mnożenia. Implementacja C++ była około 1,5 razy szybsza niż w przypadku programu Matlab.

Mam nadzieję, że to pomoże