To jest polecenie PDL::ParallelCPUp, które można uruchomić u dostawcy bezpłatnego hostingu OnWorks przy użyciu jednej z naszych wielu bezpłatnych stacji roboczych online, takich jak Ubuntu Online, Fedora Online, emulator online Windows lub emulator online MAC OS
PROGRAM:
IMIĘ
PDL::ParallelCPU — obsługa wielowątkowości procesora równoległego w PDL (eksperymentalna)
OPIS
PDL ma wsparcie (obecnie eksperymentalne) do dzielenia przetwarzania numerycznego między
wiele równoległych wątków procesora (lub p-wątków) używających set_autopthread_targ i
set_autopthread_size Funkcje. Może to poprawić wydajność przetwarzania (o więcej niż
2-4X w większości przypadków) dzięki wykorzystaniu maszyn wielordzeniowych i/lub wieloprocesorowych.
STRESZCZENIE
użyj PDL;
# Ustaw cel 4 równoległych wątków do utworzenia, z dolnym limitem
# 5Meg elementów do dzielenia przetwarzania na równoległe wątki.
set_autopthread_targ(4);
set_autopthread_size(5);
$a = zera(5000,5000); # Utwórz tablicę elementów 25Meg
$b = $a + 5; # Przetwarzanie zostanie podzielone na wiele wątków
# Uzyskaj faktyczną liczbę wątków dla ostatniego
# operacja przetwarzania.
$aktualnePwątki = get_autopthread_actual();
Terminologia
Wykorzystanie tego terminu gwintowanie może być mylące z PDL, ponieważ może odnosić się do PDL
gwintowanie, zgodnie z definicją w PDL::Threading docs, lub do edytor wielowątkowość.
Aby zmniejszyć zamieszanie z istniejącą terminologią dotyczącą wątków PDL, w tym dokumencie zastosowano:
p-wątkowość odnosić się do edytor wielowątkowość, czyli korzystanie z wielu procesorów
wątki do podziału przetwarzania numerycznego na operacje równoległe.
Funkcje że kontrola PDL Wątki
To jest krótka lista i opis funkcji pthreading PDL, zobacz PDL::Core
szczegółowe informacje znajdują się w dokumentacji.
set_autopthread_targ
Ustaw docelową liczbę wątków procesora (pthreads) dla przetwarzania wielowątkowego.
Ustawienie auto_pthread_targ na 0 oznacza, że pthreading nie wystąpi.
Zobacz PDL::Core po szczegóły.
set_autopthread_size
Ustaw minimalny rozmiar (w Megaelementach lub 2**20 elementach) największego zaangażowanego PDL
w funkcji, w której będzie wykonywane auto-pthreading. W przypadku małych PDL prawdopodobnie
nie warto uruchamiać wielu wątków, więc ta funkcja służy do określenia minimum
próg, w którym automatyczne wątki nie będą podejmowane.
Zobacz PDL::Core po szczegóły.
get_autopthread_actual
Uzyskaj rzeczywistą liczbę wątków pthread wykonanych dla ostatniej funkcji przetwarzania pdl.
Zobacz PDL::get_autopthread_actual po szczegóły.
Globalne Control of PDL PWątek za pomocą Środowisko Zmienne
PDL PThreading można włączyć globalnie, bez modyfikowania istniejącego kodu przez ustawienie
zmienne środowiskowe PDL_AUTOPTHREAD_TARG i PDL_AUTOPTHREAD_SIZE przed uruchomieniem PDL
scenariusz. Te zmienne środowiskowe są sprawdzane podczas uruchamiania PDL i odwoływania się do
set_autopthread_targ i set_autopthread_size funkcje wykonane ze środowiskiem
wartości zmiennej.
Na przykład, jeśli środowisko var PDL_AUTOPTHREAD_TARG jest ustawiony na 3, a
PDL_AUTOPTHREAD_SIZE jest ustawiona na 10, to każdy skrypt pdl będzie działał tak, jakby następujące wiersze
były na początku pliku:
set_autopthread_targ(3);
set_autopthread_size(10);
W jaki sposób It Prace
Proces auto-pthreading działa poprzez analizę wymiarów tablicy wątków w operacjach PDL
i podział przetwarzania w oparciu o rozmiary gwintów i pożądaną liczbę
pthreads (tj. cel pthread lub pthread_targ). Przesunięcia i przyrosty, które PDL
używa do przechodzenia przez dane w pamięci są modyfikowane dla każdego pthread, więc każdy widzi a
inny zestaw danych podczas przetwarzania.
Przykład
$a = sekwencja(20,4,3); # Mała tablica 3-D, rozmiar 20,4,3
# Ustaw automatyczne wątkowanie:
set_autopthread_targ(2); # Cel 2 wątków
set_autopthread_size(0); # Zero, aby małe PDL w tym przykładzie były pthreaded
# To zostanie podzielone na 2 wątki
$c = maksimum($a);
W powyższym przykładzie maksymalny funkcja ma sygnaturę „(a(n); [o]c())”, co
oznacza, że pierwszym wymiarem $a (rozmiar 20) jest a rdzeń wymiar maksymalny
funkcjonować. Pozostałe wymiary $a (rozmiar 4,3) to gwintowane wymiary (tzn. będą
gwintowane w maksymalny funkcja.
Algorytm auto-pthreading analizuje wątki o rozmiarze (4,3) i wybiera 4
wymiar, ponieważ jest równomiernie podzielny przez autopthread_targ 2. Przetwarzanie
maksymalna funkcja jest następnie dzielona na dwa pwątki w wymiarze rozmiar 4, z dim
indeksy 0,2 przetwarzane przez jeden p-wątek
i dim indeksy 1,3 przetwarzane przez drugi pthread.
Ograniczenia
Must mieć POSIX Wątki Włączone
Auto-PThreading działa tylko wtedy, gdy twoja instalacja PDL została skompilowana z wątkami POSIX
włączony. Zwykle dzieje się tak, jeśli używasz Linuksa lub innych wariantów Uniksa.
Niebezpieczne wątkowo Code
Nie wszystkie biblioteki, z którymi łączy się PDL, są bezpieczne dla wątków, tj. nie są w nich napisane
działają w środowisku wielowątkowym bez awarii lub powodowania skutków ubocznych. Trochę
przykłady w rdzeniu PDL to FFT funkcja i pnmout funkcje.
Aby działać poprawnie z tego typu funkcjami, flaga PPCode Brak wątku został
wprowadzono w celu wskazania funkcji jako nie bycie bezpiecznym dla wątków. Zobacz dokumentację PDL::PP po szczegóły.
Rozmiar of PDL Wymiary i PWątek cel
Ze względu na sposób, w jaki PDL jest dzielony do działania przy użyciu wielu wątków, rozmiar a
wymiar musi być równomiernie podzielny przez cel pthread. Na przykład, jeśli PDL ma
rozmiary gwintów (4,3,3) i auto_pthread_targ została ustawiona na 2, to
pierwszy wymiar gwintu (rozmiar 4) zostanie wybrany do podzielenia na dwie części o rozmiarze
2 i 2. Jednakże, jeśli rozmiary gwintów wynoszą (3,3,3) i auto_pthread_targ is
nadal 2, to pthreading nie wystąpi, ponieważ żadne wymiary gwintów nie są podzielne przez 2.
Algorytm, który wybiera rzeczywistą liczbę p-wątków, ma pewną inteligencję (ale prawdopodobnie mógłby
poprawić), aby dostosować się w dół od auto_pthread_targ aby uzyskać wiele wątków, które
może równomiernie podzielić jeden z gwintowanych wymiarów. Na przykład, jeśli PDL ma wątki
rozmiary wymiarowe (9,2,2) i auto_pthread_targ wynosi 4, algorytm zobaczy, że nie
wymiar jest podzielny przez 4, a następnie zmniejsz cel do 3, co powoduje podział
pierwszy wymiar gwintowany (rozmiar 9) na 3 zwoje.
Prędkość poprawa może be mniej niż ty oczekiwać.
Jeśli masz 8-rdzeniową maszynę i zadzwoń auto_pthread_targ z 8, aby wygenerować 8 równoległych
pthreads, prawdopodobnie nie uzyskasz 8-krotnej poprawy szybkości ze względu na przepustowość pamięci
zagadnienia. Nawet jeśli masz 8 oddzielnych procesorów, które przetwarzają dane, będziesz miał (dla
najbardziej popularnych architektur maszynowych) wspólnej pamięci RAM, która teraz staje się wąskim gardłem. Dla prostych
obliczeń (np. proste dodatki) możesz napotkać limit wydajności około
4 wątki. W przypadku bardziej złożonych obliczeń limit będzie wyższy.
PRAWA AUTORSKIE
Prawa autorskie 2011 John Cerney. Możesz rozpowszechniać i/lub modyfikować ten dokument w ramach tego samego
warunki jak aktualna licencja Perla.
Zobacz: http://dev.perl.org/licenses/
Korzystaj z PDL::ParallelCPUp online za pomocą usług onworks.net