JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA. Marcin Lewandowski [ mlew@ippt.gov.pl ]



Podobne dokumenty
Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Zaawansowany kurs języka Python

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Kurs rozszerzony języka Python

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Programowanie komputerów

Wsparcie dla OpenMP w kompilatorze GNU GCC Krzysztof Lamorski Katedra Informatyki, PWSZ Chełm

Współbieżność w środowisku Java

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

System operacyjny MACH

Projektowanie oprogramowania systemów PROCESY I ZARZĄDZANIE PROCESAMI

Kurs języka Python. Wątki

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Nowoczesne technologie przetwarzania informacji

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Komputery przemysłowe i systemy wbudowane

4. Procesy pojęcia podstawowe

Przetwarzanie Równoległe i Rozproszone

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Jak ujarzmić hydrę czyli programowanie równoległe w Javie. dr hab. Piotr Bała, prof. UW ICM Uniwersytet Warszawski

PRZEWODNIK PO PRZEDMIOCIE

4. Procesy pojęcia podstawowe

Obliczenia równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Task Parallel Library

Systemy Rozproszone Technologia ICE

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Tryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA. Marcin Lewandowski [ mlew@ippt.gov.pl ]

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Tutorial prowadzi przez kolejne etapy tworzenia projektu począwszy od zdefiniowania przypadków użycia, a skończywszy na konfiguracji i uruchomieniu.

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Zaawansowane programowanie w C++ (PCP)

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Struktury systemów operacyjnych

Systemy operacyjne. Wprowadzenie. Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Programowanie Rozproszone i Równoległe

Programowanie i projektowanie obiektowe

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

Lock Manager Deadlock Źródła Jak starczy czasu. Dreadlocks. Konrad Błachnio MIMUW 19 maja 2010

Programowanie współbieżne i rozproszone

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

76.Struktura oprogramowania rozproszonego.

Wprowadzenie. Dariusz Wawrzyniak 1

Programowanie współbieżne Wykład 1. Rafał Skinderowicz

Projektowanie oprogramowania systemów WĄTKI I SYNCHRONIZACJA

Algorytmy i Struktury Danych

Podstawy programowania skrót z wykładów:

Programowanie wielowątkowe. Tomasz Borzyszkowski

Programowanie współbieżne Wykład 9 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

Kurs programowania. Wykład 8. Wojciech Macyna

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Aplikacje w Javie- wykład 11 Wątki-podstawy

Programowanie w Ruby

Wywoływanie metod zdalnych

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

Programowanie i projektowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Programowanie w modelu równoległości danych oraz dzielonej globalnej pamięci wspólnej. Krzysztof Banaś Obliczenia równoległe 1

Middleware wprowadzenie października 2010

Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Programowanie obiektowe

Middleware wprowadzenie października Dariusz Wawrzyniak (IIPP) 1

Programowanie procesorów graficznych GPGPU

1 Atrybuty i metody klasowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Kompilator języka C na procesor 8051 RC51 implementacja

Systemy operacyjne. wykład dr Marcin Czarnota laboratorium mgr Radosław Maj

Programowanie współbieżne Wykład 1. Rafał Skinderowicz

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Język Java wątki (streszczenie)

Programowanie współbieżne... (2)

PRZEWODNIK PO PRZEDMIOCIE

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Podstawy programowania obiektowego

Instrukcja laboratoryjna cz.3

Signals + Threads: Qt vs. Boost

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

Struktura systemu operacyjnego. Opracował: mgr Marek Kwiatkowski

Tworzenie aplikacji rozproszonej w Sun RPC

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Programowanie współbieżne i rozproszone

Wątki i komunikacja między nimi w języku Python

dr inż. Konrad Sobolewski Politechnika Warszawska Informatyka 1

Programowanie wielowątkowe. Jarosław Kuchta

Ada95 przetwarzanie rozproszone

Ada95 przetwarzanie rozproszone

Sphinx - system dokumentacji dla Pythona

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Transkrypt:

JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA Marcin Lewandowski [ mlew@ippt.gov.pl ]

HPC 2

Co zrównoleglać (logicznie i fizycznie)? Programowanie z asynchronicznymi zdarzeniami np. interfejs użytkownika, komunikacja sieciowa, obsługa operacji I/O (pliki), etc. Programy których wydajność można zwiększyć przez ukrycie latencji (opóźnień): Długo trwające operacje I/O (zapis/odczyt z plików, komunikacja sieciowa) W czasie trwania tych operacji program może wykonać inną potrzebną pracę Programy intensywnie obliczeniowe: Zagadnienia numeryczne, które silnie wykorzystują jednostki obliczeniowe mogą uzyskać znacznie przyśpieszenie przy wykonywaniu na komputerze z wieloma procesorami/rdzeniami jeśli zadani zostanie podzielone na wątki (lub procesy) 3

