Strategier för att utnytja parallella system. Peter Kjellström NSC Upplysning 2010-04-27

Relevanta dokument
Parallellprogrammering med hjälp av MPI

Information Coding / Computer Graphics, ISY, LiTH CUDA. En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk

En kort text om programmering i C.

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Contention. Small-Scale Shared Address Space Multiprocessor (MIMD) Bandbredd till minnet & cacheminnen i multiprocessors

#include <stdio.h> #include <string.h>

Att använda pekare i. C-kod

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Föreläsning 10. Pekare (Pointers)

Funktioner och programstruktur. Föreläsning 5

Prestanda och skalbarhet

Parallellprogrammering i C++ 17 EDT621 Datorarkitekturer med Operativsystem Viktor Lindgren

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Funktioner och programstruktur. Föreläsning 5

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Software Technology. Josef Svenningsson

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

Raspberry Pi och Tellstick, ett program i C.

(2) Skriv ett program som skapar ett antal processer vars relationer beskrivs av nedanstående tidsdiagram a

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Introduktion C-programmering

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Administrivia Programmering Grunderna i C Kortspel. Programmering. Sommarkurs Verónica Gaspes.

Pekare och arrayer. Indexering och avreferering

C-programmering, föreläsning 2 Jesper Wilhelmsson

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Repetition C-programmering

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Concurrency Saker händer samtidigt. Process En instans av ett program

Föreläsning 12. struct

Information Coding / Computer Graphics, ISY, LiTH. Minnesaccess. Vitalt för prestanda! Minnestyper. Coalescing

2... uppvisa förmåga att skapa och/eller hantera flerprocessiga program där de ingående processerna ges

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Posix Threads. En studie i förvirring eller Halleluja! Peter Eriksson, Signum Support AB 1

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Föreläsning 11. Strängar

Övning från förra gången: readword

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Programmeringsteknik med C och Matlab

*Pekarvärden *Pekarvariabler & *

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Programmering i C, 7,5 hp

Operativsystem ID1200/06 Tentamen :00-18:00

Typkonvertering. Java versus C

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Trådar och Multiprocessorer. Föreläsning 6

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Föreläsning 9. struct

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Parallellisering av algoritmer för flerkärniga processorer Kandidatarbete inom Data- och informationsteknik

Tillämpad programmering

... Funktionsanrop. Vad händer när man kör ett program?

Installation Site Country/Year Earth Simulator Center Japan/2002 Los Alamos National Laboratory USA/2002. Los Alamos National Laboratory USA/2002

TDIU01 - Programmering i C++, grundkurs

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

PARALLELLISERING AV ALGORITMER PROCESSORER FÖR FLERKÄRNIGA

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

Loopar och datatyper. Föreläsning 3

Operativsystem (IS1350) :00-12:00

TDIU01 - Programmering i C++, grundkurs

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

TDIU01 - Programmering i C++, grundkurs

Programmeringsteknik med C och Matlab

Vad är viktigast? Sammanfattning. Processer och trådar. Processer och trådar. Flerprocessorsystem. Schemaläggning. Interprocesskommunikation.

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Abstrakta datastrukturer

Michael Q. Jones & Matt B. Pedersen University of Nevada Las Vegas

Indicerade variabler

Föreläsning 17 UTBLICK: FORTSÄTTNINGSKURSER I DATAVETENSKAP + ANDROID

Tommy Färnqvist, IDA, Linköpings universitet

tentaplugg.nu av studenter för studenter

1.1 Runnable och Thread

Tentamen *:58/ID100V Programmering i C Exempel 3

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

Fö 4 TSEA81. Monitors and Message passing

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Programmering. Hur, var, när och varför. 22 November. Lars Ohlén Tieto

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

printenv sort pager printenv grep args sort pager

Besvara de elektroniska frågorna (se kurshemsidan). Läs kapitel i kursbok

Hantering av textsträngar och talsträngar. William Sandqvist

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

