AKTUALIZACJA (30.07.2014):
Ponownie przeprowadziłem test porównawczy na naszym nowym HPC. Zarówno sprzęt, jak i stos oprogramowania zmieniły się w porównaniu z konfiguracją w oryginalnej odpowiedzi.
Wyniki umieściłem w arkuszu kalkulacyjnym Google (zawiera również wyniki z oryginalnej odpowiedzi).
Sprzęt komputerowy
Nasz HPC ma dwa różne węzły, jeden z procesorami Intel Sandy Bridge, a drugi z nowszymi procesorami Ivy Bridge:
Sandy (MKL, OpenBLAS, ATLAS):
- Procesor : 2 x 16 Intel (R) Xeon (R) E2560 Sandy Bridge @ 2,00 GHz (16 rdzeni)
- RAM : 64 GB
Bluszcz (MKL, OpenBLAS, ATLAS):
- Procesor : 2 x 20 Intel (R) Xeon (R) E2680 V2 Ivy Bridge @ 2,80 GHz (20 rdzeni, z HT = 40 rdzeni)
- RAM : 256 GB
Oprogramowanie
Stos oprogramowania jest dla obu węzłów sam. Zamiast GotoBLAS2 , OpenBLAS jest używany i jest również wielowątkowy ATLAS BLAS, która jest ustawiona do 8 nici (stałe).
- OS : Suse
- Kompilator Intel : ictce-5.3.0
- Numpy: 1.8.0
- OpenBLAS: 0.2.6
- ATLAS :: 3.8.4
Benchmark produktów dot
Kod porównawczy jest taki sam jak poniżej. Jednak dla nowych maszyn przeprowadziłem również benchmark dla rozmiarów matryc 5000 i 8000 .
Poniższa tabela zawiera wyniki testu porównawczego z oryginalnej odpowiedzi (nazwa zmieniona: MKL -> Nehalem MKL, Netlib Blas -> Nehalem Netlib BLAS itp.)
Wydajność jednowątkowa:
Wydajność wielowątkowa (8 wątków):
Wątki a rozmiar matrycy (Ivy Bridge MKL) :
Pakiet Benchmark
Wydajność jednowątkowa:
Wydajność wielowątkowa (8 wątków):
Wniosek
Nowe wyniki testu porównawczego są podobne do tych w oryginalnej odpowiedzi. OpenBLAS i MKL działają na tym samym poziomie, z wyjątkiem testu wartości własnej . Test wartości własnej działa dość dobrze na OpenBLAS w trybie jednowątkowym . W trybie wielowątkowym wydajność jest gorsza.
„Rozmiar matrycy vs nici wykres” wskazują także, że chociaż MKL jak OpenBLAS ogólnie skalę oraz z liczbą rdzeni / wątków, zależy od rozmiaru macierzy. W przypadku małych matryc dodanie większej liczby rdzeni nie poprawi zbytnio wydajności.
Występuje również około 30% wzrost wydajności z Sandy Bridge do Ivy Bridge, co może być spowodowane wyższą częstotliwością zegara (+ 0,8 Ghz) i / lub lepszą architekturą.
Oryginalna odpowiedź (04.10.2011):
Jakiś czas temu musiałem zoptymalizować niektóre obliczenia / algorytmy algebry liniowej, które zostały napisane w Pythonie przy użyciu numpy i BLAS, więc przetestowałem / przetestowałem różne konfiguracje numpy / BLAS.
Konkretnie przetestowałem:
- Odrętwiały z ATLASEM
- Numpy z GotoBlas2 (1.13)
- Numpy z MKL (11.1 / 073)
- Numpy z Accelerate Framework (Mac OS X)
Przeprowadziłem dwa różne testy porównawcze:
- prosty iloczyn skalarny macierzy o różnych rozmiarach
- Pakiet Benchmark, który można znaleźć tutaj .
Oto moje wyniki:
Maszyny
Linux (MKL, ATLAS, No-MKL, GotoBlas2):
- System operacyjny : Ubuntu Lucid 10.4 64-bitowy.
- Procesor : 2 x 4 Intel (R) Xeon (R) E5504 @ 2,00 GHz (8 rdzeni)
- RAM : 24 GB
- Kompilator Intel : 11.1 / 073
- Scipy : 0,8
- Numpy : 1,5
Mac Book Pro (Accelerate Framework):
- System operacyjny : Mac OS X Snow Leopard (10.6)
- Procesor : 1 Intel Core 2 Duo 2,93 Ghz (2 rdzenie)
- RAM : 4 GB
- Scipy : 0,7
- Numpy : 1.3
Mac Server (Accelerate Framework):
- System operacyjny : Mac OS X Snow Leopard Server (10.6)
- Procesor : 4 X Intel (R) Xeon (R) E5520 @ 2,26 GHz (8 rdzeni)
- RAM : 4 GB
- Scipy : 0,8
- Numpy : 1.5.1
Benchmark produktowy
Kod :
import numpy as np
a = np.random.random_sample((size,size))
b = np.random.random_sample((size,size))
%timeit np.dot(a,b)
Wyniki :
System | rozmiar = 1000 | rozmiar = 2000 | rozmiar = 3000 |
netlib BLAS | 1350 ms | 10900 ms | 39200 ms |
ATLAS (1 procesor) | 314 ms | 2560 ms | 8700 ms |
MKL (1 procesory) | 268 ms | 2110 ms | 7120 ms |
MKL (2 procesory) | - | - | 3660 ms |
MKL (8 procesorów) | 39 ms | 319 ms | 1000 ms |
GotoBlas2 (1 procesor) | 266 ms | 2100 ms | 7280 ms |
GotoBlas2 (2 procesory) | 139 ms | 1009 ms | 3690 ms |
GotoBlas2 (8 procesorów) | 54 ms | 389 ms | 1250 ms |
Mac OS X (1 procesor) | 143 ms | 1060 ms | 3605 ms |
Serwer Mac (1 procesor) | 92 ms | 714 ms | 2130 ms |
Pakiet Benchmark
Kod :
Aby uzyskać dodatkowe informacje na temat zestawu testów, zobacz tutaj .
Wyniki :
System | wartości własne | svd | det | inv | kropka |
netlib BLAS | 1688 ms | 13102 ms | 438 ms | 2155 ms | 3522 ms |
ATLAS (1 procesor) | 1210 ms | 5897 ms | 170 ms | 560 ms | 893 ms |
MKL (1 procesory) | 691 ms | 4475 ms | 141 ms | 450 ms | 736 ms |
MKL (2 procesory) | 552 ms | 2718 ms | 96 ms | 267 ms | 423 ms |
MKL (8 procesorów) | 525 ms | 1679 ms | 60 ms | 137 ms | 197 ms |
GotoBlas2 (1 procesor) | 2124 ms | 4636 ms | 147 ms | 456 ms | 743 ms |
GotoBlas2 (2 procesory) | 1560 ms | 3278 ms | 116 ms | 295 ms | 460 ms |
GotoBlas2 (8 procesorów) | 741 ms | 2914 ms | 82 ms | 262 ms | 192 ms |
Mac OS X (1 procesor) | 948 ms | 4339 ms | 151 ms | 318 ms | 566 ms |
Serwer Mac (1 procesor) | 1033 ms | 3645 ms | 99 ms | 232 ms | 342 ms |
Instalacja
Instalacja MKL obejmowała instalację kompletnego pakietu Intel Compiler Suite, co jest dość proste. Jednak z powodu pewnych błędów / problemów konfiguracja i kompilacja numpy z obsługą MKL była trochę kłopotliwa.
GotoBlas2 to mały pakiet, który można łatwo skompilować jako bibliotekę współdzieloną. Jednak z powodu błędu musisz ponownie utworzyć współdzieloną bibliotekę po jej zbudowaniu, aby móc jej używać z numpy.
Oprócz tego budowania go dla wielu platform docelowych nie działał z jakiegoś powodu. Musiałem więc utworzyć plik .so dla każdej platformy, dla której chcę mieć zoptymalizowany plik libgoto2.so .
Jeśli zainstalujesz numpy z repozytorium Ubuntu, automatycznie zainstaluje i skonfiguruje numpy do korzystania z ATLAS . Instalacja ATLAS ze źródła może zająć trochę czasu i wymaga dodatkowych czynności (fortran itp.).
Jeśli zainstalujesz numpy na komputerze z systemem Mac OS X z portami Fink lub Mac , skonfiguruje on numpy do korzystania z ATLAS lub Accelerate Framework firmy Apple . Możesz to sprawdzić, uruchamiając ldd na pliku numpy.core._dotblas lub wywołując numpy.show_config () .
Wnioski
MKL działa najlepiej, tuż za nim znajduje się GotoBlas2 .
W teście wartości własnej GotoBlas2 działa zaskakująco gorzej niż oczekiwano. Nie wiem, dlaczego tak jest.
Accelerate Framework firmy Apple działa naprawdę dobrze, szczególnie w trybie jednowątkowym (w porównaniu z innymi implementacjami BLAS).
Zarówno GotoBlas2, jak i MKL bardzo dobrze skalują się z liczbą wątków. Więc jeśli masz do czynienia z dużymi matrycami, uruchamianie go na wielu wątkach bardzo pomoże.
W każdym razie nie używaj domyślnej implementacji blas Netlib, ponieważ jest ona zbyt wolna, aby wykonać jakąkolwiek poważną pracę obliczeniową.
Na naszym klastrze zainstalowałem również ACML AMD, a wydajność była podobna do MKL i GotoBlas2 . Nie mam żadnych trudnych liczb.
Osobiście poleciłbym użycie GotoBlas2, ponieważ jest łatwiejszy w instalacji i jest darmowy.
Jeśli chcesz kodować w C ++ / C, sprawdź również Eigen3, który w niektórych przypadkach ma przewyższać MKL / GotoBlas2 i jest również dość łatwy w użyciu.