Mam wąskie gardło wydajności. Obliczam kolumnową średnią dużych tablic (250 wierszy & 1,3 miliona kolumn), a robię to ponad milion razy w mojej aplikacji.Wysoka wydajność macierzy średniej
Mój przypadek testowy w Pythonie:
import numpy as np
big_array = np.random.random((250, 1300000))
%timeit mean = big_array.mean(axis = 0) # ~400 milliseconds
Numpy zajmuje około 400 milisekund na moim komputerze, działa na jednym rdzeniu. Wypróbowałem kilka innych bibliotek macierzy w różnych językach (Cython, R, Julia, Torch), ale znalazłem tylko Julię, która pokonała Numpy, biorąc około 250 milisekund.
Czy ktokolwiek może udowodnić znaczącą poprawę wydajności w tym zadaniu? Być może jest to zadanie odpowiednie dla GPU?
Edycja: Moja aplikacja jest najwyraźniej ograniczona do pamięci, a jej wydajność znacznie się poprawia, uzyskując dostęp do elementów dużej tablicy tylko raz, a nie wielokrotnie. (Patrz komentarz poniżej).
To obliczenie prawdopodobnie bardziej dotyczy dostępu do pamięci niż pracy procesora. Nie spodziewałbym się, że jakikolwiek system znacząco poprawi się w tym miejscu. Moją intuicją jest to, że używanie wielu rdzeni lub procesorów graficznych nie byłoby zbyt użyteczne. Pomocne może być jednak ograniczenie do float32. – MRocklin
Przypadek testowy mógł być zbyt prosty. Mój typ tablicy będzie faktycznie boolean, więc każdy element jest przechowywany jako bajt z Numpy. Paradoksalnie, uzyskanie wartości średniej lub sumy dla tablicy boolowskiej zajmuje więcej czasu niż w przypadku elementów pływających, jak w przykładzie. Każdy pomysł, jak wykonać operację na macierzy bitpakowanej, co zmniejszy ruch pamięci o ~ 90%? –
W mojej konkretnej aplikacji biorę średnią tablic, które są podzbiorami 250 wierszy z tablicy o liczbie 22000 wierszy. Pamięć uzyskuje dostęp tylko do 24 godzin na całe obliczenia. Jeśli jednak operuję na większej macierzy i dotykam każdego elementu tylko raz, pamięć uzyskuje dostęp do mniej niż 10 sekund. Muszę to wypróbować! Dzięki @MRocklin za wskazanie wąskiego gardła. –