Biblioteka PCJ do naukowych obliczeń równoległych

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

Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1

Programowanie Równoległe Wykład 4. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie współbieżne... (4) Andrzej Baran 2010/11

Wprowadzenie do OpenMP

Opracowanie nowych metod programowania równoległego w Javie w oparciu o paradygmat PGAS (Partitioned Global Address Space)

HPC na biurku. Wojciech De bski

Operacje grupowego przesyłania komunikatów. Krzysztof Banaś Obliczenia równoległe 1

Nowoczesne technologie przetwarzania informacji

Programowanie obiektowe

2 WRZEŚNIA S t r o n a WROCŁAW

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Operacje grupowego przesyłania komunikatów

WIELOWĄTKOWOŚĆ. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

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

Programowanie współbieżne i rozproszone

Algorytmy i Struktury Danych

Architektura rozproszonych magazynów danych

Komputerowe Obliczenia Równoległe: Wstęp do OpenMP i MPI

Architektury systemów równoległych

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Przetwarzanie Równoległe i Rozproszone

PRZEWODNIK PO PRZEDMIOCIE

Rozproszone systemy internetowe. Wprowadzenie. Koncepcja zdalnego wywołania procedury

Wprowadzenie do zrównoleglania aplikacji z wykorzystaniem standardu OpenMP

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface (część 3) Maciej Matyka Instytut Fizyki Teoretycznej

Równoległość i współbieżność

Równoległość i współbieżność

Programowanie systemów z pamięcią wspólną specyfikacja OpenMP. Krzysztof Banaś Obliczenia równoległe 1

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Java. Programowanie Obiektowe Mateusz Cicheński

Programowanie współbieżne Wstęp do OpenMP. Rafał Skinderowicz

Message Passing Interface

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

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

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

OpenMP. Programowanie aplikacji równoległych i rozproszonych. Wykład 2. Model programowania. Standard OpenMP. Dr inż. Tomasz Olas

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Programowanie w Javie Lista nr 1. Wybieramy kategorię Java, a wśród Projektów Java Application i [NEXT]

Java Platform Micro Edition

Sosnowiec, dn... Imię i nazwisko...

O superkomputerach. Marek Grabowski

Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

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

Modele programowania równoległego. Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak dla PR PP

Java: interfejsy i klasy wewnętrzne

Tworzenie aplikacji w języku Java

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

Wywoływanie metod zdalnych

Java JMX. Marcin Werla. Monitorowanie i zarządzanie usługami sieciowymi w Javie. mwerla@man.poznan.pl PCSS/Poznań JUG

Jak wygląda praca na klastrze

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

Modele programowania równoległego. Programowanie z przekazywaniem komunikatów Message-Passing Programming Rafał Walkowiak

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

Metody Metody, parametry, zwracanie wartości

Wykład 7: Pakiety i Interfejsy

Wprowadzenie. Narzędzia i środowiska programistyczne. Laboratorium 1. Prowadzący: Kierunek: Semestr: Rok: Tomasz Gądek Informatyka Zimowy 2

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Miary Wydajności. Efektywność programu równoległego (E) jest definiowana jako stosunek przyśpieszenia do liczby procesorów

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Git, Bitbucket, IntelliJ IDEA

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Programowanie obiektowe

Weryfikacja oprogramowania, korzystajacego z MPI

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Programowanie obiektowe

Wywoływanie metod zdalnych

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

Programowanie poprzez testy z wykorzystaniem JUnit

Wprowadzenie. Co to jest klaster? Podział ze względu na przeznaczenie. Architektury klastrów. Cechy dobrego klastra.

Systemy Rozproszone - Ćwiczenie 6

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Programowanie obiektowe

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

Programowanie w JAVA Lab. 5 - Wątki. 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 7 x ) xy, 8,8

Platformy Programistyczne Podstawy języka Java

Wstęp do JUNG. Omówione elementy wykorzystane w Edge Color Project

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe

