• Nie Znaleziono Wyników

Pracownia Technik Obliczeniowych Wydajność i współbieżność Paweł Daniluk

N/A
N/A
Protected

Academic year: 2021

Share "Pracownia Technik Obliczeniowych Wydajność i współbieżność Paweł Daniluk"

Copied!
14
0
0

Pełen tekst

(1)

Pracownia Technik Obliczeniowych

Wydajność i współbieżność

Paweł Daniluk

Wydział Fizyki

Wiosna 2016

(2)

Pomiar wydajności programu

Mityczna zasada 20/80

Z reguły czas działania programu zależy od wydajności niewielkiego fragmentu. 20% kodu zajmuje 80% czasu wykonania.

Profilowanie (ang. profiling )

Pomiar czasu działania programu w rozbiciu na poszczególne funkcje

(metody) lub linie.

(3)

Profilowanie w Pythonie...

... jest bardzo łatwe.

Moduł cProfile

p y t h o n −m c P r o f i l e [−o o u t p u t _ f i l e ] [− s s o r t _ o r d e r ] m y s c r i p t . py

Można również uruchamiać profilowanie określonych fragmentów z poziomu

programu.

(4)

Przykład

profile_test.py

d e f s l o w (N= 1 0 0 0 0 0 0 ) : t o t a l = 0

f o r i i n r a n g e(N ) : t o t a l += i r e t u r n t o t a l

d e f p y t h o n i c (N= 1 0 0 0 0 0 0 ) : t o t a l = sum ( r a n g e (N) ) r e t u r n t o t a l

i f __name__ == ’__main__ ’ : s l o w ( )

p y t h o n i c ( )

(5)

Przykład

$ p y t h o n −m c P r o f i l e . / p r o f i l e _ t e s t . py 7 f u n c t i o n c a l l s i n 0 . 0 7 5 s e c o n d s O r d e r e d by : s t a n d a r d name

n c a l l s t o t t i m e p e r c a l l cumtime p e r c a l l f i l e n a m e : l i n e n o ( f u n c t i o n ) 1 0 . 0 0 0 0 . 0 0 0 0 . 0 7 5 0 . 0 7 5 p r o f i l e _ t e s t . py :3( < module >) 1 0 . 0 3 5 0 . 0 3 5 0 . 0 5 3 0 . 0 5 3 p r o f i l e _ t e s t . py : 3 ( s l o w ) 1 0 . 0 0 6 0 . 0 0 6 0 . 0 2 2 0 . 0 2 2 p r o f i l e _ t e s t . py : 9 ( p y t h o n i c )

1 0 . 0 0 0 0 . 0 0 0 0 . 0 0 0 0 . 0 0 0 { method ’ d i s a b l e ’ o f ’ _ l s p r o f . P r o f i l e r ’ o b j e c t s } 2 0 . 0 2 7 0 . 0 1 3 0 . 0 2 7 0 . 0 1 3 { r a n g e }

1 0 . 0 0 8 0 . 0 0 8 0 . 0 0 8 0 . 0 0 8 {sum}

(6)

Wizualizacja

Jest wiele narzędzi do wizualizowania wyniku profilowania. Bardzo przyjemny jest snakeviz.

Użycie

$ p y t h o n −m c P r o f i l e −o p r o f _ r e s u l t . / p r o f i l e _ t e s t . py

$ s n a k e v i z p r o f _ r e s u l t

(7)

Współbieżność

Komputery mają więcej niż jeden procesor. Czy można to łatwo wykorzystać?

Rodzaje współbieżności podział danych podział pracy

Techniki

Symmetric MultiProcessing (SMP) – równoprawne procesory wewnątrz jednej maszyny

przekazywanie komunikatów – procesy mogą być uruchomione

gdziekolwiek

(8)

OpenMP, pymp

Technika pozwalająca na łatwe zrównoleglenie wykonywania pętli. Nie wymaga znaczących zmian w programie.

e x _ a r r a y = np . z e r o s ( ( 1 0 0 , ) , d t y p e= ’ u i n t 8 ’ ) f o r i n d e x i n r a n g e ( 0 , 1 0 0 ) :

e x _ a r r a y [ i n d e x ] = 1

p r i n t( ’ Yay ! ␣ {} ␣ done ! ’ . f o r m a t ( i n d e x ) )

e x _ a r r a y = pymp . s h a r e d . a r r a y ( ( 1 0 0 , ) , d t y p e= ’ u i n t 8 ’ ) w i t h pymp . P a r a l l e l ( 4 ) a s p :