Równoległość zadań Źródło: http://en.wikipedia.org/wiki/openmp 4

Co to jest proces? Niezależny kontekst wykonawczy wraz z własną odizolowaną przestrzenią pamięci i zasobami Procesy pomiędzy sobą nie dzielą niczego (z wyjątkiem maszyny ;-) Procesy muszą komunikować się między sobą za pomocą mechanizmów IPC (Inter-Process Communication); do wymiany danych oraz synchronizacji Procesy są ciężkie (wymagają sporo zasobów) 5

Co to jest wątek? Kontekst wykonywania programu Współdzieli pamięć i stan ze swoim rodzicem (procesem w którym żyje). Wątki są lekkie (tj. nie wymagają dużych zasobów) Posiadają własny stos (i prywatne zmienne lokalne) Nie muszą używać IPC do komunikacji z innymi wątkami w procesie Wątki Python = wątki systemu operacyjnego (w Linux POSIX Threads pthreads) 6

Wątek vs. Proces Wątki współdzielą wszystko, dlatego programista musi pilnować wielodostępu do wspólnych danych Procesy nie współdzielą nic, dlatego programista musi explicite zatroszczyć się o współdzielenie danych/stanu pomiędzy procesy 7

Python GIL Python GIL (Global Interpreter Lock) zabezpiecza interpreter Pythona przed wielodostępem, co niestety ogranicza możliwość fizycznego zrównoleglenia. Co robi GIL: GIL zapewnia, że tylko jeden wątek jest wykonywany w danej chwili przez interpreter Pythona (cpythonvm) GIL kontroluje sposób wykonywania wątków. Python ustala jak długo wątek ma być wykonywany (~10 instrukcji). Python wykorzystuje wątki systemu operacyjnego, ale sam kontroluje przekazywanie kontekstu wykonawczego. 8

GIL Co dobrego daje GIL: Realizuje koncepcję kooperatywnej wielozadaniowości Interpreter wie najlepiej kiedy bezpiecznie przełączyć kontekst wykonywania Często jest bardzie efektywny od wielozadaniowości z wywłaszczaniem Może być zwolniony w module C (np. dla długotrwałych operacji I/O) Łatwe kodowanie (nie musimy się pilnować) Łatwą implementację modułów rozszerzeń 9

Moduły Moduł thread _thread (w Python 3+) threading multiprocessing subprocess select Funkcje Nisko poziomowy moduł do wielowątkowości Wysoko poziomowy moduł do wielowątkowości (zbudowany na bazie modułu thread) Wysoko poziomowy moduł do wieloprocesowości Zarządzanie podprocesami Waiting for I/O completion 10

Moduł threading Wysoko poziomowy moduł do realizacji wielowątkowości Zbudowany na nisko poziomowym module thread Działa w oparciu o wątki systemu operacyjnego Równoległość jest ograniczona przez GIL 11

Obiekt threading.thread class threading.thread(group=none, target=none, name=none, args=(), kwargs={}) konstruktor z argumentami nazwanymi: group powinno być None; zarezerwowane dla przyszłych rozszerzeń (ThreadGroup). target wołalny obiekt, który ma być uruchomiony w nowym wątku przez metodę run() name nazwa wątku. Domyślnie tworzona w konstruktorze w postaci Thread-N, gdzie N jest liczbą. args is the argument tuple for the target invocation. Defaults to (). kwargs is a dictionary of keyword arguments for the target invocation. Defaults to {}. Jeśli podklasa nadpisuje konstruktor musi wywołać na samym początku metodę klasy bazowej Thread. init (). Thread.start() startuje wątek. Musi być wywołana tylko raz dla obiektu (zgłasza wyjątek RuntimeException jeśli wywołana więcej razy). Startuje wątek, w którym będzie wywołana metoda run(). Thread.run() metoda realizowana w wątku, która może być przedefiniowana w klasie potomnej. Metoda w klasie bazowej wywołuje obiekt przekazany w konstruktorze (target) z argumentami args i kwargs. Thread.join([timeout]) czeka na zakończenie wątku. Jest to metoda blokująca z zadanym czasem timeout (float w sekundach). W celu określenia stanu wątku po timeout należy użyć metod: isalive(). Metoda join() może być wywoływana wiele razy dla jednego wątku. 12