public enum Environment { Development("Deweloperskie"), Test("Testowe"), Production("Produkcyjne"); private String name;

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

Języki i metody programowania Java Lab2 podejście obiektowe

Dokumentacja do API Javy.

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1

Moc płynąca z kart graficznych

Programowanie w standardzie MPI

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

Aplikacje RMI

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Biblioteka PCJ w wybranych zastosowaniach matematycznych - FFT i grafy Kroneckera

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

Języki i metody programowania Java. Wykład 2 (część 2)

Programowanie obiektowe

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Transkrypt:

Biblioteka PCJ do naukowych obliczeń równoległych Zakład Obliczeń Równoległych i Rozproszonych Wydział Matematyki i Informatyki Uniwersytet Mikołaja Kopernika Chopina 12/18, 87-100 Toruń faramir@mat.umk.pl 29 kwietnia 2015 12. spotkanie Toruń JUG

Plan prezentacji 1 Programowanie równoległe MPI OpenMP PGAS Java 2 Przybliżanie wartości liczby π 3

MPI Programowanie równoległe MPI OpenMP PGAS Java MPI Message-Passing Interface Historia: MPI-1.0 (1992), MPI-2.0 (1997), MPI-3.0 (2012) C, C++, Fortran, Java (wrappers, JNI), Python,... zwykle dwa procesy nadawca i odbiorca wiele parametrów MPI_Comm_rank ( MPI_Comm comm, int * rank ) MPI_Comm_size ( MPI_Comm comm, int * nrank ) MPI_Barrier ( MPI_Comm comm ) MPI_Send ( void * buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ) MPI_Recv ( void * buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status * status )

OpenMP Programowanie równoległe MPI OpenMP PGAS Java OpenMP Open Multi-Processing Historia: 1.0 (1997), 2.5 (2005), 4.0 (2013) rozszerzenia do: C, C++, Fortran wykorzystywanie dyrektyw kompilatora #pragma omp <directive> [clause] int omp_get_num_threads (); int omp_get_thread_num (); # pragma omp parallel for private ( i) \ shared (a, b, c) \ reduction (+: sum ) # pragma omp critical # pragma omp single nowait # pragma omp master # pragma omp barrier

PGAS Programowanie równoległe MPI OpenMP PGAS Java PGAS Partitioned Global Address Space (Podzielona globalna przestrzeń adresowa) Założenia: rozróżnialne dane lokalne i zdalne globalna przestrzeń adresowa dostępna z wszystkich węzłów ukrywanie komunikacji przed użytkownikiem komunikacja jednostronna http://www.pgas.org

PGAS Programowanie równoległe MPI OpenMP PGAS Java

Java Programowanie równoległe na jednym węźle MPI OpenMP PGAS Java volatile, synchronized java.lang.thread, java.lang.runnable java.util.concurrent.* (concurrent Collections, Executors, ThreadPool*, ForkJoin*,... ) java.util.concurrent.atomic.* (AtomicCounter, AtomicInteger, AtomicReference,... ) java.util.concurrent.locks.* Collection.parallelStream()...

MPI OpenMP PGAS Java Java Programowanie równoległe i rozproszone na wielu węzłach djvm, JESSICA2, Terracotta RMI ProActive, Akka,... CORBA, SOAP,... MPJ

Java PCJ Parallel Computations in Java MPI OpenMP PGAS Java Paradygmat programowania: PGAS Podstawowe funkcje: synchronizowanie wątków pobieranie wartości zmiennych wysyłanie wartości Zaawansowane funkcje: rozgłaszanie wartości monitorowanie zmiennych tworzenie grup wątków...

Java PCJ Parallel Computations in Java MPI OpenMP PGAS Java Nie wymaga modyfikacji JVM Działa na systemach operacyjnych zawierających JVM (np. IBM Java 1.7 na klastrach o architekturze Power7, systemy AIX) Wykorzystuje funkcje wprowadzone w standardzie Java SE 7 (NIO, SDP,... ) Działa z wykorzystaniem Java SE 8 (prace nad wykorzystaniem wyrażeń lambda) Nie wymaga dodatkowych bibliotek (brak problemu z zależnościami) Dostępna na stronie: http://pcj.icm.edu.pl

Java PCJ Prosta aplikacja Programowanie równoległe MPI OpenMP PGAS Java 1 import org. pcj.*; 2 public class MyApp extends Storage implements StartPoint { 3 @Shared (" array ") 4 double [] tablica ; 5 6 @Override 7 public void main () { 8 PCJ. log (" Hello from " + PCJ. myid () 9 + " of " + PCJ. threadcount ()); 10 } 11 public static void main ( String [] args ) { 12 String [] nodes = new String []{ " host0 ", " host0 ", 13 " host1 ", " host1 ", " host2 ", " host2 " 14 }; 15 PCJ. deploy ( MyApp. class, // StartPoint 16 MyApp. class, // Storage 17 nodes ); 18 } 19 }

Metoda Monte Carlo Rzucamy punkty na kwadrat i zliczamy liczbę punktów w kole wpisanym w kwadrat. π 4 incirclepoints totalpoints

(cont.) Metoda Monte Carlo 1 Random random = new Random (); 2 long nall = 1 _280_000_000 ; 3 long n = nall / PCJ. threadcount (); 4 5 long mycirclecount = 0; 6 7 for ( long i = 0; i < n; ++i) { 8 double x = 2.0 * random. nextdouble () - 1.0; 9 double y = 2.0 * random. nextdouble () - 1.0; 10 if (( x * x + y * y) <= 1.0) { 11 mycirclecount ++; 12 } 13 } 14 PCJ. putlocal (" count ", mycirclecount ); 15 PCJ. barrier (); 16

(cont.) Metoda Monte Carlo 17 /* reduce -- get calculated data */ 18 if ( PCJ. myid () == 0) { 19 FutureObject cl [] = 20 new FutureObject [ PCJ. threadcount () ]; 21 for ( int p = 0; p < PCJ. threadcount (); p ++) { 22 cl[p] = PCJ. getfutureobject (p, " count "); 23 } 24 long globalcirclecount = 0; 25 for ( FutureObject fo : cl) { 26 globalcirclecount = globalcirclecount 27 + ( long ) fo.get (); 28 } 29 return 4.0 * ( double ) globalcirclecount 30 / ( double ) (n * PCJ. threadcount ()); 31 } 32 33 return Double. NaN ;

Metoda Monte Carlo halo2 (ICM): 1 280 000 000 punktów

Metoda Monte Carlo hydra (1 węzeł, PL-GRID, ICM): 200 000 puntków

Metoda prostokątów za pomocą metody prostokątów, czyli przybliżenie wartość poniższej całki: π = 1 0 4 N 1 + x 2 dx i=1 4 ( i 1 2 1 + N ) 2

(cont.) Metoda prostokątów 1 private double f( double x) { 2 return (4.0 / (1.0 + x * x)); 3 } 4 5 private double calculateintegralpi () { 6 long n = 10 _000 ; 7 double w = 1.0 / ( double ) n; 8 9 double mysum = 0.0; 10 for ( int i = PCJ. myid () + 1; i <= n; 11 i += PCJ. threadcount ()) { 12 mysum = mysum + f ((( double ) i - 0.5) * w); 13 } 14 mysum = mysum * w; 15 16 PCJ. putlocal (" sum ", mysum ); 17 PCJ. barrier (); 18

(cont.) Metoda prostokątów 19 /* reduce -- get calculated data */ 20 double gsum = 0.0; 21 if ( PCJ. myid () == 0) { 22 FutureObject [] sl = 23 new FutureObject [ PCJ. threadcount () ]; 24 for ( int i = 0; i < PCJ. threadcount (); ++i) { 25 sl[i] = PCJ. getfutureobject (i, " sum "); 26 } 27 for ( FutureObject fo : sl) { 28 gsum = gsum + ( double ) fo. get (); 29 } 30 } 31 32 return gsum ; 33 }

Metoda prostokątów halo2: 1 280 000 000 prostokątów

Metoda Monte Carlo hydra (1 węzeł, PL-GRID, ICM): 10 000 000 prostokątów

Programowanie równoległe część zbioru testów: Java Grande Forum Benchmark renderowanie sceny 3D używając mechanizmu ray tracing scena zawiera 64 kule (krata: 4 4 4) i 5 źródeł światła generowany jest kwadratowy obraz rozmiaru NxN pikseli

Przyspieszenie (obraz rozmiaru 2500 2500 pikseli)

Wydajność (obraz rozmiaru 2500 2500 pikseli)

Programowanie równoległe for-each (Java 5 style): 1 long sum = 0; 2 for ( User user : users ) { 3 sum += user. getage (); 4 } 5 double average = ( double ) sum / users. size (); map.reduce.get (Java 8 style): 1 long sum = users. parallelstream () 2. map (u -> ( long ) u. getage ()) 3. reduce ( Long :: sum ) 4. get (); 5 double average = ( double ) sum / users. size ();

Programowanie równoległe fork/join (Java 7 style): 1 class Fork extends RecursiveTask <Long > { 2 final private static int threshold = 16 _384 ; 3 final private List <User > list ; 4 protected Fork (List <User > list ) { this. list = list ; } 5 6 @Override 7 protected Long compute () { 8 int length = list. size (); 9 if ( length < threshold ) { 10 long sum = 0; for (User u : list ) { sum += u. getage (); } return sum ; 11 } 12 13 int split = length / 2; 14 Fork left = new Fork (list. sublist (0, split )); 15 Fork right = new Fork (list. sublist (split, length )); 16 17 invokeall (left, right ); 18 return left. getrawresult () + right. getrawresult (); 19 } 20 } 21... Fork fmr = new Fork ( users ); 22 23 ForkJoinPool. commonpool (). invoke (fmr ); 24 long result = fmr. getrawresult (); 25 double average = ( double ) result / users.size ();

PCJ style Programowanie równoległe 1 @Shared long sum ; 2 @Shared int userscount ; 3... 4 myusers = loadusers ( PCJ. myid ()); 5 // kazdy styl dla Java... 6 long s = 0; 7 for ( User u : myusers ) { 8 s += u. getage (); 10 9 } 11 PCJ. putlocal (" sum ", s); 12 PCJ. putlocal (" userscount ", myusers. size ()); 13 PCJ. barrier (); 14 15 s = pcj_reduce (" sum "); 16 int count = pcj_reduce (" userscount "); 17 if ( PCJ. myid () == 0) { 18 double average = ( double ) s / count ; 19 }

Time: 12 000 000 users

Acceleration: 12 000 000 users

biblioteka ma potencjał, by być wykorzystywana w naukowych obliczeniach równoległych dobre rezultaty i bardzo dobra skalowalność uzyskiwane są szczególnie dla dużych danych, co otwiera możliwość wykorzystania biblioteki w analizie tzw. Dużych Danych. rozwiązania oparte o język Java mogą być tak samo szybkie, a nawet szybsze, od rozwiązań bazujących na językach niższego poziomu jak C czy C++

Biblioteka PCJ zdobyła nagrodę 1 : HPC Challenge Class 2 Best Productivity Award na międzynarodowej konferencji: SC14 the International Conference for High Performance Computing, Networking, Storage and Analysis za zaprezentowanie bardzo efektywnego sposobu programowania aplikacji równoległych. 1 Nagroda przyznana na podstawie decyzji ekspertów oceniających implementację podzbioru testów HPC Challenge z wykorzystaniem PCJ

Plany na przyszłość Aplikacje Programowanie równoległe Przeportowanie aplikacji SinusMed na PCJ Zmierzenie się z pozostałymi testami na HPC Challenge Zbudowanie biblioteki opartej o PCJ do operowania na grafach Analiza danych genetycznych Zrównoleglanie algorytmów genetycznych w PCJ Analiza dużych danych BigData

HPDCJ Project (CHIST-ERA) Heterogenous parallel and distributed computing with Java Partners ICM University of Warsaw (Warsaw, Poland) IBM Research Lab (Zurich, Switzerland) Queen s University of Belfast (Belfast, UK) Bilkent Üniversitesi (Ankara, Turkey) Focus ease of use and programmability of Java for distributed heterogeneous computing heterogeneous systems including GPU and mobile devices dependability and resilience by adding fault tolerance mechanisms key applications including data-intensive Big Data applications 1 st October 2014 31 st September 2017

Dziękuję za uwagę http://pcj.icm.edu.pl e-mail: faramir@mat.umk.pl