f o r i n d e x i n p . r a n g e ( 0 , 1 0 0 ) : e x _ a r r a y [ i n d e x ] = 1

# The p a r a l l e l p r i n t f u n c t i o n t a k e s c a r e o f a s y n c h r o n o u s o u t p u t . p . p r i n t ( ’ Yay ! ␣ {} ␣ done ! ’ . f o r m a t ( i n d e x ) )

(9)

pymp

Identyfikacja wątku

w i t h pymp . P a r a l l e l ( 4 ) a s p :

p . p r i n t ( p . num_threads , p . thread_num )

(10)

pymp

Komunikacja pomiędzy wątkami

Komunikacja pomiędzy wątkami odbywa się poprzez zmienne dzielone.

Należy samodzielnie zapewnić ochronę dostępu do nich.

e x _ a r r a y = pymp . s h a r e d . a r r a y ( ( 1 , ) , d t y p e= ’ u i n t 8 ’ ) w i t h pymp . P a r a l l e l ( 4 ) a s p :

f o r i n d e x i n p . r a n g e ( 0 , 1 0 0 ) : w i t h p . l o c k :

e x _ a r r a y [ 0 ] += 1

(11)

pymp

Zagnieżdżone pętle

w i t h pymp . P a r a l l e l ( 2 ) a s p1 : w i t h pymp . P a r a l l e l ( 2 ) a s p2 :

p . p r i n t ( p1 . thread_num , p2 . thread_num )

Równoległe wykonywanie różnych kodów

w i t h pymp . P a r a l l e l ( 4 ) a s p : f o r s e c _ i d x i n p . x r a n g e ( 4 ) :

i f s e c _ i d x == 0 :

p . p r i n t ( ’ S e c t i o n ␣ 0 ’ ) e l i f s e c _ i d x == 1 :

p . p r i n t ( ’ S e c t i o n ␣ 1 ’ ) . . .

(12)

Zadanie 1

Zbadaj wydajność programu liczącego kolejne liczby Fibonacciego.

d e f f i b ( n ) : i f n == 0 :

r e t u r n 0 e l i f n == 1 : r e t u r n 1 e l s e :

r e t u r n f i b ( n−1) + f i b ( n−2) d e f f i b _ s e q ( n ) :

s e q = [ ] i f n > 0 :

s e q . e x t e n d ( f i b _ s e q ( n −1)) s e q . append ( f i b ( n ) )

r e t u r n s e q

(13)

Zadanie 2

Jak zmienia się wydajność programu z zadania 1 po dodaniu do funkcji fib dekoratora memoize.

c l a s s memoize :

d e f __init__ ( s e l f , f u n c t i o n ) : s e l f . f u n c t i o n = f u n c t i o n s e l f . memoized = {}

d e f __call__ ( s e l f , ∗ a r g s ) : t r y :

r e t u r n s e l f . memoized [ a r g s ] except K e y E r r o r :

s e l f . memoized [ a r g s ] = s e l f . f u n c t i o n ( ∗ a r g s ) r e t u r n s e l f . memoized [ a r g s ]

(14)

Zadanie 3

Obliczyć metodą niewydajną (z zadania 1) 100 liczb Fibonacciego na

zadanej liczbie procesorów. Zmierzyć czas wykonania programu w

zależności od liczby procesorów.

Cytaty

Powiązane dokumenty

Powłoka systemu (shell) jest doskonałym narzędziem, które pozwala zrobić sporo więcej niż tylko uruchamiać programy.. Shell jest kompletnym

Uruchom dwa wsady: ten z zadania 2 i dodatkowy, który po zakończeniu pierwszego zliczy maszyny, na które

Systemy UNIXowe mają z reguły ten sam układ katalogów.. /bin Podstawowe pliki wykonywalne dostępne dla wszystkich (np. cat,

Zaimplementuj klasę Complex realizującą podstawowe operacje na liczbach zespolonych oraz testy jednostkowe

W programie może występować co najwyżej jedna funkcja o danej

Abstract factory Provide an interface for creating families of related or dependent objects without specifying their concrete classes. Builder Separate the construction of a

Można zastosować atrybuty w obydwu powiązanych klasach, ale wtedy trzeba dbać o ich aktualizację.. Daniluk (Wydział Fizyki)

Stosowanie klas abstrakcyjnych jest konieczne, jeżeli ma istnieć możliwość operowania w tym samym kontekście na obiektach różnych klas, które nie mają naturalnej