Obiekt threading.lock Prymitywny obiekt synchronizacyjny typu lock; nie związany z konkretnym wątkiem. Lock ma dwa stany locked i unlocked. Po utworzeniu jest w stanie unlocked. Lock.acquire() Gdy w stanie unlocked zmienia natychmiast stan na locked ; Gdy w stanie locked, acquire() blokuje do momenty wywołania release() w innym wątku i ustawia do stanu locked. Lock.release() powinna być wołana tylko w stanie locked w celu natychmiastowej zmiany stanu na unlocked. Wyjątek RuntimeError jest generowany gdy zwalniany jest obiekt w stanie unlocked. Gdy więcej wątków jest zablokowanych na acquire(), tylko jeden z nich jest odblokowywany dla jednego wywołania release(). Wszystkie te metody są wykonywane atomowo. 13

Obiekt threading.semaphore Jeden z najstarszy obiektów synchronizacyjnych (wymyślony przez W. Dijkstra). Semafor zarządza wewnętrznym licznikiem, który jest zmniejszany przy każdym wywołaniu acquire() i zwiększany przy każdym wywołaniu release(). Licznik jest zawsze >=0 Funkcja acquire() wołana dla Semafora o wartości 0 blokuje się do momentu kiedy inny wątek wywoła release(). class threading.semaphore([value]) tworzy semafor; opcjonalny argument value określa początkową wartość licznika (domyślnie 1). Semaphore.acquire([blocking]) pobiera semafor. Wywołany bez argumentów (lub blocking=ture): jeśli licznik >0 zmniejsza jego wartość o 1 i wraca natychmiast, jeśli licznik=0 blokuje do do momentu wywołania release() w innym wątku. Wywołany z blocking=false: działa w trybie nie blokującym zwracając False natychmiast gdy nie może pobrać semafora lub True gdy udało się go pobrać. Semaphore.release() zwalnia semafor; zwiększając stan licznika o 1. 14

Moduł multiprocessing Interfejs wielowątkowy opartym na procesach Składnia analogiczna do modułu threading: threading : Thread(target=do_work, args=(work_queue,)) multiprocessing: Process(target=do_work, args=(work_queue,)) TRZEBA PAMIĘTAĆ! Procesy nie współdzielą NICZEGO (w szczególności pamięci)! Wymiana danych pomiędzy procesami może odbywać się przez jeden z mechanizmów komunikować IPC (Inter-Process Communication) 15

Wątki Python/C Python może tworzyć wątki w modułach C/C++: Wątki C/C++ są niezależnymi wątkami natywnymi (nie Pythonowymi) i potencjalnie mogą działać równolegle (o ile zwolnimy GIL). W modułach C można programowo zwolnić GIL Inną alternatywą jest utworzenie wielu interpreterów Pythona (w jednym lub wielu procesach) 16

Python IPC & Networking Następujące moduły zapewniają mechanizmy komunikacji IPC: subprocess zarządzanie procesami potomnymi + mechanizm strumieni I/O (popen) socket nisko poziomowy interfejs sieciowy ssl warstwa SSL dla socket signal obsługa sygnałów dla zdarzeń asynchronicznych asyncore asynchroniczne socket asynchat asynchroniczne socket + komenda/odpowiedź signal, subprocess działają tylko dla dwóch procesów na tej samej maszynie inne moduły komunikacji sieciowej mogą służyć do komunikacji wielu procesów na jednej lub wielu maszynach w sieci. 17

Sumowanie liczb pierwszych 3 implementacje EX: hpc Suma liczb pierwszych w zakresie 1-10000 Jednowątkowa 152 sek. Wielowątkowa 425 sek.! Wieloprocesowa xxx sek. Na podstawie: Jesse Noller, Getting started with Concurrency...using Multiprocessing and Threading, PyWorks, Atlanta 2008 18

Sumowanie liczb pierwszych 3 implementacje MT 4 wątki 19