const och pekare Output: char *unsafe(char *s) { // Returnerar pekare till det andra tecknet i s printf("%s \n", s);

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

Dagens OS. Unix, Linux och Windows. Unix. Unix. En översikt av dagens OS Titt på hur de gör. Många varianter Mycket gemensamt. En del som skiljer

Transkript:

Strategier för att utnytja parallella system Peter Kjellström NSC Upplysning 2010-04-27

Problemet Människor tänker normalt i seriella banor 2-24 cores i en vanlig desktop/server Det finns massor med seriell kod skriven Parallellprogrammering svårt och okänt >1000 cores i en HPC-resurs Trenden är stigande...

Komplikationer Strong scaling är svårt Amdahls lag Komplicerad utvecklingsmiljö (tex. debugging/felsökning)

Strong scaling Kommunikationstid vs. beräkningstid Det tar ~1us mellan två noder i ett kluster På 1us hinner en modern core ~1000 Fops Små problem hinner inte delas upp Strong scaling, att få ökad prestanda med fler cores med bibehållen problemstorlek Weak scaling, att få ökad prestanda med fler cores fast då man samtidigt ökar problemstorleken

Amdahls lag Det som inte (kan) parallelliseras begränsar till slut skalbarheten För små f har optimeringar liten effekt Program med många delar kräver mycket jobb 1+3+2=6 1+0,5+2=3,5 1 Speedup total f, S = 1 f f S f = 3 6 =0,5 S=6 1 1 0,5 0,5 6 = 12 7

Bild från Wikipedia

Parallella strategier Magisk mjuk-/hårdvara som fixar det Oberoende instanser, parameterstudier Parallella bibliotek Delat minne, OpenMP och Pthreads Distribuerat minne, MPI PGAS-språk

Oberoende instanser / parameterstudier /... När ditt arbete är uppdelat i oberoende delar Exempel Web-server Seti@home Filmrendering Enkelt men funkar inte för allt/alla #!/bin/sh for core in 1 2 3 4 ; do./ run_ my_program variant=$core & done wait #!/bin/sh i=0 for host in x y z ; do for core in 1 2 3 4 ; do ssh $host./ render_ frame -- frame=$i & i=$(( $i + 1 )) done done wait

Parllella bibliotek Seriellt program anropar befintligt (parallelliserat) bibliotek Kan vara saftig lågt hängande frukt Amdahls lag... Hitta lämpligt bibliotek t=0 t=4 t=7

Delat minne Flera trådar körs och har tillgång till samma minne Lätt att utbyta data Nya möjligheter till buggar, race, låsmissar etc. POSIX threads och OpenMP som exempel Minne = tråd

P(osix)threads Biblioteksbaserat Flexibelt, är vad man gör det till Ofta delar man ut uppgifter på trådar som får göra oberoende saker Vanligt förekommande inom annat än HPC # include <pthread. h> # include <stdio. h> void* func(...) { printf( Hej världen ); pthread_exit(); } void main( void) { pthread_ t thread1, thread2; } pthread_ create(& thread1, func, ); pthread_ create(& thread2, func, );

OpenMP Uttrycks med kompilatordirektiv Ofta kör trådarna varsin bit av samma loop (se exempel) Enkelt att göra enkla saker, svårt att göra svåra saker Byggs med cc -openmp... #include <omp. h> int main( void) {... #pragma omp parallel for for ( i=0; i<4; i++) { printf("thread: %i running it. %i\n", omp_get_thread_num(), i); c[i] = a[i] * b[i]; } for ( i=0; i<4; i++) printf(... $ OMP_NUM_ THREADS=4./test thread: 0 running it. 0 thread: 1 running it. 1 thread: 3 running it. 3 thread: 2 running it. 2 0: a = 0, b = 10, c = 0 1: a = 1, b = 8, c = 8 2: a = 2, b = 6, c = 12 3: a = 3, b = 4, c = 12 $ OMP_NUM_ THREADS=2./test thread: 0 running it. 0 thread: 0 running it. 1 thread: 1 running it. 2 thread: 1 running it. 3...

MPI Message passing Biblioteksbaserat Alla trådar kör samma program Minne Minne Data skickas explicit mha. funktionsanrop MPI-processer kallas för rank(s) och kan köras på olika maskiner Minne Minne MPI-rank vanlig minnesaccess Funktionsanrop/MPI

Mer MPI... Omfattande utvecklingsinsats Explicit uppdelning av data innebär ofta att man får skriva om stora delar av ett seriellt program Vanligast är att man använder Fortran eller C/C++ men tex. Python-stöd finns också MPI är den dominerande programmeringsmodellen för HPC system idag MPI-program kan skala till 100 000-tals cores

MPI-exempel #include <stdio.h> #include <mpi.h> int main(int argc, char **argv){ int a[4], b[4], c[4]; int i, rank, local_a, local_b, local_c; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) for (i=0; i<4; i++) { a[i] = i; b[i] = 10-2*i; } På NSC: $ $CC -Nmpi -o mpitest mpitest. c Med typisk kompilator-wrapper: $ mpicc -o mpitest mpitest.c $ mpirun -np 4./mpitest rank: 0 calculating element 0 rank: 2 calculating element 2 rank: 1 calculating element 1 rank: 3 calculating element 3 0: a = 0, b = 10, c = 0 1: a = 1, b = 8, c = 8 2: a = 2, b = 6, c = 12 3: a = 3, b = 4, c = 12 MPI_Scatter(&a, 1, MPI_INT, &local_a, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Scatter(&b, 1, MPI_INT, &local_b, 1, MPI_INT, 0, MPI_COMM_WORLD); printf("rank: %i calculating element %i\n", rank, rank); local_c = local_a * local_b; MPI_Gather(&local_c, 1, MPI_INT, &c, 1, MPI_INT, 0, MPI_COMM_WORLD); if (rank == 0) for (i=0; i<4; i++) printf("%i: a = %i, b = %i, c = %i\n", i, a[i], b[i], c[i]); } MPI_Finalize(); return 0;

PGAS - Partitioned Global Adress Space Lite som en blandning mellan MPI och OpenMP Implementerat som språk (eller språkutökning) Exempel: X10, Unified Parallel C (UPC), CAF, Chapel, Titanium Minne = tråd

Mer PGAS Lockar med mer finkornig parallellism, skalbarhet och mindre stök-o-bök än MPI Passar speciellt bra på maskiner med global minnesrymd (GAS) men kräver inte cache koherens (som tex. OpenMP) Går att köra på >1 vanlig maskin mha. GASNet Framtiden? Kommer folk verkligen överge MPI/OpenMP?

PGAS-exempel (UPC) # include <upc. h> # include <stdio.h> shared int a[ THREADS]; shared int b[ THREADS]; shared int c[ THREADS]; int main() { int i; if (MYTHREAD == 0) for (i=0; i<threads; i++) { a[i] = i; b[i] = 10-2* i; } upc_barrier; $ upcc - o test. bin test. upc $ upcrun - n 4 test.bin UPCR: UPC thread 2 of 4 on n139 (... UPCR: UPC thread 3 of 4 on n139 (... UPCR: UPC thread 1 of 4 on n139 (... UPCR: UPC thread 0 of 4 on n139 (... thread: 1 calculating element 1 thread: 3 calculating element 3 thread: 0 calculating element 0 thread: 2 calculating element 2 0: a = 0, b = 10, c = 0 1: a = 1, b = 8, c = 8 2: a = 2, b = 6, c = 12 3: a = 3, b = 4, c = 12 $ printf(" thread: %i calculating element % i\ n", MYTHREAD, MYTHREAD); c[ MYTHREAD] = a[ MYTHREAD] * b[mythread]; upc_barrier; if (MYTHREAD == 0) for (i=0; i<threads; i++) printf("%i: a = %i, b = %i, c = %i\n", i, a[i], b[i], c[i]); } return 0;

Sammanfattning Idag är det MPI som gäller för HPC Vissa metoder kan ses som lågt hängande frukt För ordentlig skalbarhet krävs en hel del jobb MPI+C/Fortran OpenMP Parameterstudier Övrigt (inkl. PGAS)

Frågor?