Uruchamianie i optymalizacja kodów na architekturze Blue Gene/P Szkolenie 15 czerwca 2011, ICM Arkadiusz Niegowski, Maciej Cytowski
Agenda O projekcie POWIEW Architektura systemu Notos Środowisko użytkownika systemu Notos Sesja hands-on: uruchamianie aplikacji Kompilatory, biblioteki i optymalizacja oprogramowania Sesja hands-on: kompilacja i optymalizacja Badanie wydajności i debugowanie Sesja hands-on: badanie wydajności i debugowanie Podsumowanie 2
Środowisko szkoleniowe Konta: kdmszk01,, kdmszk10 (lub własny login) Hasła: przekazane osobiście Komputer obliczeniowy: notos Sposób logowania: Logowanie na komputerach w laboratorium. ssh delta ssh notos Materiały szkoleniowe: Slajdy Programy: /opt/examples/bgp_user_training/hands-on 3
Program Obliczeń Wielkich Wyzwań Nauki i Techniki http://wielkiewyzwania.pl Tworzymy i udostępniamy naukowcom nowoczesne środowisko obliczeniowe, które pozwoli na podejmowanie wielkich wyzwań nauki i techniki, o skali dotychczas dostępnej w nielicznych ośrodkach światowych. Projekt realizowany jest przez konsorcjum stworzone przez Interdyscyplinarne Centrum Modelowania Matematycznego i Komputerowego UW, Akademickie Centrum Komputerowe CYFRONET AGH oraz Poznańskie Centrum Superkomputerowo-Sieciowe IChB PAN. 4
Program Obliczeń Wielkich Wyzwań Nauki i Techniki http://wielkiewyzwania.pl Wielkoskalowe projekty obliczeniowe Numeryczne prognozowanie pogody Modelowanie materiałowe Modelowanie i wizualizacja struktur RNA Symulacje neuroinformatyczne Modelowanie struktury Wszechświata Modelowanie układów molekularnych Symulacje złóż naturalnych Astrofizyka i radioastronomia Analiza wizualna Superkomputery Systemy obliczeń masywnie równoległych (MPP) IBM Blue Gene/P Systemy zrównoleglonych obliczeń gruboziarnistych (Fat-Node) IBM POWER7, bullx Systemy przetwarzania symetrycznego (SMP) HP Blade Center Versatile SMP Systemy hybrydowych obliczeń akcelerowanych (GPGPU) HP SL390s nvidia Fermi 5
Program Obliczeń Wielkich Wyzwań Nauki i Techniki http://wielkiewyzwania.pl Nowe modele obliczeniowe Nowe algorytmy oraz metody obliczeniowe dla architektur komputerowych przyszłych generacji. Kompetencje Grupy badawcze złożone z programistów wielkoskalowych systemów obliczeniowych oraz naukowców realizujących nowatorskie programy badań. Szkolenia Techniki programowania, obsługa aplikacji oraz narzędzi niezbędnych przy wysokowydajnych obliczeniach na systemach wyposażonych w tysiące jednostek obliczeniowych. 6
Inwestycje projektu POWIEW w ICM Faza 1 1 rack systemu IBM BG/P ~14 Tflop/s, ~4 TB RAM Storage 178 TB (netto) Maszyny wspomagające Instalacja: grudzień 2010 Faza 2 1 rack systemu POWER7 IH ~78 Tflop/s, ~10.2 TB RAM Storage 153 TB (netto) Instalacja: jesień 2011 7
Agenda O projekcie POWIEW Architektura systemu Notos Środowisko użytkownika systemu Notos Sesja hands-on: uruchamianie aplikacji Kompilatory, biblioteki i optymalizacja oprogramowania Sesja hands-on: kompilacja i optymalizacja Badanie wydajności i debugowanie Sesja hands-on: badanie wydajności i debugowanie Podsumowanie 8
Big picture - Notos Elementy instalacji: rack obliczeniowy Blue Gene/P Serwer dostępowy BG FEN Serwer serwisowy BG SN Zasoby dyskowe: macierz: DS5300 + EXP5060 serwery dostępowe: NSD Switch 9
Część obliczeniowa Blue Gene/P 10
Rodzaje węzłów Front-end node przeznaczony dla użytkowników systemu; kompilacji kodu, degugowania, umieszczania/usuwania/sprawdzania stanu zadań w kolejce, Service node - mózg systemu ; monitoruje stan racka obliczeniowego i steruje nim; przydziela partycje, kontroluje wysyłanie zadań do obliczeń; dostarcza obraz systemu operacyjnego dla węzłów obliczeniowych 2 x IBM Power 520 4 x 4,7 GHz POWER6 32 GB RAM 11
Rodzaje węzłów I/O node pośredniczy w komunikacji węzłów obliczenioych z resztą systemu; obsługuje operacje na plikach i gniazdach, kontroluje sygnały oraz tworzenie procesów. Działa na pełnoprawnym jądrze Linuksa, ale z mocno okrojoną ilością usług. Compute Node wykonywany jest tylko kod użytkownika; wszelkie zapotrzebowania na usługi przekierowywane są do węzła I/O. Działa na lekkim jądrze CNK (Compute Node Kernel) - mocno okrojone, nie jest to Linux I/O & Compute Node 1 x 850 MHz PowerPC 450 4 GB RAM 1024 x Compute Node 32 x I/O node 12
Organizacja węzłów Front-end node Service node I/O node Compute node IO / CN ratio 1:32 FN SN IO IO CN CN CN CN CN CN CN CN CN CN CN CN CN CN CN CN 13
PowerPC 450 Processor i BG/P ASIC BG/P ASIC (Application Specific Integrated Circuit) Zintegrowany układ scalony, łączący jednostki funkcjonalne węzła: 4 rdzenie PowerPC 450 (PPC450) 2 jednostki zmiennoprzecinkowe (FPU) na rdzeń Pamięć cache L2, 2KB na rdzeń Pamięć chace L3, 8MB współdzielone przez rdzenie Kontroler pamięci DDR2 Sieci komunikacji: Torus + jednostka DMA (Direct Memory Access) Collective Global Barrier Ethernet JTAG (Joint Test Action Group) 14
PowerPC 450 Processor i BG/P ASIC PowerPC 450 CPU Architektura 32bit ppc Taktowanie 850 MHz Pojedyncza jednostka do obliczeń na liczbach całkowitych IPU Pamięć cache L1: 32KB na instrukcje 32KB na dane 15
PowerPC 450 Processor i BG/P ASIC Jednostka zmiennoprzecinkowa (FPU) - "Double Hummer" Dwie grupy rejestrów: 32 rejestry 64 bitowe w FPU0 (primary registers) 32 rejestry 64 bitowe w FPU1 (secondary registers) Standardowe instrukcje PowerPC wykonywane sa tylko na FPU0 Równoległe instrukcje SIMD dla liczb w podwójnej precyzji (64 bit) wykorzystuja obie grupy rejestrów Dwupotokowa (dual-pipeline); pozwala na jendoczesne wykonanie dwóch instrukcji fused multiply-add w jednym cyklu zegara (2 x 2 FLOPs). Zestaw instrukcji dla operacji na liczbach zespolonych (4 FLOPs w 1 cyklu / rdzeń) * 4 rdzenie) * 850MHz) = 13.6 Gflops 16
Compute & I/O node - podsumowanie Cores per node 4 Core Clock Speed Cache Coherency Private L1 cache Private L2 cache Shared L3 cache Memory per node Memory bandwidth Peak Performance 850 Mhz SMP hardware 32 KB data; 32 KB instruction 2 KB; 14 stream prefetching 8 MB 4 GB 13.6 GB/s (2x16 bytes wide) 13.6 GFlops per node 17
Sieć komunikacji BG/P 3D Torus Collective Barrier/Interrupt 10Gb Ethernet 1Gb Ethernet (JTAG) 18
Sieć komunikacji BG/P 3D Torus Łączy wszystkie węzły obliczeniowy; każdy z nich ma 6 połączeń z najbliższymi sąsiadami Szkielet dla komunikacji MPI point-to-point Korzysta z mechanizmu DMA (Direct Memory Access), co zmniejsza zaangażowanie rdzeni w proces wysyłania I odbierania pakietów z danymi Opóźnienie sprzętowe: ~64-100ns (najbliższy wezeł), 3us (przy 64 przeskokach) Opóznienie (MPI): 3 us (najbliższy sąsiad), 10 us (przy 64 przeskokach) Przepustowość: 5.1 GB/s na węzeł (3.4 Gb/s bidirectional * 6 links/node) 19
Sieć komunikacji BG/P Collective Łączy wszystkie węzły obliczeniowe i węzły Wejścia/Wyjścia Każdy węzeł ma 3 połączenia z innymi węzłami Dedykowana operacjom One-to-all and all-to-all MPI broadcasts oraz MPI Reduction Przekazywanie żądań I/O z wezłów obliczeniowych do wezłów Wejścia/Wyjścia Opóznienie sprzętowe: 2,5 us (do najdalszego i spowrotem) Opóźnienie (MPI): 3-4 us pokonanie drzewa w jednym kierunku (przy 512 wezłach) Przepustowość: 5.1 GB/s na węzeł (6.8 Gb/s bidirectional * 3 links/node) 20
Sieć komunikacji BG/P Barrier/Interrupt Łączy wszystkie węzły obliczeniowe Wraz ze wzrostem liczby węzłów obliczeniowych znacząco rośnie koszt barier I przerwań programowych (MPI), stąd dedykowana sieć dla tych operacji Opóźnienie (MPI) 1.25us (przy 512 węzłach) 1.6us (przy 72K węzłów), poza siecia ok. 10x wolniej (juz przy 512 wezłach) Każdy węzeł ma 4 połączenia do innych węzłów Przepustowość 3.4 GB/s na węzeł (3.4 Gb/s bidirectional * 4 links/node) 21
Sieć komunikacji BG/P 10Gb Ethernet Łączy węzły Wejścia/Wyjścia z zewnętrznym switchem Dostarcza systemy plików Węzły obliczeniowe nie są z nią bezpośrednio połączone 22
Sieć komunikacji BG/P 1Gb Ethernet (JTAG = Joint Test Action Group) JTAG (IEEE 1149.1) to protokół do kontroli, monitorowania I diagnozowania problemów ze sprzętem Bezośredenie połączenie węzła serwisowego ze wszystkimi węzłami w racku BG/P Startowanie I zatrzymywanie węzłów 23
Systemy operacyjne Węzeł Front-end: SUSE Linux Enterprise Server 10.2 ppc64 Węzły I/O: Linux Węzły: CNK (Compute Node Kernel) 24
Systemy operacyjne w środowisku Notos System operacyjny na węźle I/O: Pełne jądro Linuksa Architektura ppc 32 bit Standardowe narzędzia powłoki dla użytkownika dostarczane przez pakiet BusyBox Najważnijeszy demon CIOD (Compute I/O Daemon) Obsługa sterowników urządzeń 25
Systemy operacyjne w środowisku Notos System operacyjny na węźle obliczeniowym: lekkie jądro oparte na Linuksie Architektura ppc 32 bit Open-source Obsługa MPI, OpenMP, Pthreads Operacje I/O przekazywane do demona CIOD na węźle I/O Ograniczona liczba wywołań systemowych (brakuje np. fork(), execve(), system()) 26
Tryby wykonywania zadań Blue Gene/P zaprojektowany do uruchamiania kodów MPI. Tryb SMP Tryb Virtual Node (VN) Tryb Dual 27
Tryby wykonywania zadań Tryb SMP (domyślny) 1 zadanie MPI na węzeł Do 4 wątków Pthreads/OpenMP na węzeł Dostępna cała pamięć Uruchmiony jeden obraz jadra; wszystkie zasoby pod jego kontrolą. 28
Tryby wykonywania zadań Tryb Virtual Node (VN) 4 zadania MPI na węzeł Nie ma wątków Każdy proces pracuje pod kontrolą osobnego obrazu jądra Każdy proces dostaje ¼ pamięci operacyjnej, oraz ¼ przepustowości sieci Pamięć L3 podzielona na dwie częsci; każda przypada na dwa rdzenie Przepustowość do pamięci operacyjnej podzielona na dwie części Dostęp do wspólnej pamięci 29
Tryby wykonywania zadań Tryb Dual Tryb mieszany; połączenie trybu SMP I VN 2 zadania MPI na węzeł Do 2 wątków na proces Każdy proces pracuje pod kontrolą osobnego obrazu jądra Każdy proces dostaje ½ pamięci operacyjnej, oraz ½ przepustowości sieci Dostęp do wspólnej pamięci 30
Bloki/partycje Notos I/O : CN ratio = 1:32 Możliwe rozmiary partycji: 32, 64, 128, 256, 512, 1024 węzły. Możliwe rozmiary partycji dla sieci 3D Torus: 512, 1024 węzły. Tworzenie partycji: 1. Na podstawie informacji od użytkownika, tuż przed rozpoczęciem wykonywania zadania, system kolejkowy poprzez węzeł serwisowy rezerwuje wymaganą ilość węzłów. 2. Reset wybranych węzłów poprzez protokoł JTAG. 3. Ładowanie obrazów systemu zgodnie z wybranym trybem, montowanie zdalnych zasobów na węźlach I/O. 4. Uruchomienie zadania Czas trwania kroków od 1 do 3 to ~ 30-60 sekund 31
Nazwy części obliczeniowych maszyny R00 rack nr 00 R00-M0 midplane nr 0 racka nr 00 R00-M1 midplane nr 1 racka nr 00 R00-M0-N00 node card nr 00 midplane-u 0 racka 00 R00-M0-N01-J00 I/O node z node card nr 01 midplane-u 0 racka 00 R00-M0-N01-J04 pierwszy compute node z node card nr 01 midplane-u 0 racka 00 32
Zasoby dyskowe Kontroler IBM System Storage DS5300 do 700,000 IOPs do 6,4 GB/s 4 x półka z dyskami IBM System Storage EXP5060 60 dysków 1 TB SATA / półkę 4 x Serwer NSD IBM Power 710 4 x 3,0 GHz POWER7 16 GB RAM System plików GPFS Pojemność brutto/netto: 240 TB / 178 TB 33
Agenda O projekcie POWIEW Architektura systemu Notos Środowisko użytkownika systemu Notos Sesja hands-on: uruchamianie aplikacji Kompilatory, biblioteki i optymalizacja oprogramowania Sesja hands-on: kompilacja i optymalizacja Badanie wydajności i debugowanie Sesja hands-on: badanie wydajności i debugowanie Podsumowanie 34
Dostęp, logowanie wszystkie osoby posiadające konto w ICM mają dostęp do węzła dostępowego (FEN) komputera notos (ssh notos) kompilacja kodów i uruchamianie możliwe tylko i wyłącznie po wysłaniu wiadomości email: powiew-admins@icm.edu.pl obliczenia na dużych partycjach komputera notos możliwe dopiero po przetestowaniu i wykazaniu odpowiedniej skalowalności oprogramowania 35
Środowisko obliczeniowe NEURON v7.1 (/opt/neuron) NEST (/opt/nest) NAMD v2.7b1 (/opt/namd) PALABOS v0.7 (/opt/palabos) CPMD v3.13.2 (/opt/cpmd) GADGET v3 (/opt/gadget) AMBER11 (/opt/amber) CP2K (/opt/cp2k) LAMMPS (/opt/lammps) NWCHEM w trakcie kompilacji 36
Środowisko obliczeniowe Komputer Notos przeznaczony jest dla aplikacji o wysokiej skalowalności Porównanie wydajności pojedynczego węzła czy procesora do innych popularnych architektur na niekorzyść IBM Blue Gene/P (~4-5x wolniej w porównaniu core per core) Przykład: pakiet NAMD Test: benchmark NAMD używany w projekcie PRACE Wyniki: średni czas kroku obliczeniowego Notos nodes 32 64 128 256 512 1024 Time 0,680 0,338 0,171 0,090 0,050 0,027 Halo2 nodes 2 4 8 16 32 64 Time 0,867 0,431 0,353 - - - 37
Inne aplikacje Dostęp do pełnych zasobów Notos-a można uzyskać po wykazaniu odpowiedniej skalowalności używanej aplikacji. Jak dowiedzieć się czy aplikacja się skaluje? powiew@icm.edu.pl 38
Uruchamianie zadań IBM LoadLeveler Zasoby obliczeniowe komputera Notos zarządzane są przez system kolejkowy IBM LoadLeveler Zadania wstawiamy do kolejki z katalogu domowego, tam trzymamy również input i output obliczeń LoadLeveler Uruchom zadanie Blue Gene mpirun Wstaw zadanie do kolejki Znajdź zasoby dla zadań i zdefiniuj partycje obliczeniowe Pobierz informację o zasobach i zadaniach Zadania Blue Gene Bridge API 39
Uruchamianie zadań IBM LoadLeveler Podstawowe komendy: Komenda llsubmit llq llq s <job_id> llcancel <job_id> llclass Krótki opis Wstawia do kolejki zadanie LoadLeveler. Pokazuje zadania w kolejce (te uruchomione i te czekające na zasoby) wraz z dodatkową informacją. Pokazuje więcej informacji o zadaniu, np. dlaczego wciąż stoi w kolejce, ile dokładnie zasobów zadeklarowaliśmy,.. Usuwa zadanie z kolejki. Pokazuje informację o aktualnie zdefiniowanych klasach. Wstawianie zadania do kolejki: llsubmit <jobfile name> 40
Przykładowe wywołanie: llq sheed@notos:~> llq Step Id Owner Account Job Name Class Size ST ------------------------ ----------- -------- -------------------- ---------- ------ -- notos.1904.0 panecka G31-4 R53A_v3_b_P kdm-large I notos.1903.0 panecka G31-4 R53A_3_b_nP kdm-large I notos.1902.0 panecka G31-4 f_3_b_p kdm-large I notos.1901.0 panecka G31-4 K42A_3_b_nP kdm-large I notos.1900.0 panecka G31-4 full_v3_b_np kdm-large I notos.1899.0 panecka icm-staf f_v3_99_np kdm-large I notos.1898.0 panecka G31-4 K42A_v3_b_P kdm-large I notos.1897.0 panecka G31-4 K43Q_v3_b_P kdm-large I notos.1896.0 panecka G31-4 K43Q_3_b_nP kdm-large I notos.1890.0 memar icm-staf nwchem1 workshop 32 R notos.1863.0 fleon G31-4 namd_ab kdm-large 512 R 11 job step(s) in queue, 9 waiting, 0 pending, 2 running, 0 held, 0 preempted 41
Przykładowe wywołanie: llq -s sheed@notos:~> llq -s 1863 =============== Job Step notos.icm.edu.pl.1863.0 =============== Job Step Id: notos.icm.edu.pl.1863.0 Job Name: namd_ab Owner: fleon Queue Date: Fri 03 Jun 2011 11:05:13 AM CEST Status: Running Dispatch Time: Tue 07 Jun 2011 07:00:47 PM CEST Size Requested: 512 Size Allocated: 512 Partition Allocated: LL11060703200913 Base Partition List: R00-M0 IONodes Per BP: N00-J00,N01-J00,N02-J00,N03-J00,N04-J00,N05-J00,N06-J00,N07-J00,N08-J00,N09-J00,N10- J00,N11-J00,N12-J00,N13-J00,N14-J00,N15-J00 Notify User: fleon@icm.edu.pl LoadLeveler Group: G31-4 Class: kdm-large Wall Clk Hard Limit: 8+08:00:00 (720000 seconds) Wall Clk Soft Limit: 8+08:00:00 (720000 seconds) Account: G31-4 ==================== EVALUATIONS FOR JOB STEP notos.icm.edu.pl.1863.0 ==================== The status of job step is : Running Since job step status is not Idle, Not Queued, or Deferred, no attempt has been made to determine why this job step has not been started. 42
LoadLeveler budowa skryptu kolejkowego Plik tekstowy zawierający definicje parametrów LoadLeveler-a Linie definiujące parametry LL rozpoczynają się od #@ Reszta skryptu może zawierać dowolne komendy skryptowe (Uwaga: wykonywane na FEN) Komentarze rozpoczynają się od # Komenda uruchomienia obliczeń na Blue Gene/P (np. mpirun) 43
LoadLeveler budowa skryptu kolejkowego Pola wymagane: Opcja Znaczenie # @ job_type = bluegene Ustawia typ zadania. Powinno być zawsze ustawione na bluegene. # @ bg_size = N Liczba węzłów obliczeniowych Blue Gene/P do rezerwacji, rozmiar partycji. # @ account_no = nr grantu Numer grantu obliczeniowego użytkownika. Używane w celach sprawozdawczych. # @ wall_clock_limit = HH:MM:SS Maksymalna długość działania zadania od momentu jego uruchomienia. # @ class = klasa Wybranie klasy zadania. Dostępne klasy: llclass. Nie wszyscy użytkownicy mają dostęp do wszystkich klas. # @ output = plik Nazwa pliku, do którego trafi przekierowanie standardowego strumienia wyjścia. Domyślnie /dev/null. # @ error = plik Nazwa pliku, do którego trafi przekierowanie standardowego strumienia błędu. Domyślnie /dev/null. 44
LoadLeveler budowa skryptu kolejkowego Pola opcjonalne: Opcja # @ bg_connection = MESH/TORUS/PREFER_TORUS Znaczenie Określa sposób połączenia sieciowego pomiędzy węzłami. Domyślnie: MESH. # @ environment = env1; env2;.. Określa sposób kopiowania zmiennych środowiskowych użytkownika do środowiska obliczeniowego. Możliwe ustawienia: COPY_ALL - wszystkie zmienne ze środowiska będą kopiowane, $var - zmienna var ma być kopiowana do środowiska obliczeniowego,!var - zmienna var nie ma być kopiowana do środowiska obliczeniowego, var=value - zmienna var ma przyjąć wartość value w środowisku obliczeniowym. # @ job_name = nazwa zadania Ustawia nazwę zadania. Pod taką nazwą będzie widziane zadanie w systemie. # @ initialdir = dir Ścieżka roboczego katalogu obliczeń. 45
LoadLeveler budowa skryptu kolejkowego Pola opcjonalne: Opcja Znaczenie # @ notification = typ Definiuje, w jakich przypadkach wysyłany jest mail do właściciela zadania. Możliwe argumenty: error - gdy zadanie zakończyło się błędem, start - gdy zadanie zaczęło się liczyć, complete - gdy zadanie się zakończyło, always - we wszystkich powyższych przypadkach, never - nigdy. # @ notify_user = email Email użytkownika, do którego ewenetualne maile będą wysyłane. Format argumentu: user[@host][,user[@host],...]. # @ bg_shape = <X>x<Y>x<Z> Definiuje ilość podstawowych partycji (midplane) w trzech kierunkach X, Y oraz Z. # @ bg_rotate = <true false> Określna, czy scheduler LoadLeveler-a powinien rozpatrywać wszystkie możliwe obroty zadanego kształtu. Domyślnie true. 46
LoadLeveler zmienne skryptów kolejkowych Wewnątrz skryptów kolejkowych używać można następujących zmiennych: Zmienna $(home) $(host) $(jobid) $(stepid) $(user) $(executable) $(class) $(comment) $(job_name) $(step_name) Znaczenie Katalog domowy użytkownika, który wstawił zadanie do kolejki. Hostname komputera, z którego zadanie zostało wstawione do kolejki. Identyfikator przyznany zadaniu przez LoadLeveler-a. Identyfikator przyznany etapowi zadania przez LoadLeveler-a. Nazwa użytkownika na komputerze obliczeniowym. W przypadku Notos-a, jest to ICM-owy user name. Zmienne, których wartości pobierane są ze zdefiniowanych w skrypcie parametrów LoadLeveler-a. 47
LoadLeveler zmienne środowiskowe Zmienna LOADL_JOB_NAME LOADL_STEP_ERR LOADL_STEP_IN LOADL_STEP_OUT LOADL_STEP_ID LOADL_STEP_INITDIR LOADL_STEP_NAME LOADL_STEP_OWNER Znaczenie Identyfikator zadania. Pliki standardowego strumienia wyjścia, wejścia oraz błędu. Identyfikator etapu zadania. Katalog roboczy. Nazwa etapu zadania. Właściciel danego etapu zadania. 48
LoadLeveler zmienne środowiskowe (BG/P) Zmienna LOADL_BG_BPS LOADL_BG_CONNECTION LOADL_BG_IONODES LOADL_BG_PARTITION LOADL_BG_SHAPE LOADL_BG_SIZE Znaczenie Lista podstawowych partycji, z których składa się zaalokowana dla zadania partycja. Topologia partycji. Lista węzłów I/O zaalokowanej partycji. Nazwa zaalokowanej partycji. Kształt zaalokowanej partycji. Rozmiar zaalokowanej partycji. 49
Przykładowy skrypt (Przykłady w /opt/examples/loadleveler) # @ job_name = Ping_pong # @ account_no = grupa # @ class = kdm # @ error = ping_pong.err # @ output = ping_pong.out # @ environment = COPY_ALL # @ wall_clock_limit = 00:20:00 # @ notification = error # @ notify_user = $(user)@icm.edu.pl # @ job_type = bluegene # @ bg_size = 32 # @ queue mpirun -exe ping_pong -mode SMP -np 32 50
LoadLeveler zadanie vs etap zadania Krok zadania (Job Step) podstawowa jednostka pracy LoadLeveler-a Pojedyncze zadanie (Job) może zawierać kilka kroków Zadanie = zbiór kroków zadania Istnieje możliwość definiowania zależności pomiędzy krokami zadania Nie ma możliwości definiowania zależności pomiędzy zadaniami #@ step_name = step1 #@ input = step1.in #@ output = step1.out #@ error = step2.err #@ queue mpirun < > #@ dependency = (step1 == 0) #@ step_name = step2 #@ input = step2.in #@ output = step2.out #@ error = step2.err #@ queue Zadanie Job step 1 Job step 2 Job step 3 1. Wykonaj preprocessing 2. Sprawdź exit status exit status = x 1. Wykonaj obliczenia 2. Sprawdź exit status exit status = x Wykonaj postprocessing exit status = y exit status = y Zakończ zadanie 51
Podstawowe opcje mpirun (mpirun h) Opcja -np ranks -exe <executable> -args program args -cwd <path> -mode <SMP,DUAL,VN> Znaczenie Ilość ranków MPI. Nazwa pliku wykonywalnego zadania. Argumenty pliku wykonywalnego zadania. Ścieżka katalogu roboczego zadania. Specyfikuje tryb pracy węzłów. SMP 1 rank, 4 threads DUAL 2 ranks, 2 threads each VN 4 ranks, 1 thread each Zależność pomiędzy trybem pracy węzłów, rozmiarem partycji oraz ilością ranków MPI Tryb VN: ilość ranków MPI = 4 x rozmiar partycji Tryb DUAL: ilość ranków MPI = 2 x rozmiar partycji Tryb SMP: ilość ranków MPI = rozmiar partycji 52
Zmienne środowiskowe Załóżmy, że chcemy przekazać środowisku obliczeniowemu ustawienia poprzez zmienne środowiskowe Ustawianie zmiennych środowiskowych w skrypcie LoadLeveler-a nie wystarczy Musimy wykonać to przy użyciu argumentu mpirun: -env <nazwa zmiennej>=<wartość zmiennej> (zmienne podawane pojedynczo) -exp_env <nazwa zmiennej> 53
Mapowanie ranków MPI Topologię partycji obliczeniowych BG/P można zobrazować jako trójwymiarowy sześcian z węzłami obliczeniowymi równomiernie w nim rozlokowanymi po współrzędnych X, Y oraz Z (mesh lub torus) Każdy węzeł (oprócz brzegowych w trybie mesh) jest bezpośrednio połączony z sześcioma sąsiednimi węzłami: +1 X, -1 X, +1 Y, -1 Y, +1 Z, -1 Z Komunikacja z węzłami sąsiednimi pojedynczy link Komunikacja z węzłami bardziej odległymi kilka linków Położenie danego węzła w sześcianie definiują współrzędne: <X,Y,Z> Dodatkowo każdy węzeł zawiera 4 rdzenie i może obsługiwać kilka procesów (4 w trybie VN, 2 w trybie DUAL oraz 1 w trybie SMP) Położenie danego procesu MPI definiują cztery współrzędne: <X,Y,Z,T> 54
Mapowanie ranków MPI Istnieje możliwość zdefiniowania rozkładu ranków MPI pomiędzy rdzenie obliczeniowe przydzielone zadaniu Domyślne rozłożenie: XYZT (niezbyt atrakcyjne dla większości aplikacji) Rekomendacja: TXYZ Dwa sposoby definiowania rozkładu: Argument MPIRUN: -mapfile <ścieżka do pliku z definicją rozkładu> Zmienna środowiskowa BG_MAPPING: TXYZ, TXZY, TYXZ, TYZX, TZXY, TZYX, TYZT, XZYT, YXZT, YZXT, ZXYT, ZYXT Ścieżka do pliku z definicją rozkładu 55
Mapowanie ranków MPI mpirun mapfile $(home)/map.txt mode SMP exe./program mpirun env BG_MAPPING=$(home)/map.txt mode SMP exe./program map.txt 0 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 1 0 0 0 1 1 56
Przykład: mapowanie ranków MPI Źródło: http://www2.fz-juelich.de/jsc/jugene/usage/tuning/ Załóżmy, że nasz program korzysta z trójwymiarowego komunikatora o rozmiarze 16x16x8 i ma zostać uruchomiony w trybie VN w ramach pojedynczego midplane (o rozmiarze XxYxZxT=8x8x8x4) Należy dobrać odpowiednie mapowanie proces rdzeń obliczeniowy 57
Przykład: mapowanie ranków MPI 0 0 0 0 # task 0; communicator coordinates ( 0, 0, 0) 1 0 0 0 # task 1; communicator coordinates ( 1, 0, 0) 2 0 0 0 # task 2; communicator coordinates ( 2, 0, 0)... 7 0 0 0 # task 7; communicator coordinates ( 7, 0, 0) 0 0 0 1 # task 8; communicator coordinates ( 8, 0, 0) 1 0 0 1 # task 9; communicator coordinates ( 9, 0, 0)... 7 0 0 1 # task 15; communicator coordinates (15, 0, 0) 0 1 0 0 # task 16; communicator coordinates ( 0, 1, 0) 1 1 0 0 # task 17; communicator coordinates ( 1, 1, 0)... 7 1 0 0 # task 23; communicator coordinates ( 7, 1, 0) 0 1 0 1 # task 24; communicator coordinates ( 8, 1, 0) 1 1 0 1 # task 25; communicator coordinates ( 9, 1, 0)...... 0 0 0 2 # task 64; communicator coordinates ( 0, 8, 0) 1 0 0 2 # task 65; communicator coordinates ( 1, 8, 0) 2 0 0 2 # task 66; communicator coordinates ( 2, 8, 0)... 7 0 0 2 # task 71; communicator coordinates ( 7, 8, 0) 0 0 0 3 # task 72; communicator coordinates ( 8, 8, 0) 1 0 0 3 # task 73; communicator coordinates ( 9, 8, 0)... 58
Mapowanie ranków MPI mpirun env BG_MAPPING=TXYZ mode SMP exe./program Rank 0 Processor <0,0,0,0> in a <4, 4, 4, 4> mesh Rank 1 Processor <0,0,0,1> in a <4, 4, 4, 4> mesh Rank 2 Processor <0,0,0,2> in a <4, 4, 4, 4> mesh Rank 3 Processor <0,0,0,3> in a <4, 4, 4, 4> mesh Rank 4 Processor <1,0,0,0> in a <4, 4, 4, 4> mesh Rank 5 Processor <1,0,0,1> in a <4, 4, 4, 4> mesh Rank 6 Processor <1,0,0,2> in a <4, 4, 4, 4> mesh Rank 7 Processor <1,0,0,3> in a <4, 4, 4, 4> mesh mpirun env BG_MAPPING=XYZT mode SMP exe./program Rank 0 Processor <0,0,0,0> in a <4, 4, 2, 1> mesh Rank 1 Processor <1,0,0,0> in a <4, 4, 2, 1> mesh Rank 2 Processor <2,0,0,0> in a <4, 4, 2, 1> mesh Rank 3 Processor <3,0,0,0> in a <4, 4, 2, 1> mesh Rank 4 Processor <0,1,0,0> in a <4, 4, 2, 1> mesh Rank 5 Processor <1,1,0,0> in a <4, 4, 2, 1> mesh Rank 6 Processor <2,1,0,0> in a <4, 4, 2, 1> mesh Rank 7 Processor <3,1,0,0> in a <4, 4, 2, 1> mesh 59
Aktualna konfiguracja LoadLeveler-a Klasa KDM ograniczenie do 1 midplane (R00-M0), wallclock 1h, cputime 32h, priorytet 10 Przeznaczenie: podstawowe testy oprogramowania, kompilacja, uruchomienie, testy skalowalności do 512 węzłów Klasa KDM-LARGE bez ograniczenia na ilość węzłów, wallclock 360h, priorytet 10 Przeznaczenie: rozszerzone testy skalowalności, obliczenia Klasa POWIEW bez ograniczeń na ilość węzłów, wallclock 360h, priorytet 90 Przeznaczenie: obliczenia Klasa Workshop (tymczasowa) ograniczenie do 1 midplane Przeznaczenie: szkolenia 60
Agenda O projekcie POWIEW Architektura systemu Notos Środowisko użytkownika systemu Notos Sesja hands-on: uruchamianie aplikacji Kompilatory, biblioteki i optymalizacja oprogramowania Sesja hands-on: kompilacja i optymalizacja Badanie wydajności i debugowanie Sesja hands-on: badanie wydajności i debugowanie Podsumowanie 61
Sesja hands-on: uruchamianie aplikacji (1/2) 1. Wejdź do katalogu loadl/ 2. Napisz skrypt kolejkowy LoadLeveler (np. o nazwie submit.ll), deklarując odpowiednio: Nazwę zadania (job_name): Cannon Własną grupę (account_no): icm-szkolenia Klasę (class): workshop Plik wyjścia (output): cannon.out Plik błędu (error): cannon.err Czas zegarowy (wall_clock_limit): 00:02:00 Typ powiadomienia (notification): always Adresata powiadomienia (notify_user): email Typ zadania (job_type): bluegene Rozmiar zadania (bg_size): 1 3. Pamiętaj, że po deklaracjach LoadLeveler-a powinna pojawić się linia # @ queue 4. W ramach zadania uruchom program cannon następującą komendą: mpirun -exe cannon -mode VN -np 4 5. Uruchom zadanie komendą: llsubmit submit.ll 62
Sesja hands-on: uruchamianie aplikacji (2/2) 1. Wejdź do katalogu loadl/ 2. Zapoznaj się z konstrukcją zadania wielokrokowego: cannon_steps.ll 3. Skrypt ten wykonuje testy skalowalności programu cannon na 1,4 i 16 węzłach Blue Gene/P 4. Uruchom zadanie wielokrokowe komendą: llsubmit cannon_steps.ll 5. Spróbuj wprowadzić następujące zależności (dependency): Krok drugi może zostać uruchomiony po poprawnym zakończeniu kroku pierwszego Krok trzeci może zostać uruchomiony po poprawnym zakończeniu kroku drugiego 6. Uruchom zadanie i sprawdzaj jego status komendą: llq 63
Agenda O projekcie POWIEW Architektura systemu Notos Środowisko użytkownika systemu Notos Sesja hands-on: uruchamianie aplikacji Kompilatory, biblioteki i optymalizacja oprogramowania Sesja hands-on: kompilacja i optymalizacja Badanie wydajności i debugowanie Sesja hands-on: badanie wydajności i debugowanie Podsumowanie 64
Katalog z narzędziami Blue Gene/P W katalogu /bgsys/driver/ppcfloor znajdują się m.in. narzędzia pracy na architekturze Blue Gene/P, takie jak: Narzędzia GNU /bgsys/drivers/ppcfloor/gnu-linux Nakładki MPI (wrappers) /bgsys/driver/ppcfloor/comm Pliki nagłówkowe i biblioteki /bgsys/drivers/ppcfloor/arch/include W większości przypadków wiedza o dokładnej nazwie tego katalogu nie jest potrzebna, gdyż środowisko programisty ustawiane jest automatycznie poprzez użycie komendy module module avail listowanie dostępnych modułów module load <moduł> - włączanie modułów module list listowanie aktualnie włączonych modułów module unload <moduł> - wyłączanie modułu 65
Kompilatory Kompilacje na systemach Blue Gene/P odbywają się przy użyciu tzw. crosskompilatorów na węźle dostępowym Dostępne są kompilatory C, C++ oraz Fortran-a Rodzina kompilatorów XL: XL C/C++ oraz XL Fortran Wbudowane optymalizacje kodu specyficzne dla architektury Blue Gene/P, związane m.in. z obsługą podwójnej jednostki zmiennoprzecinkowej (FPU), kolejnością wykonywania instrukcji oraz wykorzystaniem wielopoziomowej pamięci Rodzina kompilatorów GNU: C, C++ oraz Fortran Nie tworzy wysoce zoptymalizowanego kodu na architekturę Blue Gene/P Nie generuje kodu dla podwójnej jednostki zmiennoprzecinkowej (FPU) Nie wspiera OpenMP 66
Cross-kompilatiory Kompilacja odbywa się na węźle dostępowym: Architektura POWER6, 64-bity Wykonanie kodu odbywa się na węzłach obliczeniowych Blue Gene/P: Architektura PowerPC 450, 32-bity Niektóre pakiety wymagają wywołania niewielkich fragmentów kodu na architekturze docelowej (poprzez Configure/Make): Uruchomienie kodu na węźle dostępowym może zakończyć się błędem Istnieje rozwiązanie wymagające wcześniejszych ustawień administratora (dedykowana partycja) Kompilacja większości pakietów zainstalowanych obecnie na systemie Notos wymagała wykonania Configure/Make. Wszystkie pakiety udało się zainstalować bez użycia dedykowanej partycji. 67
Kompilatory i narzędzia GNU GCC 4.1.1 Lokalizacja: /bgsys/drivers/ppcfloor/gnu-linux/ Nazewnictwo: C: powerpc-bgp-linux-gcc C++: powerpc-bgp-linux-g++ Fortran: powerpc-bgp-linux-gfortran Brak wsparcia dla OpenMP GLIBC 2.4 Wsparcie dla wielowątkowości: -lpthread GNU Tools GDB, addr2line, Python 2.5 Ustawienie środowiska: module load gnu_comp 68
Kompilatory z rodziny XL XL C/C++ 9.0, XL Fortran 11.1 Lokalizacja: /opt/ibmcmp/xlf/bg/11.1/, /opt/ibmcmp/vacpp/bg/9.0/ Ustawienie środowiska: dostępne domyślnie Język Wywołanie Wywołanie (thread safe) C C++ Fortran bgxlc bgc{89 99} bgcc bgxlc++ bgxlc bgxlf bgxlf{90 95 2003} bgf{77 90 95 2003} bgxlc_r bgc_r{89 99} bgcc_r bgxlc++_r bgxlc_r bgxlf_r bgxlf{90 95 2003}_r 69
Podstawowe opcje kompilacji (kompilatory XL) Flaga Opis działania -O0 Brak optymalizacji -O2 Podstawowa optymalizacja (domyślny poziom) -O3 -qstrict Optymalizacje wyższego poziomu, jednak bez wpływu na wyniki obliczeń numerycznych. -O3 -qhot Optymalizacje bardzo wysokiego poziomu. Mogą mieć wpływ na różnice w wynikach obliczeń numerycznych (!). -qarch=[450 450d] Przygotowanie zoptymalizowanego kodu maszynowego dla wykonania na pojedynczej i podwójnej jednostce obliczeń zmiennoprzecinkowych (FPU). -qtune=450 Optymalizuje kod dla architektury 450. -qsmp[=omp] -qreport qlist -qsource Umożliwia automatyczne bądź oparte o standard OpenMP zrównoleglenie w modelu pamięci współdzielonej. Tworzenie listingów podczas kompilacji. Kod pseudo-assembler na różnych poziomach szczegółowości. 70
Rekomendacje (kompilatory XL) 1. Rozpocznij od kompilacji z podstawową optymalizacją dla Blue Gene/P: -O2 qarch=450 qtune=450 2. Sprawdź poprawność wyników oraz wydajność obliczeniową kodu skompilowanego z opcją: qarch=450d qhot=simd 3. Sprawdź poprawność wyników oraz wydajność obliczeniową kodu skompilowanego z opcjami: O3 qstrict oraz O3 qhot 4. Ewentualnie sprawdź wydajność kodu zrównoleglonego w modelu pamięci współdzielonej (automatycznie lub poprzez dyrektywy OpenMP): -qsmp=auto / -qsmp=omp 71
Rekomendacje (kompilatory XL) Warto kompilować programy z opcją g. Nie powoduje ona, jak w przypadku innych kompilatorów, zmniejszenia wydajności generowanego kodu. 72
Kompilatory na węźle dostępowym Ważna uwaga: Na węźle dostępowym widoczne są również kompilatory GNU bez przedrostków powerpc-bgp, które kompilują kod dla architektury węzła dostępowego. (gcc, g++, gfortran,..) 73
Środowisko MPI MPI default domyślny tryb MPI po wywołaniu module load mpi_default mpixlc, mpixlcxx, mpixlf{77 90 95 2003}, mpixlc_r, mpixlcxx_r, mpixlf{77 90 95 2003}_r MPI fast MPI bez obsługi błędów po wywołaniu module load mpi_fast mpixlc, mpixlcxx, mpixlf{77 90 95 2003}, mpixlc_r, mpixlcxx_r, mpixlf{77 90 95 2003}_r Uwaga: mpicc, mpicxx, mpif77 w trybie default oparty jest na kompilatorach GNU Rekomendacja: wszędzie gdzie możliwe należy używać mpixl* 74
Rekomendacje - środowisko MPI 1. Skompiluj kod z MPI default. 2. Sprawdź poprawność i powtarzalność wyników. 3. Spróbuj skompilować kod z MPI fast. 4. Sprawdź poprawność wyników. Wszystkie pakiety udostępnione użytkownikom skompilowane zostały w wersji MPI default. Używanie MPI fast przyśpiesza niemal każde wywołanie MPI o około jedną mikrosekundę. W przypadku dużych kodów może to oznaczać w najlepszych przypadkach ok. 25% wzrost wydajności. 75
Podsumowanie - kompilatory Przykładowe opcje kompilacji i optymalizacji (IBM XL): -O2 qarch=450 qtune=450 - podstawowa optymalizacja -O3 qstrict qarch=450 qtune=450 - bardziej agresywna optymalizacja, jednak bez wpływu na precyzję obliczeń -O3 qhot qarch=450 qtune=450 - agresywna optymalizacja, może mieć wpływ na precyzję obliczeń -O3 qhot=simd qarch=450d qtune=450 - mniej agresywna, instrukcje SIMD Wykorzystanie operacji SIMD daje dobrą wydajność tylko w przypadku gdy dane w pamięci cache pierwszego poziomu (32KB) są intensywnie ponownie wykorzystywane. Zaleca się aby wpierw kompilować kody z opcją qarch=450, a dopiero po poprawnym uruchomieniu porównać wydajność z programem kompilowanym z opcją qarch=450d (Double-Hummer). Wydajność niektórych kodów może być niższa przy użyciu 450d. Jeśli nie chcemy testować wydajności i poprawności wyników (bezpieczna i wydajna optymalizacja): mpixlc_r -g -O3 qstrict qarch=450 qtune=450 76
Podsumowanie - kompilatory Domyślnym wyborem powinny być kompilatory XL Zawsze wybierajmy wersję thread safe kompilatorów: Niezbędna przy zrównolegleniu w modelu pamięci współdzielonej (SMP), Identyczna wydajność kodów bez zrównoleglenia SMP. Zawsze wybierajmy kompilatory MPI Można sprawdzić, czy utworzony plik binarny jest dedykowany na Blue Gene/P: file <plik binarny> ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), for GNU/Linux 2.0.0, statically linked, not stripped 77
Środowisko programisty biblioteki Biblioteka Sposób wykorzystania Miejsce instalacji Message Passing Interface (MPI) Podstawowa biblioteka do zrównoleglania. Mathematical Acceleration Subsystem (MASS) zoptymalizowane wersje standardowych funkcji matematycznych (np. cos,sin,powf, ) Engineering and Scientific Subroutine Library (ESSL) zoptymalizowane funkcje matematyczne i naukowe (np. algebra liniowa, FFT, generator liczb losowych, ) FFTW (v2.1.5,v3.2.2) single + double znana biblioteka do wielowymiarowych obliczeń FFT module load mpi_fast module load mpi_default -lmass -lmassv C/C++: -lesslbg lesslsmpbg -lxlf90_r -lxlopt -lxl lxlfmath Fortran: -lesslbg -lesslsmpbg module load fftw_2.1.5 module load fftw_3.2.2 /bgsys/drivers/ppcfloor/comm/fast /bgsys/drivers/ppcfloor/comm/default /opt/ibmcmp/xlmass /opt/ibmmath /opt/fftw/2.1.5 /opt/fftw/3.2.2 LAPACK v3.1 -L/opt/lapack/lapack_bgp.a /opt/lapack CBLAS /opt/cblas/cblas_bgp.a /opt/cblas BLACS /opt/blacs/blacscinit_mpi-bgp-0.a /opt/blacs/blacsf77init_mpi-bgp-0.a /opt/blacs/blacs_mpi-bgp-0.a /opt/blacs SCALAPACK /opt/scalapack/libscalapack.a /opt/scalapack HYPRE v2.7.0b -L/opt/hypre/lib lhypre I/opt/hypre/include /opt/hypre 78
Środowisko programisty biblioteki Biblioteka Sposób wykorzystania Miejsce instalacji HDF5 (1.8.3) Biblioteka Hierarchical Data Format (HDF) służy do obsługi zapisu, odczytu oraz organizacji bardzo dużych danych numerycznych pochodzących z obliczeń. Linkowanie z bibliotekami z katalogu: /opt/hdf5/xl/lib /opt/hdf5/xl NetCDF (4.0.1) i Parallel-NetCDF (1.1.1) Biblioteka NetCDF służy do obsługi zapisu, odczytu oraz organizacji bardzo dużych danych numerycznych pochodzących z obliczeń. Linkowanie z bibliotekami z katalogów: /opt/netcdf/xl/lib /opt/parallel-netcdf/lib /opt/netcdf /opt/parallel-netcdf GNU Scientific Library (GSL) Biblioteka funkcji i algorytmów numerycznych GNU. Linkowanie z bibliotekami z katalogu: /opt/gsl/lib /opt/gsl PETSc (3.0.0-p7) Zrównoleglona biblioteka służąca m.in. do rozwiązywania układów równań różniczkowych cząstkowych (PDEs). Linkowanie z bibliotekami z katalogu: /opt/petsc/bgp-ibm-opt/lib/ /opt/petsc /opt/petsc/bgp-ibm-opt Zoltan Biblioteka implementująca wiele algorytmów służących zarządzaniu i dystrybucji danych w aplikacjach równoległych. Linkowanie z bibliotekami z katalogu: /opt/zoltan/xl/lib /opt/zoltan P3DFFT (2.3.2) Zrównoleglona i wysoce skalowalna implementacja FFT 3D. -L/opt/p3dfft/lib lp3dfft /opt/p3dfft 79
Agenda O projekcie POWIEW Architektura systemu Notos Środowisko użytkownika systemu Notos Sesja hands-on: uruchamianie aplikacji Kompilatory, biblioteki i optymalizacja oprogramowania Sesja hands-on: kompilacja i optymalizacja Badanie wydajności i debugowanie Sesja hands-on: badanie wydajności i debugowanie Podsumowanie 80
Sesja hands-on: kompilacja i optymalizacja (1/6) Kompilacja single-core 1. Wejdź do katalogu mxm/ 2. Wykonaj kompilację programu mxm.c stosując kompilator bgxlc oraz następujące flagi: a) -O2 qtune=450 qarch=450 o mxm1 b) -O3 qstrict qtune=450 qarch=450 o mxm2 c) -O3 qhot qtune=450 qarch=450 o mxm3 d) -O3 qhot=simd qtune=450 qarch=450d o mxm4 e) -O5 qtune=450 qarch=450 o mxm5 3. Uruchom wielokrokowe zadanie mxm.ll i porównaj wyniki czasowe. 4. Która wersja programu jest najszybsza? 81
Sesja hands-on: kompilacja i optymalizacja (2/6) Raporty kompilatora 1. Wejdź do katalogu mxm/ 2. Wykonaj kompilację programu mxm.c stosując kompilator bgxlc oraz następujące flagi: a) -O3 -qstrict qtune=450 qarch=450 qreport qlist o mxm1 b) -O5 qtune=450 qarch=450 qreport qlist o mxm5 3. Porównaj pliki mxm.lst wygenerowane podczas obydwu kompilacji (Uwaga: pliki się nadpiszą) 4. Czy potrafisz stwierdzić jakiego rodzaju optymalizacji dokonał kompilator przy kompilacji z poziomem O3? 5. Czy potrafisz stwierdzić jakiego rodzaju optymalizacji dokonał kompilator przy kompilacji z poziomem O5? 82
Sesja hands-on: kompilacja i optymalizacja (3/6) Automatyczne zrównoleglanie w trybie SMP 1. Wejdź do katalogu mxm/ 2. Wykonaj kompilację programu mxm.c stosując kompilator bgxlc_r oraz następujące flagi: -O5 qtune=450 qarch=450 qsmp=auto o mxm 3. Uruchom zadanie mxm_smp.ll i sprawdź wynik czasowy 4. Wykonaj również kompilację z opcjami qreport qlist. 5. Jakie informacje o automatycznym zrównolegleniu znajdują się w pliku mxm.lst? 6. Dlaczego nie udało się zrównoleglić pętli, w której wywoływana jest funkcja rand()? 83
Sesja hands-on: kompilacja i optymalizacja (4/6) Zrównoleglanie OpenMP w trybie SMP 1. Wejdź do katalogu mxm/ 2. Dokonaj edycji programu mxm.c. W linii 37 poprzedzającej główną pętlę obliczeniową wstaw dyrektywę OpenMP: #pragma omp parallel for private(i,j,k) 3. Wykonaj kompilację programu mxm.c stosując kompilator bgxlc_r oraz następujące flagi: -O5 qtune=450 qarch=450 qsmp=omp o mxm 4. Dodaj dodatkową opcję uruchomienia mpirun w skrypcie mxm_smp.ll: -env OMP_NUM_THREADS=4 5. Uruchom zadanie mxm_smp.ll i sprawdź wynik czasowy 84
Sesja hands-on: kompilacja i optymalizacja (5/6) Kompilacja programów MPI 1. Wejdź do katalogu cannon/ 2. Wykonaj kompilację programu cannon.c stosując kompilator mpixlc_r oraz następujące flagi: -O5 qtune=450 qarch=450 o cannon 3. Wstaw zadanie cannon.ll do kolejki. Sprawdź czas wykonania w pliku wynikowym. 85
Sesja hands-on: kompilacja i optymalizacja (6/6) Kompilacja programów hybrydowych MPI & OpenMP 1. Wejdź do katalogu cannon_hybrid/ 2. Wykonaj kompilację programu cannon_hybrid.c stosując kompilator mpixlc_r oraz następujące flagi: -O5 qtune=450 qarch=450 qsmp=omp o cannon 3. Dodaj dodatkową opcję uruchomienia mpirun w skrypcie cannon_hybrid.ll: -env OMP_NUM_THREADS=4 4. Wstaw zadanie cannon_hybrid.ll do kolejki. Sprawdź czas wykonania w pliku wynikowym. 86
Agenda O projekcie POWIEW Architektura systemu Notos Środowisko użytkownika systemu Notos Sesja hands-on: uruchamianie aplikacji Kompilatory, biblioteki i optymalizacja oprogramowania Sesja hands-on: kompilacja i optymalizacja Badanie wydajności i debugowanie Sesja hands-on: badanie wydajności i debugowanie Podsumowanie 87
Badanie wydajności aplikacji Badanie wydajności aplikacji ma na celu znalezienie sposobów i możliwości optymalizacji. Może się to odbywać na różnych poziomach: Optymalizacje bardzo niskiego poziomu: badanie liczników maszynowych (Universal Performance Counters, Hardware Performance Counters Library) nie będą opisane podczas szkolenia Optymalizacje kosztownych obliczeniowo fragmentów: znajdowanie i badanie najbardziej kosztownych fragmentów aplikacji (Gprof, Vprof) Optymalizacje wydajności równoległej: śledzenie komunikacji MPI (MPI Trace Library) 88
Profiling za pomocą GNU Profiler (Gprof) Krok po kroku: Kompilacja z opcjami: -g pg qfullpath Uruchomienie aplikacji Po zakończeniu działania programu w katalogu roboczym znajdować będą się pliki: gmon.out.<mpi Rank> - pliki binarne Ilość plików zależy od zmiennej środowiskowej (albo jeden plik per proces, albo 3 pliki dla najwolniejszego, najszybszego i średniego procesu) Interpretacja wyników za pomocą GNU Profiler-a lub Xprofiler-a Użycie: gprof <Binary> gmon.out.<mpi Rank> > gprof.out.<mpi Rank> Wyniki profilingu nieco ograniczone w porównaniu do ich odpowiedników z innych systemów: nazwy funkcji i ich ciężar, ilość odwołań 89
Profiling za pomocą Visual Profiler (VProf) Konkurencyjne narzędzie, które różni się od Gprof-a sposobem użycia oraz prezentacji wyników. Krok po kroku: Rekompilacja nie jest wymagana Wymagane jest wykonanie kroku linkowania z IBM MPI Trace Library Należy ustawić zmienną środowiskową: VPROF_PROFILE=yes Po zakończeniu działania programu w katalogu roboczym znajdować będą się pliki: vmon.out.<mpi Rank> - pliki binarne, jeden plik per proces Interpretacja wyników profilingu za pomocą cprof Użycie: cprof -e <Binary> vmon.out.<mpi Rank> Lokalizacja: /opt/prof 90
Profiling za pomocą Visual Profiler (VProf) cprof [options] executable [vmon_file...] -d, --directory dir Search dir for source files -D, --recursive-directory dir Search dir recursively for source files -e, --everything Show all information -a, --annotate file Annotate file -n, --number Show number of samples (not %) -s, --show thres Set threshold for showing aggregate data -H, --html dir Output HTML into directory dir 91
Śledzenie komunikacji MPI biblioteka IBM MPI Trace Realizowane zadania: Zbieranie informacji o wszystkich wywołaniach MPI Wykonywanie pomiarów czasu spędzonego w funkcjach MPI Gromadzenie informacji o drzewie wywołań funkcji komunikacji Sposób wykorzystania: Linkowanie aplikacji z biblioteką: /opt/mpitrace/libmpitrace.a Uruchomienie programu (ustawienia poprzez zmienne środowiskowe następny slajd) Analizowanie wyników pliki tekstowe: mpi.profile.<process ID>.<MPI Task #> events.trc hpmdata.x_y_z.<process ID> 92
Śledzenie komunikacji MPI biblioteka IBM MPI Trace Nazwa zmiennej Wartość Przeznaczenie PROFILE_BY_CALL_SITE {no yes} Wygeneruj drzewo wywołań funkcji komunikacji. SAVE_ALL_TASKS {no yes} Zapamiętaj pliki śladu dla wszystkich procesów MPI. Domyślnie zapamiętywane są tylko 3: minimalny/średni/maksymalny TRACE_ALL_EVENTS {no yes} Śledź wszystkie funkcje MPI. W przeciwnym wypadku śledzone są tylko funkcje wskazane przez użytkownika poprzez odpowiednie API. TRACE_DIR <Katalog> Katalog, w którym znaleźć mają się wszystkie pliki wynikowe. TRACE_MAX_RANK <RankID> Śledź procesy MPI o numerach od 0 do <RankID> TRACE_SEND_PATTERN {no yes} Zbuduj macierz komunikacji. 93
Śledzenie komunikacji MPI biblioteka IBM MPI Trace 94
Debugowanie aplikacji Konstrukcja środowiska obliczeniowego i uruchomieniowego utrudnia prowadzenie interaktywnych sesji debugowania Rozwiązanie 1: kompilacja, uruchomienie i debugowanie na węźle dostępowym Rozwiązanie 2: użycie serwera i klienta GNU GDB brak wsparcia na Notosie Rozwiązanie 3: użyć komercyjnego rozwiązania (np. Totalview) niedostępne na Notosie Rozwiązanie 4: analizowanie plików core 95
Pliki core Generowanie plików core (core file, core dump) zapis aktualnego stanu programu z pamięci do pliku Domyślne standardowe pliki core na Blue Gene/P są bardzo lekkimi plikami tekstowymi ze względu na wydajność Istnieje możliwość generowania binarnych plików core, poprzez ustawienie zmiennej: BG_COREDUMP_BINARY = <MPI Rank> Binarne pliki core mogą być używane w GDB 96
Pliki core - obsługa Sterowanie mechanizmem za pomocą zmiennych środowiskowych: BG_COREDUMPONEXIT Tworzy pliki core, gdy program kończy pracę Przydatne gdy program zakończył działanie (np. wywołując exit()), ale trudno ustalić w jakim dokładnie miejscu BG_COREDUMPONERROR Tworzy pliki core, gdy aplikacja zakończy się zwracając niezerowy kod wyjścia Przydatne gdy program zakończył działanie Kompilacja z opcją -g znacznie pomaga w późniejszym interpretowaniu adresów. 97
addr2line - opis addr2line wyznacza linię w źródłach programu, która odpowiada danemu adresowi Jest to standardowa komenda Linux-a: http://www.linuxcommand.org/man_pages/addr2line1.html Dostępność: /bgsys/drivers/ppcfloor/gnu-linux/bin/powerpc-bgp-linux-addr2line Użycie: addr2line e <plik binarny> <adres heksadecymalny> 98
Sposoby pracy z plikami core addr2line 1. Czytamy plik core i sprawdzamy kolejne adresy na stosie 2. Sprawdzamy za pomocą polecenia addr2line kolejno aktualne miejsca w kodzie 3. Niezbędna opcja -g 99
Sposoby pracy z plikami core Core Processor Core Processor to bardzo prosty równoległy debugger, który pozwala na: Przetwarzanie plików core Podłączenie do działającego zadania Tylko wersja graficzna (logowanie poprzez ssh Y) 100
Sposoby pracy z plikami core Core Processor Wywołanie: /bgsys/drivers/ppcfloor/tools/coreprocessor/coreprocessor.pl Opcje startowe: 2 opcje: -a <Block ID> - podłączenie do istniejącego bloku -c <Core Files Directory> - wczytaj pliki core z podanej ścieżki -b <Binary> - określa plik binarny, którego ma dotyczyć praca Wczytanie plików core File >> Load Core Monitorowanie uruchomionych zadań File >> Attach to Block 101
Agenda O projekcie POWIEW Architektura systemu Notos Środowisko użytkownika systemu Notos Sesja hands-on: uruchamianie aplikacji Kompilatory, biblioteki i optymalizacja oprogramowania Sesja hands-on: kompilacja i optymalizacja Badanie wydajności i debugowanie Sesja hands-on: badanie wydajności i debugowanie Podsumowanie 102
Hands-on: badanie wydajności i debugowanie (1/4) Profiling za pomocą Gprof 1. Wejdź do katalogu prof/ 2. Skompiluj program cannon.c za pomocą kompilatora mpixlc_r oraz następujących opcji: -O2 qtune=450 qarch=450 g pg qfullpath o cannon 3. Uruchom zadanie: llsubmit cannon.ll 4. Wykonaj np.: gprof gmon.out.100 > gprof.out.100 5. Obejrzyj wynik analizy Gprof-a 103
Hands-on: badanie wydajności i debugowanie (2/4) Profiling za pomocą VProf 1. Wejdź do katalogu prof/ 2. Usuń wygenerowane wcześniej pliki profilingu Gprof 3. Skompiluj program cannon.c za pomocą kompilatora mpicc oraz następujących opcji: -O2 g o cannon cannon.c L/opt/mpitrace lmpitrace lgfortranbegin lgfortran lm (Uwaga: ważna kolejność) 3. Dodaj zmienną środowiskową VPROF_PROFILE=yes do środowiska obliczeń 4. Uruchom zadanie: llsubmit cannon.ll 5. Wykonaj cprof e cannon vmon.out.115 > cprof.out.115 6. Uwaga: kompilacja kodów w C oraz C++ tylko za pomocą kompilatorów w wersji GNU (mpicc lub mpicxx) 104
Hands-on: badanie wydajności i debugowanie (3/4) Śledzenie wywołań MPI - MPItrace 1. Wejdź do katalogu prof/ 2. Skompiluj program cannon.c za pomocą kompilatora mpicc oraz następujących opcji: -O2 g o cannon cannon.c L/opt/mpitrace lmpitrace lgfortranbegin lgfortran lm (Uwaga: ważna kolejność) 3. Dodaj do wykonania mpirun w skrypcie cannon.ll różne zmienne środowiskowe z tabeli (m.in. env SAVE_ALL_TASKS=yes oraz env TRACE_ALL_EVENTS=yes ) 4. Uruchom zadanie: llsubmit cannon.ll 5. Obejrzyj zawartość plików mpi_profile.* 6. Możesz obejrzeć plik śladu events.trc za pomocą programu Traceview: /opt/traceview/traceview.x events.trc 105
Hands-on: badanie wydajności i debugowanie (4/4) Debugowanie programów 1. Wejdź do katalogu debug/ 2. Skompiluj program deadlock.c za pomocą kompilatora mpixlc_r oraz następujących opcji: -O2 qtune=450 qarch=450 g o deadlock 3. Dodaj do wykonania mpirun w skrypcie deadlock.ll opcję: -env "BG_COREDUMPONEXIT=1" 4. Uruchom zadanie: llsubmit deadlock.ll 5. Zadanie po uruchomieniu wejdzie w stan impasu (z ang. deadlock) 6. Usuń zadanie za pomocą komendy: llcancel JOBID 7. Otwórz dowolny plik core.n i przejdź na jego koniec 8. Wykonuj polecenia: addr2line e deadlock 0x01001668 106
Agenda O projekcie POWIEW Architektura systemu Notos Środowisko użytkownika systemu Notos Sesja hands-on: uruchamianie aplikacji Kompilatory, biblioteki i optymalizacja oprogramowania Sesja hands-on: kompilacja i optymalizacja Badanie wydajności i debugowanie Sesja hands-on: badanie wydajności i debugowanie Podsumowanie 107
Obliczenia w wielkiej skali projekt Partnership for Advanced Computing in Europe Strona projektu: www.prace-ri.eu Największy komputer Europy: Jugene 72 szafy Blue Gene/P Otwarte konkursy na granty obliczeniowe oraz tzw. preparatory access 3 rodzaje preparatory access (A,B,C) Wspólne grupy robocze złożone z programistów PRACE oraz naukowców w projektach typu C 108
Więcej informacji http://www.icm.edu.pl/kdm/notos http://www.icm.edu.pl/kdm/loadleveler_%28blue_gene/p%29 Pytania i problemy: powiew-admins@icm.edu.pl Biuletyn HPC: http://biuletyn.icm.edu.pl 109
Dziękujemy za uwagę Pytania? 110