Poważne HPC MPI Message Passing Interface dla systemów z pamięcią rozproszoną (http://www.mcs.anl.gov/research/projects/mpi) OpenMP dla systemów z pamięcią współdzieloną (http://openmp.org) 20

MPI w Python mpi4py MPI jest de facto standardem dla systemów z typu message-passing. MPI jest zestawem API (Application Programmer Interfaces) wywoływalnych przez programy użytkownika w C/C++ (i innych językach) Istnieje wiele implementacji MPI zarówno open source (generyczne) oraz zamknięte i zoptymalizowane do konkretnych maszyn. 21

Implementacje MPI dla Pythona mpi4py (http://mpi4py.scipy.org) API bazuje na bibliotece MPI-2 C++ Działa z open-source implementacjami MPI (MPICH2, Open MPI, MPICH1, LAM) mpi4py pozwala na użycie z Pythona kodu C/C++/Fortran opartego na MPI (za pomocą: Cython, SWIG, F2Py) pympi (http://pympi.sourceforge.net) Starsza implementacja Patrz: http://fperez.org/py4science/2009_siam_cse/mpi4py_ldalcin_bgranger_siam_cse09 22

GPGPU PyCUDA Zapewnia na pełny dostęp do Nvidia CUDA API z Pythona Many abstractions are already provided for you PyOpenCL j.w. ale przez interfejs OpenCL 23

Różne takie inne opcje IPython for parallel computing Bulk Synchronous Parallel (BSP) model sequence of super steps Twisted reactor based architectures MPI (pympi, Pypar, MPI for Python, pypvm) Pyro (distributed object system) Linda (PyLinda) Scientific Python (master/slave computing model) data distribution through call parameters/replication 24

Lektura uzupełniająca Norman Matloff, Programming on Parallel Machines, http://heather.cs.ucdavis.edu/ matloff/parprocbook.pdf Maurice Herlihy, Nir Shavit, The Art of Multiprocessor Programming, Morgan Kaufmann,2008 Rohit Chandra, Ramesh Menon, Leo Dagum, David Kohr, Dror Maydan, Jeff McDonald, Parallel Programming in OpenMP, Morgan Kaufmann, 2000 Barbara Chapman, Gabriele Jost, Ruud van der Pas, Using OpenMP: Portable Shared Memory Parallel Programming, MIT Press, 2007 25

PYTHON + FORTRAN 26

f2py f2py pozwala na automatyczne tworzenie modułów rozszerzeń PYTHON z kodu Fortran 77/90/95: F2py automatycznie generuje funkcje obudowujące (wrappers) dla Pythona z kodu Fortran 77/90/95 Alternatywnie można określić sposób obudowywania procedur w pliku definicji interfejsu. Przykładowa procedura dodająca dwa wektory A i B (pamięć dla wszystkich tablic zapewniona przez procedurę wywołującą): C *** Plik add.f *** SUBROUTINE ZADD(A,B,C,N) C DOUBLE COMPLEX A(*) DOUBLE COMPLEX B(*) DOUBLE COMPLEX C(*) INTEGER N DO 20 J = 1, N C(J) = A(J)+B(J) 20 CONTINUE END Wywołanie f2py: > f2py -m add add.f Co powinno wygenerować moduł o nazwie: addmodule.c, który można następnie skompilować jak każdy inny moduł C do Pythona. 27

Co potrafi f2py Tworzy pliki sygnatur dla kodu/funkcji Fortran (pliki.pyf); sygnatury zawierają wszystkie informacje o funkcji (nazwa, argumenty i ich typy), które są konieczne do utworzenia funkcji opakowującej (wrapper) w C Pliku sygnatur można utworzyć ręcznie lub może być zmodyfikowany po wygenerowaniu Sygnatury mogą być modyfikowane w celu zmiany sposobu przetwarzania argumentów przekazywanych Python->C->Fortran: F2PY śledzi zależności pomiędzy argumentami (sprawa kolejności inicjalizacji) Argumenty mogą być opcjonalne lub niewidoczne, co ułatwia wołanie funkcji z Pythona Generalnie można dowolnie zmienić sygnaturę funkcji Fortran (np. zmiana argumentów ich kolejności, typów). Argumenty będą przetworzone zanim trafią do rzeczywistej funkcji Fortran F2PY automatycznie generuje dokumentację doc (opcjonalnie też LaTeX) dla tworzonych rozszerzeń 28

F2py kompilacja modułu f2py potrafi także kompilować moduł Fortran i moduł rozszerzeń: > f2py -c -m add add.f Skomplilowany moduł jest już dostępny Python: >>> import add >>> print add.zadd. doc zadd - Function signature: zadd(a,b,c,n) Required arguments: a : input rank-1 array( D ) with bounds (*) b : input rank-1 array( D ) with bounds (*) c : input rank-1 array( D ) with bounds (*) n : input int Patrz dokumentacja: NumPy User Guide 29

f2py używany z Pythona f2py jest napisany w Python i może być z niego bezpośrednio używany: Przykład otwórz, skompiluj i użyj : import numpy.f2py as f2py fid = open( add.f ) source = fid.read() fid.close() f2py.compile(source, modulename= add ) import add # use it!!! 30

Materiały dodatkowe F2py example http://websrv.cs.umt.edu/isis/index.php/f2py_example Wrapping Fortran libraries http://www.eurotcl.org/2010/download/eurotcl2010-article- Wrapping_fortran_ArjenMarkus.pdf Interfacing Python with Fortran www-uxsup.csx.cam.ac.uk/courses/pythonfortran/f2py1.pdf www-uxsup.csx.cam.ac.uk/courses/pythonfortran/f2py2.pdf Wrapping Fortran Code for Python with F2PY mentat.za.net/ctpug-numpy/nmarais-f2pytalk.pdf 31