2 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

Größe: px
Ab Seite anzeigen:

Download "2 SunHPC 2002, Einführung in OpenMP, Dieter an Mey"

Transkript

1 Parallele Programmierung für Shared-Memory Memory-Rechner mit OpenMP Parallele Programmierung für Shared-Memory Memory-Rechner mit OpenMP Dieter an Mey Rechen- und Kommunikationszentrum der RWTH Aachen 21 Januar 2002 rzrwth-aachende wwwrzrwth-aachende [/hpc hpc] wwwrzrwth-aachende/ de/sw/prog/openmpopenmp Einleitung Automatische Parallelisierung Explizite Parallelisierung mit OpenMP Debugging mit Assure und TotalView Performance Tools GuideView, WorkShop Hybride Parallelisierung 1 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 2 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Mehrprozessorsystem mit Shared Memory Uniform Memory Access (UMA) SMP-Compute Server mit OpenMP Cache Proc Memory (interleaved) Crossbar / Bus Cache Proc Cache Proc Cache Proc sunc00 sunc15 - Sun Fire 6800 SMP-Cluster Cluster, 24 Prozessoren, US-III, 750/900 MHz (UMA) 1H2002: sunc16 sunc19 - Sun Fire 15K SMP-Cluster Cluster, 72 Prozessoren, US-III, 900 MHz (ccnuma( ccnuma) hpc4 - HP V-ClassV Class,, 16 Prozessoren, PA 8200, 240 MHz (UMA) hpc6 - HP J-ClassJ Class,, 4 Prozessoren, PA 8500, 440 MHz (UMA) sgic3 - SGI Origin 200, 4 Prozessoren, MIPS R10000, 180 MHz (ccnuma( ccnuma) sgic5 - SGI Origin 200, 2 Prozessoren, MIPS R10000, 180 MHz (UMA) hpcline - SMP-Cluster aus 16 PIII, 800 MHz Doppelprozessoren linuxcxx- PIII Doppelprozessoren unterschiedlicher Taktung 3 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 4 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Was heißt Shared-Memory Memory-Parallelisierung? Und was nun? Prozessoren do i = 1, 25 do i = 26, 50 do i = 51, 75 do i = 76, 100 Speicher A(1) A(100) B(1) B(100) C(1) C(100) Prozessoren Arbeitsteilung (worksharing) do i = 1, 25 do i = 26, 50 do i = 51, 75 do i = 76, 100 Speicher S A(1) A(100) Alle Prozessoren wollen gleichzeitig S lesen und schreiben! 5 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 6 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

2 Parallele Programmierung für Shared-Memory Memory-Rechner mit OpenMP Automatische Parallelisierung Explizite Parallelisierung mit OpenMP Debugging mit Assure und TotalView Performance Tools GuideView, WorkShop Hybride Parallelisierung Automatische Parallelisierung Sun (Forte Developer 6 U2 = WorkShop 6 U2) Übersetzen und Binden f90 / f95 / f77 -autopar abkürzend für -xautopar depend xo3 bzw cc -xautopar xdepend xo4 Parallelisierung von Reduktionen unter Zulassen der Vertauschung der arithmetischen Reihenfolge durch -reduction bzw -xreduction Ausgabe von Compilerinformationen zur Parallelisierung: -loopinfo bzw -xloopinfo Angabe der Prozessorzahl bei Ausführung export OMP_NUM_THREADS=n 7 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 8 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Automatische Parallelisierung Linux (PGI-Compiler) Übersetzen und Binden pgf90 / pgf77 / pgcc / pgcc -O2 -Mconcur[=option,option,] Unbedingte parallele Ausführung oder in Abhängigkeit von der Schleifendurchlaufzahl (alternate coding) -Mconcur=altcode:n -Mconcur= noaltcode Verteilung der Schleifenindizes auf die Prozessoren -Mconcur=dist:block -Mconcur=dist: cyclic Keine Vertauschung der arithmetischen Reihenfolge (Reduktionen!) -Mconcur=noassoc Ausgabe von Compilerinformationen: -Minfo -Mneginfo=concur Angabe der Prozessorzahl bei Ausführung export NCPUS=n Steuerung der Parallelisierung durch Direktiven!PGI$<scope> NODEPCHK #pragma <scope> nodepchk scope: g r l scope: global routine loop Automatische Parallelisierung HP Übersetzen und Binden f90 / c89 / acc +DA20 +DS20 +Odataprefetch +O3 +O[no]parallel Unbedingte parallele Ausführung oder in Abhängigkeit von der Schleifendurchlaufzahl +O[no]dynsel Schalten der Automatischen Parallelisierung +O[no]autopar Keine Vertauschung der arithmetischen Reihenfolge (Reduktionen!) +Ofltacc Ausgabe von Compilerinformationen: +O[no]info +O[no]report Angabe der Prozessorzahl bei Ausführung export MP_NUMBER_OF_THREADS=n ( MLIB_NUMBER_OF_THREADS bei Verwendung der MathLIBrary) Steuerung der Parallelisierung durch Direktiven!$DIR PREFER_PARALLEL #pragma _CNX prefer_parallel!$dir NO_LOOP_DEPENDENCE[(arraylist)] 9 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 10 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Automatische Parallelisierung SGI (MIPSpro( MIPSpro-Compiler) Übersetzen und Binden f90 / f77 / cc / CC -n32 -mips4 -O3 -apo -mp Verteilung der Schleifenindizes auf die Prozessoren -mp_schedtype=dynamic GSS INTERLEAVE RUNTIME SIMPLE Ausgabe von mit OpenMP-Direktiven angereichertem Programm: -apo -mp list Angabe der Prozessorzahl bei Ausführung export OMP_NUM_THREADS=n Steuerung der Parallelisierung durch Direktiven!*$*ASSERT DO (CONCURRENT) #pragma prefer concurrent manual pages pe_environ environ Automatische Parallelisierung Visual KAP for OpenMP (NT) Präprozesor /kai/vkomp36/bin/vkapompexe -WKkeep -WKonly -WK,-fuse -WK, -fuselevel=1 -WK,-noarclimit -WK,-conc -WK,-so=0 -WK,-o=3 -WK,-r=3 -WK,-noparallelrtl -WKonly -WK,-heap=64 -WK,-nointl -WK,-suppress=w -WK,-lo=lkopst -WK,-mc=0 simpeqf Steuerung der Parallelisierung durch Direktiven!*$*concurrentize 11 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 12 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

3 Auto-parallelization, gererating OpenMP directives Visual KAP for OpenMP (NT) Fortran90 Präprozessor no unrolling Bedingungen für die automatische Parallelisierung (Sun) Kandidaten für die Parallelisierung: Explizite DO-Schleifen oder implizite Schleifen (IF-Schleifen, Feldsyntax) Bedingungen für die Parallelisierung (Auswahl): Es dürfen in einer Iteration keine Feldkomponenten geändert werden, die in einer anderen Iteration benötigt (gelesen oder geschrieben) werden (Auch nicht in Unterprogrammen, die in der Schleife gerufen werden) Es dürfen keine skalaren Variablen geändert werden, die nach der Schleife noch gelesen werden Es dürfen in einer Iteration keine skalaren Variablen geändert werden, die in einer anderen Iteration benötigt (gelesen oder geschrieben) werden Der Overhead der Parallelisierung darf im Vergleich zur Rechenarbeit in der Schleife nicht zu hoch sein 13 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 14 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Problemfälle der (automatischen) Parallelisierung do i = ilow, ihigh! Abhängigkeit der Feldelemente von A a(i) = a(i+k) + b(i)! zwischen verschiedenen Iterationen! (Bei positivem k ist Vektorisierung möglich) do i = 1, n a(ind(i)) = b(i)! Ist nur dann parallelisierbar, wenn alle! ind(1:n) paarweise verschieden sind t = x do i = 1, n! Die skalare Variable t wird in einer a(i) = t + b(i)! Iteration geschrieben und in t = c(i)! einer anderen (der folgenden) gelesen y = t! Die skalare Variable t wird nach der Schleife gelesen Parallele Programmierung für Shared-Memory Memory-Rechner mit OpenMP Automatische Parallelisierung Explizite Parallelisierung mit OpenMP Debugging mit Assure und TotalView Performance Tools GuideView, PerView, CXperf,, Puma Hybride Parallelisierung 15 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 16 SunHPC 2002, Einführung in OpenMP, Dieter an Mey OpenMP - Gliederung Einleitung: Geschichte, Compiler, OpenMP-Struktur Einführung in OpenMP Format der Direktiven Laufzeitfunktionen Parallele Regionen Arbeitsteilung (worksharing) Verwaisen (orphaning) Daten-Geltungsbereiche (data scope) Synchronisation Überblick über alle Kompontenten von OpenMP Ein Beispiel (Berechnung von Pi) Strategien, Performance Klassifizierung von Variablen Parallelisierung auf Schleifenebene Grobgranulare Arbeitsteilung SPMD OpenMP versus MPI Anwendungsbeispiele Jacobi, Panta OpenMP - Geschichte wwwopenmporg wwwcompunityorg 1997: OpenMP Version 10 für Fortran Standard für die Shared-Memory Memory-Programmierung inzwischen für alle namhaften SMP-Rechner verfügbar löst im techn-wiss Rechnen die proprietären Direktiven und die unmittelbare Verwendung der [p]threads ab 1998: OpenMP V10 für C und C : OpenMP V11 für Fortran (Fehler korrigiert, Erläuterungen eingearbeitet) 2000: OpenMP V20 für Fortran (Unterstützung von Fortran90-Modules) 2001: OpenMP V20 für C und C++ Draft 17 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 18 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

4 Compiler für OpenMP SUN: f77 / f90 / f95 openmp [ -R/ R/usr/lib/lwp lwp ] cc xopenmp [ -R/ R/usr/lib/lwplwp ] guidef77 / guidef90 / guidecc / guidec++ Linux: pgf77 / pgf90 / pgcc / pgcc mp guidecc / guidec++ HP: f90 openmp guidef77 / guidef90 / guidecc / guidec++ SGI: f77 / f90 / cc / CC mp Die Komponenten von OpenMP (Fortran) Umgebungsvariable, Direktiven, Laufzeitbibliothek #!/bin/ksh # Shell-Script f90 openmp testf90 export OMP_NUM_THREADS=4 aout! Source file testf90 program main integer omp_get_thread_num print *, 'me: ', omp_get_thread_num() end program Umgebungsvariable Direktiven (besondere Kommentarzeilen) Laufzeitbibliothek me: 0 me: 3 me: 2 me: 1 19 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 20 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Die Komponenten von OpenMP (C) Umgebungsvariable, Direktiven, Laufzeitbibliothek #!/bin/csh # Shell-Script cc xopenmp testf90 setenv OMP_NUM_THREADS 4 aout /* Source file testc */ #include <stdioh> #include <omph> Umgebungsvariable int main(void) #pragma omp parallel printf("me: %d\n",omp_get_thread_num()); Direktiven (besondere Kommentarzeilen) Laufzeitbibliothek me: 0 me: 3 me: 2 me: 1 Die Komponenten von OpenMP - schematisch Shell Umgebungsvariablen Nutzer Direktiven OpenMP-Laufzeitsystem Betriebsystem - Threads OpenMP-Programm Laufzeitfunktionen 21 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 22 SunHPC 2002, Einführung in OpenMP, Dieter an Mey OpenMP - Gliederung Einleitung: Geschichte, Compiler, OpenMP-Struktur Einführung in OpenMP Format der Direktiven Laufzeitfunktionen Parallele Regionen Arbeitsteilung (worksharing( worksharing) Verwaisen (orphaning( orphaning) Daten-Geltungsbereiche (data( scope) Synchronisation Überblick über alle Kompontenten von OpenMP Ein Beispiel (Berechnung von Pi) Strategien, Performance Klassifizierung von Variablen Parallelisierung auf Schleifenebene Grobgranulare Arbeitsteilung SPMD OpenMP versus MPI Anwendungsbeispiele Jacobi, Panta Format der Direktiven Fortran77: C*** OpenMP-Direktive C$OMP directive [clause[[,] clause ] ] **** OpenMP-Direktive *$OMP directive [clause[[,] clause ] ] C*** OpenMP-Direktive mit Fortsetzungzeile C$OMP directive clause clause C$OMP+clause Fortran90:!*** OpenMP-Direktive!$OMP directive [clause[,]]!*** OpenMP-Direktive mit Fortsetzungzeile!$OMP directive clause clause!$omp clause C: /*** OpenMP-Direktive */ #pragma omp directive [clause ]!*** OpenMP-Direktive mit Fortsetzungzeile #pragma omp directive clause \ clause 23 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 24 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

5 Äquivalent: Verschiedenes Bedingte Übersetzung C C$ wird ersetzt durch 2 Blanks C$ 10 IAM = OMP_GET_THREAD_NUM()+ C$ INDEX #ifdef _OPENMP 10 IAM = OMP_GET_THREAD_NUM()+ INDEX #endif!$ wird ersetzt durch 2 Blanks!$ IAM = OMP_GET_THREAD_NUM()+!$ INDEX 25 SunHPC 2002, Einführung in OpenMP, Dieter an Mey #ifdef _OPENMP iam=omp_get_thread_num()+index; #endif program simple implicit integer (a-z) logical omp_in_parallel Serielle Laufzeitfunktionen export OMP_NUM_THREADS=3 write (*,*) "inside parallel region? ", omp_in_parallel() write (*,*) "number of available processors ", omp_get_num_procs() Region write (*,*) "maximum number of threads ", omp_get_max_threads() call omp_set_num_threads ( max(1,omp_get_max_threads()-1) ) Parallele write (*,*) "inside parallel region? ", omp_in_parallel() write (*,*) "number of threads in the team ", omp_get_num_threads() Region write (*,*) "my thread id ", omp_get_thread_num() end program inside parallel region? F number of available processors 16 maximum number of threads 3 Redundante Ausführung! inside parallel region? T number of threads in the team 2 my thread id 0 inside parallel region? T number of threads in the team 2 my thread id 1 26 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Serielle Region Parallele Region Serielle Region Parallele Region Serielle Region Parallele Region Serielle Region Parallele Regionen (1) program simple implicit integer (a-z) write (*,*) Region A: ", omp_get_thread_num() export OMP_NUM_THREADS=4 write (*,*) Region B: ", omp_get_thread_num() write (*,*) Region C: ", omp_get_thread_num() call omp_set_num_threads(2) write (*,*) Region D: ", omp_get_thread_num() write (*,*) Region E: ", omp_get_thread_num() num_threads(3) write (*,*) Region F: ", omp_get_thread_num() write (*,*) Region G: ", omp_get_thread_num() end program Region A: 0 Region B: 0 Region B: 3 Region B: 1 Region B: 2 Region C: 0 Region D: 1 Region D: 0 Region E: 0 Region F: 2 Region F: 0 Region F: 1 Region G: 0 Master Thread Slave Threads Slave Threads Slave Threads Parallele Region Serielle Region Parallele Regionen (2) Das OpenMP-Program Program beginnt wie ein serielles : single threaded Region A: 0 Am Anfang der Parallelen Region B: 0 Region Region B: 3 werden die Slave Region B: 1 Threads gestartet Sie bilden Region B: 2 mit dem Master ein Team Region C: 0 Region D: 1 Region D: 0 Zwischen den Parallelen Regionen schlafen die Slave Region E: 0 Threads Region F: 2 Region F: 0 Region F: 1 Region G: 0 27 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 28 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Parallele Regionen (3) - Sun Arbeitsteilung (1) - Prinzip Master Thread Slave Threads Slave Threads Slave Threads Parallele Region Serielle Region Zwischen den Parallelen Regionen schlafen die Slave Threads Die Tiefe des Schlafes kann durch die Umgebungsvariable SUMW_MP_THR_IDLE beeinflusst werden: SUMW_MP_THR_IDLE=spin (default) busy waiting die schlafenden Threads geben ihre CPU nicht ab SUMW_MP_THR_IDLE=sleep idle waiting die schlafenden Threads geben ihre CPU nicht ab SUMW_MP_THR_IDLE=ns s (Sekunden) SUMW_MP_THR_IDLE=nms (Millisekunden) Kompromiss die schlafenden Threads geben ihre CPU nach einer gewissen Zeit ab Prozessoren do i = 1, 25 Arbeitsteilung (worksharing) do i = 26, 50 do i = 51, 75 do i = 76, 100 Speicher A(1) A(100) B(1) B(100) C(1) C(100) 29 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 30 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

6 Arbeitsteilung (2) mit omp_get get_thread_num C Fortran77 C$omp parallel if ( omp_get_thread_num() == 0 ) do i = 1, 25! Fortran 90 else if ( omp_get_thread_num() == 1 ) select case ( omp_get_thread_num() ) do i = 26, 50 case ( 0 ) a(1:25) = b(1:25) + c(1:25) case (1) else if ( omp_get_thread_num() == 2 ) a(26:50) = b(26:50) + c(26:50) do i = 51, 75 case(2) a(51:75) = b(51:75) + c(51:75) case (3) else if ( omp_get_thread_num() == 3 ) a(76:100) = b(76:100) + c(76:100) do i = 76, 100 end select end if C$omp end parallel 31 SunHPC 2002, Einführung in OpenMP, Dieter an Mey C Fortran77 C$omp parallel C$omp sections C$omp section do i = 1, 25 Die end Kurzschreibweise do ist C$omp nur möglich, section wenn in der Parallelen do i = 26, Region 50 nur das Parallel a(i) = b(i) Sections + c(i) Worksharing Construct C$omp section enthalten ist Arbeitsteilung (3) parallel sections /* C, verkürzte Schreibweise */ #pragma omp parallel sections for ( i=1; i<25; i++ ) a[i] = b[i] + c[i] ; #pragma omp section for ( i=26; i<50; i++ ) a[i] = b[i] + c[i] ; #pragma omp section for ( i=51; i<75; i++ ) a[i] = b[i] + c[i] ; #pragma omp section for ( i=76; i<100; i++ ) a[i] = b[i] + c[i] ; #pragma omp end parallel sections! Fortran 90, verkürzte Schreibweise sections a(1:25) = b(1:25) + c(1:25)!$omp section a(26:50) = b(26:50) + c(26:50)!$omp section a(51:75) = b(51:75) + c(51:75)!$omp section a(76:100) = b(76:100) + c(76:100) do i = 51, 75 C$omp section do i = 76, 100 C$omp end sections C$omp end parallel sections 32 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Arbeitsteilung (4) parallel do Arbeitsteilung (5) parallel workshare C Fortran77 C$omp parallel C$omp do C$omp C$omp end Die parallel Kurzschreibweise ist nur möglich, wenn in der /* C */ Parallelen Region nur das #pragma omp parallel Parallel Sections Do Worksharing Construct #pragma omp enthalten for ist for ( i=1; i<100; i++ ) a[i] = b[i] + c[i] ;! Fortran90, verkürzte Schreibweise do /* C, verkürzte Schreibweise */ #pragma omp parallel for for ( i=1; i<100; i++ ) a[i] = b[i] + c[i] ;! Nur in Fortran90!$omp workshare a(1:100) = b(1:100) + c(1:100) d(2:99) = a(1:98) + a(3:100)!$omp end workshare neu in OpenMP V20 Achtung: versteckte Barrieren! Nur in Fortran90, Kurzschreibweise workshare a(1:100) = b(1:100) + c(1:100) d(2:99) = a(1:98) + a(3:100) workshare 33 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 34 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Arbeitsteilung (6) single Verwaisen orphaning print *, nur einer #pragma omp parallel #pragma omp single printf nur einer\n ; call work ( 100, a, b, c ) call work ( 100, a, b, c ) subroutine work ( n, a, b, c ) real a(n), b(n), c(n)!$omp return end subroutine work Statischer Bereich der Parallelen Region (static/lexical extent) Die Direktiven, die zu einer Parallelen Region gehören, müssen nicht in ein und dynamischer Bereich demselben Programmmodul der Parallelen Region stehen (dynamic extent) Wird hier das Unterprogramm in der Parallelen Region aufgerufen, so wirkt das Verwaiste worksharing-konstrukt, (orphaned) anderenfalls wird es ignoriert Direktive 35 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 36 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

7 Geltungsbereich der Variablen (0) Intro Geltungsbereich der Variablen (1) data scope global local shared Gültig für alle Threads und in allen Modulen Gültig für alle Threads aber lokal im jeweiligen Modul private Privat für alle Threads aber gültig in allen Modulen Privat für alle Threads und gültig im jeweiligen Modulen do!$omp default(none) private(i) shared(a,b,c) do #pragma omp parallel for \ default(none) private(i) shared(a,b,c) for ( i=1; i<100; i++ ) a[i] = b[i] + c[i] ; Normalerweise sind alle Variablen (im statischen Bereich der Parallelen Region) von allen Threads gleichermaßen zugänglich, sie sind shared Eine Ausnahme bilden die Laufindizes der parallelisierten Schleifen, sie sind standardmäßig private Die Voreinstellung kann geändert werden durch: default (shared private none) Die default-klausel wirkt nur auf die Variablen des Statischen Bereiches! 37 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 38 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Geltungsbereich der Variablen (2) defaults Das Shared-Memory-Programmiermodell: Normalerweise sind alle Variablen shared Globale Variablen sind shared: Fortran: common-blöcke Fortran: Variable mit dem save-attribute Fortran: Modul-Variable falls sie nicht als threadprivate vereinbart sind C: Variable, deren Geltungsbereich sich auf die ganze Quelldatei erstreckt C: Variable mit dem static oder extern Attribut Ausnahme: Die Schleifenindizes von parallelisierten Zählschleifen sind private ACHTUNG: Variablen in Unterprogrammen, die in einer Parallelen Region gerufen werden, und auf dem Stack abgelegt werden (Normalfall!) sind private Variablen in Unterprogrammen, die in einer Parallelen Region gerufen werden und das save-attribut (C: static) haben oder initialisiert werden, sind shared Geltungsbereich der Variablen (3) defaults program main integer n common / comblk / n double precision pi do call calc_pi ( pi ) end program Main shared subroutine calc_pi ( pi ) integer :: i, n common / comblk / n double precision, save :: sum, h double precision :: a,x,f, pi pi = private return end subroutine calc_pi 39 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 40 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Geltungsbereich der Variablen (4) private #include <stdioh> #include <omph> int main(void) int i; i = 42; eine nicht initialisierte Kopie wird für jeden Thread angelegt printf( before parallel region: i=%d\n", i); # pragma omp parallel private(i) printf("(%d): i=%d\n",omp_get_thread_num(),i); i += omp_get_thread_num(); printf("(%d): i:%d\n",omp_get_thread_num(),i); printf( undefined after parallel region: i=%d\n", i); Output: before PR: i=42 (1): i=0 (3): i=0 (1): i: 1 (2): i=0 (3): i: 3 (0): i=0 (0): i: 0 (2): i: 2 after PR: i=42 Geltungsbereich der Variablen (5) firstprivate #include <stdioh> #include <omph> int main(void) int i; i = 42; printf( before parallel region: i=%d\n", i); # pragma omp parallel firstprivate(i) Die private Kopie wird mit dem Originalwert initialisiert printf("(%d): i=%d\n",omp_get_thread_num(),i); i += omp_get_thread_num(); printf("(%d): i:%d\n",omp_get_thread_num(),i); printf( after parallel region: i=%d\n", i); Output: before PR: i=42 (1): i=42 (3): i=42 (1): i: 43 (2): i=42 (3): i: 45 (0): i=42 (0): i: 42 (2): i: 44 after PR: i=42 return 1; Laut Standard ist i nach der PR undefined!!! return 1; Laut Standard ist i nach der PR undefined!!! 41 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 42 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

8 Lastprivate - Beispiel default(none) shared(a,b,c) lastprivate(i)!$omp print *, i! 101 i erhält den Wert des letzten (seriellen) Schleifendurchlaufs Geltungsbereich der Variablen (5) threadprivate #include <stdioh> #include <omph> int t_private; #pragma omp threadprivate(t_private) void foo(void) printf("(foo) thread(%d): t_private=%d\n", omp_get_thread_num(),t_private); main() int priv; #pragma omp parallel t_private = omp_get_thread_num(); foo(); Output: (foo) thread(0): t_private=0 (foo) thread(3): t_private=3 (foo) thread(2): t_private=2 (foo) thread(1): t_private=1 Globale Daten werden durch die threadprivate-direktive privatisiert Sie können durch die copyin-klausel initialisiert werden 43 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 44 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Geltungsbereich der Variablen (6) Übersicht Kritische Region (1) global local (static extend) local (dynamic extend) shared F: common F: module + use C: file scope default shared-klausel F: save C: static, extern C: heap (malloc, new) der Pointer kann auch private sein private Die Verwaltung des Heap muss synchronisiert F: common werden + threadprivate Das F: häufige module Anlegen + use + von threadprivate dynamischen Variablen C: file mit scope malloc/new + threadprivate kann daher zu Performance-Einbußen führen Verbesserung durch binden mit private-klausel cc xopenmp -lmtalloc default (f90 stackvar ) C: automatic variables Prozessoren Arbeitsteilung (worksharing) do i = 1, 25 do i = 26, 50 do i = 51, 75 do i = 76, 100 Speicher S A(1) A(100) Alle Prozessoren wollen gleichzeitig S lesen und schreiben! 45 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 46 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Kritische Region (2) Kritische Region (3) critical / end critical Prozessoren Arbeitsteilung (worksharing) do i = 1, 25 do i = 26, 50 do i = 51, 75 do i = 76, 100 Speicher S A(1) A(100) Zu einer Zeit darf nur ein Prozessor die kritische Region betreten => Performance? do private(i)!$omp critical!$omp end critical do #pragma omp parallel for private(i) for ( i=1; i<100; i++ ) #pragma omp critical s += a[i]; Die Kritischen Regionen dürfen zu einer Zeit nur von einem Thread ausgeführt werden Da hier die Schleifenkörper nur noch aus der kritischen Region bestehen, wird das Programm drastisch langsamer 47 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 48 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

9 Prozessoren Die Kritische Arbeitsteilung Region wird (worksharing) aus der Schleife herausgezogen => Performance? Kritische Region (4) do i = 1, 25 s1 = s1 + a(i) s = s + s1 do i = 26, 50 s2 = s2 + a(i) s = s + s2 do i = 51, 75 s3 = s3 + a(i) s = s + s3 do i = 76, 100 s4 = s4 + a(i) s = s + s4 49 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Speicher S A(1) A(100) S1 S3 S2 S4 Kritische Region (5) critical / end critical private(i,s_local) s_local = 00 s_local = s_local + a(i)!$omp!$omp critical s = s + s_local!$omp end critical #pragma omp parallel private(i,s_local) s_local = 00; #pragma omp for for ( i=1; i<100; i++ ) s_local += a[i]; #pragma omp critical s += s_local; 50 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Jetzt werden die Teilsummen parallel berechnet Die Kritischen Regionen wird nur noch einmal von jedem Thread durchlaufen Kritische Region (6) named critical region private(i,s_local) s_local = 00 s_local = s_local + a(i)!$omp!$omp critical (sum) s = s + s_local!$omp end critical (sum) #pragma omp parallel private(i,s_local) s_local = 00; #pragma omp for for ( i=1; i<100; i++ ) s_local += a[i]; #pragma omp critical (sum) s += s_local; 51 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Kritische Regionen können benannt werden Das ist dann von Vorteil, wenn in einer Parallelen Region mehrere Kritische Regionen auftreten Der Namen ist eine globale Größe Kritische Region (7) atomic private(i,s_local) s_local = 00 s_local = s_local + a(i)!$omp!$omp atomic s = s + s_local #pragma omp parallel for private(i,s_local) s_local = 00; #pragma omp for for ( i=1; i<100; i++ ) s_local += a[i]; #pragma omp atomic s += s_local; 52 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Wenn die Kritischen Region nur aus einem Statement mit einfacher Struktur besteht var = var op expression oder var = intrinsic ( var,expression ) bzw var binop= expression; oder var++; var--; ++var;--var so kann ist die atomic-direktive verwendet werden, die auf schnelle Hardware-Mechanismen abgebildet werden kann Reduktionen reduction clause Reduktionen unterschiedliche Rundungsfehler do private(i) reduction(+:s) do #pragma omp parallel for private(i) \ reduction(+:s) for ( i=1; i<100; i++ ) s += a[i]; Genau für diesen häufig auftretenden Fall gibt es die Reduktionsklausel reduction(op intrinsic:list) mit op = + * - and or eqv neqv oder intrinsic = max, min, iand, ior, ieor bzw op = + * - ^ list ist eine Komma-separierte Liste von Variablen Bei der Parallelisierung von solchen do reduction(+:s) Rekursionen ist mit einer Änderung des Rundungsfehlerverhaltens zu * b(i) / c(i) rechnen do Unterschiedliche Rundungsfehler: seriell seriell (verschiedene Compileroptionen) seriell parallel (OpenMP oder Autoparallel) parallel parallel (aufeinanderfolgende Rechenläufe) parallel parallel (Unterschiedliche Prozessorzahl) Abhilfe: Reduzierung der seriellen Optimierung: -fsimple=0 -xnolibmopt Partielle Parallelisierung Autoparallelisierung mit noreduction do tmp(i) = a(i) * b(i) / c(i) do s = s + tmp(i) 53 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 54 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

10 Synchronisation barrier Synchronisation master Jeder Thread wartet an der Barriere, bis alle Threads des Teams diese Barriere erreicht haben print *, bin schon da \n ;!$omp barrier print *, gemeinsam geht s weiter ; #pragma omp parallel printf bin schon da \n ; #pragma omp barrier printf gemeinsam geht s weiter\n ; Folgende Konstrukte haben eine implizite Barriere, falls diese nicht durch eine nowait Klausel abgeschaltet wird: end parallel end sections end single end workshare Nur der Master-Thread führt diese Programmsegment durch, alle anderen überspringen es!$omp master print *, nur der Meister! ;!$omp end master if ( omp_get_thread_num() == 0 ) print *, so geht s auch der Meister! ; #pragma omp parallel #pragma omp master printf nur der Meister!\n ; Im Gegensatz zur single-direktive: Keine implizite Barriere am Ende! 55 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 56 SunHPC 2002, Einführung in OpenMP, Dieter an Mey schedule(static) a(i) =!$omp nowait schedule(static) b(i) = a(i) **2!$omp nowait Synchronisation nowait Mit der nowait-klausel können überflüssige Barrieren eingespart werden Barrieren sind die wesentlichen Bremsen, die den Speedup reduzieren ACHTUNG: bei schedule(dynamic) kann es schief gehen! Synchonisation - ordered program main implicit integer (a-z) do i = 1, omp_get_num_threads()!$omp me: 0 i: 1 me: 3 i: 4 me: 2 i: 3 print *, 'me: ', omp_get_thread_num(), ' i: ', i me: 1 i: 2 me: 1 i: 1 me: 0 i: 2 print *, 'me: ', omp_get_thread_num(), ' i: ', i me: 2 i: 3 me: 3 i: 4 ordered do i = 1, omp_get_num_threads()!$omp ordered!$omp end ordered!$omp end 57 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 58 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Synchronisation - flush!$omp flush [(list)] Die flush-direktive sorgt dafür, dass alle Speicheroperationen [ bzgl der angegebenen Liste der Variablen ] abgeschlossen werden, und anschließend bei Bedarf wieder aus dem Speicher geladen werden Betroffen sind shared Variablen Folgende Konstrukte implizieren eine flush-direktive: barrier critical und end critical ABER: Kein implizites flush bei do end sections master und end master end single sections end workshare single ordered und end ordered workshare parallel und end parallel end do sections single nowait Geordnete Ausgabe ohne ordered-klausel - flush program ordered integer me, ticket, omp_get_thread_num!$omp parallel private(me) shared(ticket) me = omp_get_thread_num()!$omp single ticket = 0!$OMP end single do while ( ticket < me ) Warteschleife!$OMP flush(ticket) call work(me)! do ordered work here ticket = ticket + 1!$OMP flush(ticket) write (*,*) me!$omp end parallel end program flush 59 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 60 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

11 OpenMP - Gliederung Einleitung: Geschichte, Compiler, OpenMP-Struktur Einführung in OpenMP Format der Direktiven Laufzeitfunktionen Parallele Regionen Arbeitsteilung (worksharing( worksharing) Verwaisen (orphaning( orphaning) Daten-Geltungsbereiche (data( scope) Synchronisation Überblick über alle Kompontenten von OpenMP Ein Beispiel (Berechnung von Pi) Strategien, Performance Klassifizierung von Variablen Parallelisierung auf Schleifenebene Grobgranulare Arbeitsteilung SPMD OpenMP versus MPI Anwendungsbeispiele Jacobi, Panta 61 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Binding Conditional Compilation Control Constructs Parallel Region Work Sharing Do Sections Single Directives Schedule Ordered OpenMP Nesting Data Constructs ThreadPrivate Data Scope Shared Private Reduction Copyin Default 62 Workshare SunHPC 2002, Einführung in OpenMP, Dieter an Mey Runtime Library Environment Variables Synchonization Constructs FirstPrivate LastPrivate Master Critical Barrier Atomic Ordered Flush Directives Environment Variables OMP_SCHEDULE OMP_NUM_THREADS OMP_DYNAMIC OMP_NESTED OMP_INIT_[NEST_]LOCK OMP_DESTROY_[NEST_]LOCK OpenMP Lock Functions Runtime Library OMP_[UN]SET_[NEST_]LOCK OMP_TEST_[NEST_]LOCK Environment Functions OMP_GET/SET_NUM_THREADS OMP_GET_MAX_THREADS OMP_GET_THREAD_NUM OMP_GET_NUM_PROCS OMP_IN_PARALLEL OMP_GET/SET_DYNAMIC OMP_GET/SET_NESTED Direktiven Parallel Region Construct [clause[[,] clause] ] block Parallele Ausführung des Programmsegmentes block Der (Master-) Thread, der auf die Parallele Region trifft, spaltet ein Team von (Slave-)Threads ab, die alle dasselbe Programmsegment ausführen mit clause aus private (list) shared (list) default ( private shared none ) firstprivate (list) reduction (op intrinsic:list) copyin (list) if ( logexp ) num_threads ( intexp ) Die Anzahl der Threads (Master + Slaves) wird durch die Umgebungsvariable OMP_NUM_THREADS oder durch die Laufzeitfunktion omp_set_num_threads oder durch die num_threads-klausel spezifiziert, es sei denn, dass dem Laufzeitsystem explizit die dynamische Steuerung der Threadzahl durch die Umgebungsvariable OMP_DYNAMIC oder die Laufzeitfunktion omp_set_dynamic überlassen wurde Wenn die if-klausel den Wert FALSE besitzt, so wird block seriell ausgeführt Die end parallel-direktive enthält implizit eine Barriere neu in OpenMP V20 63 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 64 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Direktiven Worksharing Constructs - do [clause[[,] clause] ] do_loop!$omp [nowait] mit clause aus private (list) firstprivate (list) lastprivate (list) reduction (op intrinsic:list) schedule (type[,chunk] ) ordered Die Ausführung der Zählschleife, die unmittelbar der do-direktive folgt wird auf die beteiligten Threads aufgeteilt, so wie durch die schedule-klausel angegeben Die ordered-klausel muss hinzugefügt werden, wenn innerhalb der Zählschleife eine ordered-direktive verwendet werden soll Die -Direktive enthält implizit eine Barriere, falls nicht die nowait-klausel hinzugefügt wird Direktiven Worksharing Constructs do - scheduling schedule (static[,chunk]) Die Iterationen werden gleichmäßig in Blöcken (chunks) der Größe chunk reihum auf die Threads aufgeteilt Wird chunk nicht angegeben, so ist die Blockgröße gleich der Anzahl der Iterationen dividiert durch die Anzahl der Threads schedule (dynamic [,chunk]) Die Iterationen werden in Blöcken (chunks) der Größe chunk auf die Threads aufgeteilt Der Thread, der seinen Block abgearbeitet hat, bekommt einen neuen zugewiesen Wird chunk nicht angegeben, so ist die Blockgröße gleich 1 schedule (guided [,chunk]) Die Iterationen werden in Blöcken (chunks) auf die Threads aufgeteilt, deren Größe exponentiell abnimmt Der Thread, der seinen Block abgearbeitet hat, bekommt einen neuen zugewiesen Mit chunk wird die minimale Blockgröße angegeben Wird chunk nicht angegeben, so ist die minimale Blockgröße gleich 1 schedule (runtime) Das Schleifen-Scheduling kann zur Laufzeit durch die Umgebungsvariable OMP_SCHEDULE festgelegt werden Die Voreinstellungen sind implementationsabhängig Meist ist schedule (static) voreingestellt 65 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 66 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

12 Direktiven Worksharing Constructs - sections Direktiven Worksharing Constructs - single!$omp sections [clause[[,] clause] ] [!$omp section] block [!$omp section block]!$omp end sections [nowait] mit clause aus private (list) firstprivate (list) lastprivate (list) reduction (op intrinsic:list) Die Ausführung der einzelnen Programmsegmente block, wird auf die Threads verteilt Die end sections-direktive enthält implizit eine Barriere, falls nicht die nowait-klausel hinzugefügt wird [clause[[,] clause] ] block [nowait] [copyprivate (list)] mit clause aus private (list) firstprivate (list) neu in OpenMP V20 Das Programmsegment block wird nur von einem Thread des Teams ausgeführt Die end single-direktive enthält implizit eine Barriere, falls nicht die nowait-klausel hinzugefügt wird Dort warten ggfls alle anderen Threads Mit der copyprivate-klausel können private Variablen an die anderen Threads weitergegeben werden (broadcast, zb nach einer Eingabe in block) copyprivate und nowait schließen einander aus 67 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 68 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Direktiven Worksharing Constructs - workshare Direktiven Besonderheiten von C / C++!$omp workshare block neu in OpenMP V20 (nur Fortran90)!$omp end workshare [nowait] Die Ausführung Fortran90-Feldzuweisungen, wird auf die beteiligten Threads aufgeteilt Zwischen den Statements werden uu implizite Barrieren eingefügt Die end workshare-direktive enthält implizit eine Barriere, falls nicht die nowait-klausel hinzugefügt wird #pragma omp parallel [clause[ clause] ] structured block #pragma omp for [clause[ clause] ] for-loop #pragma omp sections [clause[[,] clause] ] [#pragma omp section] structured block [#pragma omp section structured block ] Die default-klausel kann nur die Werte shared oder none enthalten Das for-statement muss einfach sein Der Verzicht auf die Barriere am Ende des for-work-sharing-konstruktes wird durch eine nowait-klausel bei dem for-pragma spezifiziert Der Verzicht auf die Barriere am Ende des sections-work-sharing-konstruktes wird durch eine nowait-klausel bei dem sections-pragma spezifiziert 69 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 70 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Direktiven Kombinierte Parallel Work-sharing Constructs do [clause[[,] clause] ] do_loop do sections [clause[[,] clause] ] [!$omp section] block [!$omp section block] sections Abkürzende Schreibweisen für Parallele Regionen, die nur ein Work-sharing-Konstrukt beinhalten Es können alle die Klauseln verwendet werden, die zu der parallel-direktive oder zu dem Work-sharing-Konstrukt gehören workshare [clause[[,] clause] ] block neu in OpenMP V20 (Fortran90) workshare Direktiven Synchronization Constructs!$omp master block!$omp end master!$omp critical [(name)] block!$omp end critical [(name)] Das Programmsegment block wird nur vom Master-Thread ausgeführt Das Konstrukt enthält keine implizite Barriere! Kritische Bereiche (block) mit gleichem Namen werden zu einer Zeit nur von einem Thread des Teams ausgeführt Das Konstrukt enthält keine implizite Barriere! Die Barriere synchronisiert alle Threads eines Teams Jeder Thread wartet, bis alle anderen Threads des Teams diesen Punkt erreicht haben!$omp barrier Die atomic-direktive stellt sicher, dass eine Speicherzelle atomar, dh ungestört von anderen schreibenden Zugriffen geändert werden kann!$omp atomic Die (explizite oder implizite) flush-direktive sorgt dafür, dass alle Threads ein konsistentes Bild von allen oder einer Liste list von Variablen besitzen!$omp flush [(list)] Das Programmsegment block wird in der Reihenfolge ausgeführt, in der es im seriellen Fall ausgeführt würde Die zugehörge do-direktive muß!$omp ordered die ordered-klausel besitzen Es wird zu einer Zeit nur von einem block Thread des Teams durchlaufen!$omp end ordered 71 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 72 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

13 threadprivate (list) Direktiven Data Scope Die threadprivate-direktive privatisiert benannte common-blöcke oder Variablen, globalisiert sie aber innerhalb eines jeden Threads ( In C / C++: externe/globale Variable) Diese Direktive gehört überall dort in den Anweisungsteil wo auch die common-blöcke bzw die Variablen deklariert werden In den seriellen Regionen und den master-bereichen werden auf die common-blöcke bzw die Variablen des Master-Threads zugegriffen Am Anfang der ersten Parallelen Region, werden die als threadprivate vereinbarten Variablen bzw common-blöcke angelegt Werden sie in einer copyin-klausel einer parallel-direktive aufgeführt, so werden sie initialisiert mit dem Inhalt der entsprechenden Variablen bzw des entsprechenden common-blocks des Master-Threads Wird die Anzahl der Threads nicht dynamischen gesteuert, so bleiben Inhalte und Zustände zwischen Parallelen Regionen erhalten private (list) shared (list) default ( private shared none ) firstprivate (list) lastprivate (list) Klauseln Data Scope (1) Für jeden Thread werden neue private Objekte angelegt, deren Inhalte anfangs nicht definiert sind Die entsprechenden (shared) Objekte haben am Ende des Konstuktes keinen wohl definierten Wert Alle Threads greifen auf denselben Speicherbereich zu Aufgrund der Verwendung von Registern und Caches werden Änderungen durch einen Thread nicht sofort bei den anderen Threads wahrgenommen, es sei denn eine flush-direktive wird verwendet Die standardmäßige Voreinstellung des Datengeltungsbereiches auf shared kann verändert werden Wie mit der private-direktive werden private Objekte für jeden Thread erzeugt Diese werden zusätzlich mit dem Wert des entsprechenden ursprünglichen Objektes initialisiert Wie mit der private-direktive werden private Objekte für jeden Thread erzeugt Zusätzlich werd die Werte der seriell letzten Iteration bzw der lexikalisch letzten section auf die entsprechenden ursprünglichen Objekte übertragen 73 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 74 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Klauseln Data Scope (2) Klauseln Data Scope (3) reduction (op intrinsic:list) Es wird eine Reduktion mit dem Operator op intrinsic auf die Variablen in der Liste list ausgeführt ACHTUNG: Die Reihenfolge der Berechnungen ist zufällig, daher treten unterschiedliche Rundungsfehlereinflüsse auf! Die Variablen der Liste müssen im umgebenden Kontext shared sein Es wird dann eine private Kopie für die Zwischenergebnisse angelegt, die in Abhängigkeit von der gewählten Operation sinnvoll initialisiert wird Das Endergebnis der Reduktion steht erst nach der nächsten Barriere zur Verfügung (bei Verwendung von nowait) Fortran: op = + * - and or eqv neqv intrinsic = max, min, iand, ior, ieor C / C++: op = + * - ^ list ist eine Komma-separierte Liste von Variablen copyin (list) neu in OpenMP V20 : copyprivate (list) Variablen, common-blöcke oder Variablen in common-blöcken, die als threadprivate deklariert wurden, können am Anfang einer Parallelen Region initialisiert werden, in dem sie den Wert des entsprechenden Objektes des Master-Threads erhalten Mit dieser Klausel der end critical-direktive kann der Wert einer privaten Variablen an die anderen Threads übermittelt werden (broadcast) 75 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 76 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Laufzeitroutinen integer function omp_get_num_threads () subroutine omp_set_num_threads ( intexp ) integer function omp_get_max_threads () integer function omp_get_thread_num () integer function omp_get_num_procs () logical function omp_in_parallel () logical function omp_get_dynamic () subroutine omp_set_dynamic ( logexp ) logical function omp_get_nested () subroutine omp_set_nested ( logexp ) neu in OpenMP V20: double precision function omp_get_wtime () double precision function omp_get_wtick () Setzen / Abfragen der Threadanzahl Abfragen der maximalen Threadzahl Abfragen der aktuellen Threadzahl Abfragen der Anzahl der Prozessoren (HW) In einer Parallelen Region? Abfragen / Setzen des Dynamisches Schleifen-Schedulings Abfragen / Setzen der geschachtelten Parallelisierung Echtzeit in Sekunden Abstand zwischen zwei Ticks in Sekunden Laufzeitfunktionen - locks integer (kind=omp_lock_kind) :: svar subroutine omp_init_lock (svar) subroutine omp_destroy_lock (svar) subroutine omp_set_lock (svar) subroutine omp_unset_lock (svar) subroutine omp_test_lock (svar) neu im OpenMP Fortran API V20, im OpenMP C / C++ API V10 schon enthalten : integer (kind=omp_nest_lock_kind) :: nvar subroutine omp_init_nest_lock (nvar) subroutine omp_destroy_ nest_ lock (nvar) subroutine omp_set_ nest_ lock (nvar) subroutine omp_unset_ nest_ lock (nvar) subroutine omp_test_ nest_ lock (nvar) integer*4/*8 bei 32-/ 64-Bit Adressierung Anmelden Abmelden Setzen (ggfls nach Warten) Freigeben Testen und Setzen eines Locks mit dem Namen svar Nestable Locks können von einem Thread mehrfach gesperrt werden 77 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 78 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

14 Umgebungsvariablen OMP_SCHEDULE = static dynamic guided [,chunk] OMP_NUM_THREADS = int OMP_DYNAMIC = FALSE TRUE OMP_NESTED = FALSE TRUE Spezifizieren der Aufteilung der Schleifendurchläufe auf die Threads, falls in der do-direktive die Klausel schedule(runtime) angegeben wurde Spezifizieren der Anzahl der zu verwendenden Threads, falls diese nicht explizit durch die Laufzeitfunktion omp_set_num_threads oder die num_threads-klausel der parallel-direktive gesetzt wird Bei dynamischem Schleifen- Scheduling ist dies das Maximum der Threadzahl Default: Sun-Compiler: 1, Guide: max Ein-/Ausschalten der dynamischen Einstellung der Threadzahl durch das Laufzeitsystem im Abhängigkeit von der aktuellen Maschinenauslastung Default: Sun-Compiler: TRUE, Guide: FALSE Ein-/Ausschalten der geschachtelten (nested) Parallelisierung Parallele Regionen innerhalb von Parallelen Regionen werden durch die derzeitigen OpenMP-Compiler serialisiert OpenMP - Gliederung Einleitung: Geschichte, Compiler, OpenMP-Struktur Einführung in OpenMP Format der Direktiven Laufzeitfunktionen Parallele Regionen Arbeitsteilung (worksharing( worksharing) Verwaisen (orphaning( orphaning) Daten-Geltungsbereiche (data( scope) Synchronisation Überblick über alle Kompontenten von OpenMP Ein Beispiel (Berechnung von Pi) Strategien, Performance Klassifizierung von Variablen Parallelisierung auf Schleifenebene Grobgranulare Arbeitsteilung SPMD OpenMP versus MPI Anwendungsbeispiele Jacobi, Panta 79 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 80 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Problemstellung und C-ProgrammkernC Die Kreiszahl π kann berechnet werden als Integral: 1 π = f(x)dx, mit f(x) = 4 /(1 + x 2 ) 0 Dieses Integral kann numerisch mit einer Quadraturformel (Mittelpunktsregel) angenähert werden: n π 1/n f(x i ), mit x i = (i-½)/ n für i=1,,n i=1 double f(double x) return (double)40/(10+(x*x)); h = 10/(double)n; sum = 00; for(i=1;i<=n;i++) x = h*((double)i - 05); /* Stützstelle */ sum += f(x); pi = h*sum; Serielles Fortran90-Programm program main integer :: i,n double precision,parameter :: pi25dt= d0 double precision :: a,h,pi,sum,x double precision :: f f(a) = 4d0 / (1d0+a*a)! statement function do read (5,10001) n; if (n <= 0) exit h = 10d0 / n sum = 00d0 do i = 1, n x = h * (DBLE(i)-05d0) sum = sum + f(x) pi = h * sum write (6,10002) pi, ABS(pi-pi25dt) end program main 81 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 82 SunHPC 2002, Einführung in OpenMP, Dieter an Mey OpenMP-Programm Programm 1 Version in Fortran90 (Auszug) do read (5,10001) n if (n <= 0) exit allocate (fx(n),stat=ierror) h = 10d0 / n sum = 00d0 private(i,x) shared(h,fx) do i = 1,n x = h * (DBLE(i)-05d0) fx(i) = f(x)!$omp do i = 1,n sum = sum + fx(i) pi = h * sum write (6,10002) pi, ABS(pi-pi25dt) deallocate (fx) OpenMP-Programm Programm 2 Version in Fortran90 (Auszug) do read (5,10001) n if (n <= 0) exit sum = 00d0 private(i,x) do i = 1,n x = h * (DBLE(i)-05d0)!$omp critical sum = sum + f(x)!$omp end critical!$omp pi = h * sum write (6,10002) pi, ABS(pi-pi25dt) 83 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 84 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

15 OpenMP-Programm Programm 3 Version in Fortran90 double precision :: sum_local Thread 0 do read (5,10001) n Lese n (zb n=6) if (n <= 0) exit h = 10d0 / n sum = 00d0 sum=0 private(i,x,sum_local) sum_local = 00d0 do i = 1,n x = h * (DBLE(i)-05d0) sum_local = sum_local + f(x)!$omp!$omp critical sum = sum + sum_local!$omp end critical pi = h * sum write (6,10002) pi, ABS(pi-pi25dt) sum_local=0 i=1 sum_local+=f(x i ) i=2 sum_local+=f(x i ) warten sum+=sum_local pi = h*sum Drucke pi Thread 1 sum_local=0 i=3 sum_local+=f(x i ) i=4 sum_local+=f(x i ) sum+=sum_local Thread 2 sum_local=0 i=5 sum_local+=f(x i ) i=6 sum_local+=f(x i ) warten warten sum+=sum_local OpenMP-Programm Programm 4 Version in Fortran90 (Auszug) do read (5,10001) n if (n <= 0) exit h = 10d0 / n sum = 00d0 private(i,x) parallel reduction(+:sum) do private(i,x) reduction(+:sum) do i = 1,n x = h * (DBLE(i)-05d0) sum = sum + f(x)!$omp pi = h * sum write (6,10002) pi, ABS(pi-pi25dt) 85 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 86 SunHPC 2002, Einführung in OpenMP, Dieter an Mey OpenMP-Programm Programm 5 Version in Fortran90 (Auszug) private(i,x) do read (5,10001) n if (n <= 0) exit h = 10d0 / n! Wird redundant von jedem Thread ausgeführt sum = 00d0! Wird redundant von jedem Thread ausgeführt!$omp barrier! Wichtig, nicht vergessen reduction(+:sum) do i = 1,n x = h * (DBLE(i)-05d0) sum = sum + f(x)!$omp pi = h * sum write (6,10002) pi, ABS(pi-pi25dt) 87 SunHPC 2002, Einführung in OpenMP, Dieter an Mey OpenMP-Programm Programm 5 Version in C (Auszug) int main(int argc, char *argv[]) long, n, i; double h, pi, sum, x; # pragma omp parallel private (i,x) for (;;) # pragma omp single printf("enter the number of intervals:(0 quits)");scanf("%u",n); if (n==0) break; h = 10/(double)n; /* Wird redundant von jedem Thread ausgeführt */ sum = 00; /* Wird redundant von jedem Thread ausgeführt */ # pragma omp barrier /* Wichtig, nicht vergessen */ # pragma omp for reduction (+:sum) for(i=1;i<=n;i++) x = h*((double)i-05); sum += f(x); # pragma omp single pi = h*sum; printf(" ",pi,fabs(pi-pi)); 88 SunHPC 2002, Einführung in OpenMP, Dieter an Mey OpenMP-Programm Programm 6 Version in Fortran90 (Auszug) program main do!!$omp single write (6,10000) read (5,10001) n if (n <= 0) exit call calc_pi (n, pi) subroutine calc_pi (n, pi) integer, intent(in) :: n double precision, intent(out) :: pi double precision, save :: sum, h integer :: i double precision :: a,x,f f(a) = 4d0 / (1d0+a*a) h = 10d0 / n sum = 00d0 write (6,10002) pi, ABS(pi-pi25dt) reduction(+:sum) private(i,x) do i = 1,n x = h * (DBLE(i)-05d0) sum = sum + f(x) end program Main!$omp pi = h * sum OpenMP-Programm Programm 7 Version in Fortran90 (Auszug) program main do!!$omp single write (6,10000) read (5,10001) n if (n <= 0) exit call calc_pi (n, pi) subroutine calc_pi (n, pi) double precision, save :: sum, h integer :: omp_get_thread_num,omp_get_num_threads integer :: myid,numthreads double precision :: sum_local myid = omp_get_thread_num() numthreads = omp_get_num_threads() h = 10d0 / n sum = 00d0 do i = myid+1, n, numthreads write (6,10002) pi, ABS(pi-pi25dt) x = h * (DBLE(i)-05d0) end program Main sum_local = sum_local + f(x)!$omp critical sum = sum + sum_local!$omp end critical!$omp barrier pi = h * sum return end subroutine calc_pi return 89 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 90 SunHPC 2002, end Einführung subroutine OpenMP, calc_pi Dieter an Mey

16 // Read only and read/write subscript operators const T operator[](int i) const return data[i]; T operator[](int i) return data[i]; C++ - Beispiel #include <omph> Array operator=(const Array rhs) /* Assignment operator */ #define SIZE 10000! Analoges #pragma Fortran90 omp parallel Programm for template <typename T,int size> subroutinefor do_it (int i=0 ( repeat ; i<size ); i++) data[i]=rhs[i]; class Array private: T data[size]; public: return *this; integer, intent(in) :: repeat integer, ; parameter :: SIZE=10000 Array() /* Default constructor */ real*8, dimension(size) //-- Operators :: a=10,b=20,c=30,d=40,res=50 ~Array() /* Array destructor */ template <typename T,int size> Array(const T r) /* Regular constructor */ Array<T,size> operator+(const Array<T,size> a,const Array<T,s workshare #pragma omp parallel for Array<T,size> ret; for (int i=0 ; i<size ; i++) data[i]=r; do i = 0, repeat-1 #pragma omp parallel for res = a for * b (int i=0 c + ; di<size ; i++) ret[i] = a[i]+b[i]; Array(const Array rhs) /* Copy constructor end */ do return ret; #pragma omp parallel for for (int i=0 ; i<size ; i++) data[i]=rhs[i]; end subroutine void do_it(int repeat) Array<double,SIZE> a(10),b(20), c(30),d(40),res(50); for (int i=0; i<repeat; i++) res = a * b - c + d; OpenMP - Gliederung Einleitung: Geschichte, Compiler, OpenMP-Struktur Einführung in OpenMP Format der Direktiven Laufzeitfunktionen Parallele Regionen Arbeitsteilung (worksharing( worksharing) Verwaisen (orphaning( orphaning) Daten-Geltungsbereiche (data( scope) Synchronisation Überblick über alle Kompontenten von OpenMP Ein Beispiel (Berechnung von Pi) Vertiefung, Strategien, Performance Klassifizierung von Variablen Parallelisierung auf Schleifenebene Grobgranulare Arbeitsteilung SPMD OpenMP versus MPI Anwendungsbeispiele Jacobi, Panta 91 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 92 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Klassifizierung von Variablen (1) Beachte Zugriffsart: Variable wird nur gelesen => shared Variable wird zuerst gelesen und dann modifiziert => evtl reduction, firstprivate? Variable wird zuerst modifiziert und dann gelesen => evtl private Variable wird nur modifiziert => evtl lastprivate do do i = 1, n a(i) = b(i) * PI s = 00 do reduction(+:s) do i = 1, n print *, s do private(t) do i = 1, n t = a(i) + b(i) Mögliches Vorgehen: c(i) = t * t einfach Worksharing-Konstrukt einsetzen und mit Assure überprüfen diesen Vorgang wiederholen, bis Assure kein Problem mehr meldet einen möglichst kleinen Testfall aussuchen, der dennoch typisch ist Assure benötigt viel mehr Speicherplatz und Laufzeit! Klassifizierung von Variablen (2) Beachte Zugriffsart: Variable wird in der Parallelen Region modifiziert: Empfehlungen ohne Garantie! sie wird mit dem Index der parallelen Schleife indiziert => shared sie wird global, aber nur innerhalb der Parallelen Region benutzt => threadprivate sie wird nur temporär genutzt => private sie ist lokal in einem Unterprogramm (dynamic extend) mit dem save / static Attribut => threadprivate sonst per default => private (Sun: f90 stackvar / HP: f90 nosave ) im common-block/modul => threadprivate? Initialisierung mit copyin? anderenfalls Modifikationen in kritischen Regionen schützen Enthält ein common-block Variablen mit unterschiedlichen Eigenschaften, so muss er uu gespalten werden 93 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 94 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Welche Schleife soll parallelisiert werden? Was tun, bei mehreren parallelisierbaren Schleifen? Wähle die am weitesten außen stehende Schleife (gröbst mögliche Parallelität) Ignoriere dabei Schleifen über Zeitschritte oder Iterationen (Rekursivität) Ignoriere Schleifen mit nur wenigen Iterationen Ignoriere Schleifen die nur unwichtige Unterprogramme aufrufen Vorsicht bei der Parallelisierung von Schleifen, in denen gemeinsame Daten modifiziert werden von Schleifen, die verlinkte Listen durchlaufen von Schleifen, die Ein-/Ausgabe enthalten Geschachtelte parallelisierbare Schleifen sind gut Obwohl die derzeitigen Compiler nested parallelism noch nicht unterstützen Wähle die am einfachsten parallelisierbare Schleife oder die mit den meisten Iterationen Achte auf Datenlokalität (False Sharing) Nutze die IF-Klausel zur dynamischen Auswahl der besten Schleife Kann die äußere Schleife zusätzlich mit MPI parallelisiert werden? Nicht geschachtelte parallelisierbare Schleifen Fasse Schleifen zusammen (Loop Fusion), Lokalität? Kann der dazwischen liegenden Code redundant ausgeführt werden? 95 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 96 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

17 Parallelisierung auf Schleifenebene (fein-granular granular) Vorteile: Jede einzelne Schleife wird parallel ausgeführt Einfache schrittweise Vorgehensweise geringfügige Änderung des bestehenden Codes Nur eine Code-Version Kann ggfls mit automatische Parallelisierung kombiniert werden Nachteile: Hoher Overhead durch häufigen Thread-Start und Synchronisierung Der Anteil an nicht parallelisiertem Code kann schnell dominieren, daher skaliert dieser Ansatz meist schlecht (Amdahl s Law) Die Datenverteilung kann sich von Schleife zu Schleife ändern (Daten wandern zwischen den Caches) Verbesserung der Parallelisierung auf Schleifenebene Zusammenfassen mehrer Schleifen zu einer Parallelen Region dadurch Verringerung des Overheads, die Schleifengrenzen für das Worksharing muss weiterhin jeweils berechnet werden Falls möglich Einsparung von Synchronisationspunkten durch NOWAIT häufig nur bei SCHEDULE(STATIC) möglich Vergrößern der Parallelen Regionen durch Orphaning Ausführen des Codes zwischen den parallelisierbaren Schleifen in SINGLE oder MASTER Bereichen, oder redundante Ausführung mit allen Threads 97 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 98 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Grob-granulare Parallelisierung Gebietszerlegung Im Falle von zahlreichen ähnlichen parallelisierbaren Schleifen können die Schleifengrenzen vorher explizit berechnet werden Allgemeinerer Ansatz: Gebietszerlegung, Jeder Thread erhält ein Teilgebiet zur Bearbeitung Erhöhter Programmieraufwand Grob-granularer Ansatz: Eine Parallele Region für das gesamte Programm Höhere Skalierbarkeit SPMD-Ansatz: Single Program, Multiple Data Alle zum Teilgebiet gehörenden Daten sind privat Verwalten globaler Daten Globale Daten überspannen das gesamte Gebiet Felder sind meist Shared, jeder Thread nutzt ein anderes Teilfeld Änderung gemeinsamer Daten erfordert Synchronisation durch SINGLE- oder ATOMIC-Konstrukte Vereinbare private COMMON-Blöcke oder Daten mit globalem Geltungsbreich als THREADPRIVATE 99 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 100 SunHPC 2002, Einführung in OpenMP, Dieter an Mey SPMD-Programmierung Programmierung Vergleich von OpenMP und MPI Derselbe Algorithmus, einfachere Implementierung Die Modifikation von Shared Daten erfordert Synchronisation Keine expliziter Datentransfer, keine Notwendigkeit von Ghost Cells Die Parallelisierung kann sich auf den rechenintensiven Teil beschränken (Präund Postprosessing kann seriell bleiben) Kombination von MPI und OpenMP auf SMP- Clustern OpenMP innerhalb eines SMP-Knotens, MPI über Knotengrenzen hinweg Mehrere MPI-Tasks können auch innerhalb eines SMP-Knotens gestartet werden Grob-granulare Parallelisierung mit MPI und fein-granulare Parallelisierung mit OpenMP 101 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 102 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

18 Performance-Gesichtspunkte Punkt-zu zu-punkt-synchronisation Bei der SPMD-Programmierung sind die meisten Daten privat: Verwende DEFAULT(PRIVATE) Common-Blöcke sind häufig THREADPRIVATE Privatisiere möglichst viele Variablen zur Vermeidung von False Sharing Vermeide unnötige Barrieren Häufig müssen nur einzelne Threads miteinander synchronisiert werden, Barrieren synchronisieren aber alle Threads Der Produzent berechnet seinen Teil des gemeinsamen Feldes und setzt anschliessend eine Flagge (entspricht dem MPI_Send beim MPI-Ansatz) Der Verbraucher benötigt einen Teil des Feldes des Produzenten und wartet auf seine Flagge (entspricht dem MPI_Receive beim MPI-Ansatz) 103 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 104 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Gezielte Synchronisation einzelner Tasks - Flush program flush implicit integer (a-z) logical allocatable, dimension(:) :: done allocate (done(omp_get_max_threads()))!$omp parallel default(private) shared(done) me = omp_get_thread_num() if ( me > 0 ) neighbor = me - 1 done(me)=false $!OMP barrier call do_my_work() done(me)=true $!OMP flush(done) do while (not done(neighbor)) $!OMP call do_some_more_useful_work() flush(done) call do_synchronized_work() $!OMP end parallel end program flush OpenMP - Gliederung Einleitung: Geschichte, Compiler, OpenMP-Struktur Einführung in OpenMP Format der Direktiven Laufzeitfunktionen Parallele Regionen Arbeitsteilung (worksharing( worksharing) Verwaisen (orphaning( orphaning) Daten-Geltungsbereiche (data( scope) Synchronisation Überblick über alle Kompontenten von OpenMP Ein Beispiel (Berechnung von Pi) Strategien, Performance Klassifizierung von Variablen Parallelisierung auf Schleifenebene Grobgranulare Arbeitsteilung SPMD OpenMP versus MPI Anwendungsbeispiele Jacobi, Panta 105 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 106 SunHPC 2002, Einführung in OpenMP, Dieter an Mey CFD-Programm PANTA auf HP V-ClassV Programmkern do lastprivate(ine,iee,ise,isw,iww,inw,iue,iuw,ide,idw,inu,ind,isu,isd)!$omp renbpe,resbme,resbpe,reubme,reubpe,rkdbmk,rkdbpk,rknbmk, private(!$omp aece,aee,aeebe,aewbe,akck,akebk,akk,akwbk,!$omp rknbpk,rksbmk,rksbpk,rkubmk,rkubpk,rtdbme,rtdbpe,rtnbme,!$omp amueec,amuegc,amuekc,amuelc,amuetc,asonsq,atce,ate,!$omp rtnbpe,rtsbme,rtsbpe,rtubme,rtubpe,rudbme,rudbmx,rudbmy,!$omp atebe,atwbe,auce,aucx,aucy,aucz,aue,auebe,!$omp rudbmz,rudbpe,rudbpx,rudbpy,rudbpz,runbme,runbmx,runbmy,!$omp auebx,aueby,auebz,auwbe,auwbx,auwby,auwbz,aux,!$omp runbmz,runbpe,runbpx,runbpy,runbpz,rusbme,rusbmx,rusbmy,!$omp auy,auz,avce,avcx,avcy,avcz,ave,avebe,!$omp rusbmz,rusbpe,rusbpx,rusbpy,rusbpz,ruubme,ruubmx,ruubmy,!$omp avebx,aveby,avebz,avwbe,avwbx,avwby,avwbz,avx,!$omp ruubmz,ruubpe,ruubpx,ruubpy,ruubpz,rvdbme,rvdbmx,rvdbmy,!$omp avy,avz,awce,awcx,awcy,awcz,awe,awebe,!$omp rvdbmz,rvdbpe,rvdbpx,rvdbpy,rvdbpz,rvnbme,rvnbmx,rvnbmy,!$omp awebx,aweby,awebz,awwbe,awwbx,awwby,awwbz,awx,!$omp rvnbmz,rvnbpe,rvnbpx,rvnbpy,rvnbpz,rvsbme,rvsbmx,rvsbmy,!$omp awy,awz,bedbe,benbe,besbe,beube,bkdbk,bknbk,!$omp rvsbmz,rvsbpe,rvsbpx,rvsbpy,rvsbpz,rvubme,rvubmx,rvubmy,!$omp bksbk,bkubk,btdbe,btnbe,btsbe,btube,budbe,budbx,!$omp rvubmz,rvubpe,rvubpx,rvubpy,rvubpz,rwdbme,rwdbmx,rwdbmy,!$omp budby,budbz,bunbe,bunbx,bunby,bunbz,busbe,busbx,!$omp rwdbmz,rwdbpe,rwdbpx,rwdbpy,rwdbpz,rwnbme,rwnbmx,rwnbmy,!$omp busby,busbz,buube,buubx,buuby,buubz,bvdbe,bvdbx,!$omp rwnbmz,rwnbpe,rwnbpx,rwnbpy,rwnbpz,rwsbme,rwsbmx,rwsbmy,!$omp bvdby,bvdbz,bvnbe,bvnbx,bvnby,bvnbz,bvsbe,bvsbx,!$omp rwsbmz,rwsbpe,rwsbpx,rwsbpy,rwsbpz,rwubme,rwubmx,rwubmy,!$omp bvsby,bvsbz,bvube,bvubx,bvuby,bvubz,bwdbe,bwdbx,!$omp rwubmz,rwubpe,rwubpx,rwubpy,rwubpz,tc,tdb,tdbm,!$omp bwdby,bwdbz,bwnbe,bwnbx,bwnby,bwnbz,bwsbe,bwsbx,!$omp tdbp,teb,tkc,tkdb,tkdbm,tkdbp,tkeb,tknb,!$omp bwsby,bwsbz,bwube,bwubx,bwuby,bwubz,caqden,dedq1,!$omp tknbm,tknbp,tksb,tksbm,tksbp,tkub,tkubm,tkubp,!$omp dedq7,diffe,diffre,diffrk,diffru,diffrv,diffrw,dkdq1,!$omp tkwb,tnb,tnbm,tnbp,tsb,tsbm,tsbp,tub,!$omp dkdq6,dmtdq6,dmtdq7,dtdq1,dtdq2,dtdq3,dtdq4,dtdq5,!$omp tubm,tubp,twb,uc,udb,udbm,udbp,ueb,!$omp dtdq6,dudq1,dudq2,dvdq1,dvdq3,dwdq1,dwdq4,ec,!$omp unb,unbm,unbp,usb,usbm,usbp,uub,uubm,!$omp edb,edbm,edbp,eeb,enb,enbm,enbp,esb,!$omp uubp,uwb,vc,vdb,vdbm,vdbp,veb,velosq,!$omp esbm,esbp,eub,eubm,eubp,ewb,gedb,genb,!$omp vnb,vnbm,vnbp,vsb,vsbm,vsbp,vub,vubm,!$omp gesb,geub,gkdb,gknb,gksb,gkub,gtdb,gtnb,!$omp vubp,vwb,wc,wdb,wdbm,wdbp,web,wnb,!$omp gtsb,gtub,gudb,gunb,gusb,guub,gvdb,gvnb,!$omp wnbm,wnbp,wsb,wsbm,wsbp,wub,wubm,wubp,!$omp gvsb,gvub,gwdb,gwnb,gwsb,gwub,lijk,omegay,!$omp wwb,xiaxc,xiaxeb,xiaxwb,xiayc,xiayeb,xiaywb,xiazc,!$omp omegaz,prode,qdens,qjc,qmqc,redbme,redbpe,renbme,!$omp xiazeb,xiazwb,xibxc,xibxnb,xibxsb,xibynb,xibysb,xibznb,!$omp omegaz,prode,qdens,qjc,qmqc,redbme,redbpe,renbme,!$omp xibzsb,xicxc,xicxdb,xicxub,xicydb,xicyub,xiczdb,xiczub) do i = is,ie! 1500 lines omitted 107 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 35 percent of the CPU time spent in one loop nest do n = 1,7 Attention: when parallelizing this loop recursion: RHS(l,m) this loop is usually auto-parallelized do m = 1,7 only 7 iterations many iterations! do l = LSS(itsub),LEE(itsub) (vector loop) i = IG(l) j = JG(l) k = KG(l) lijk = L2IJK(l) RHS(l,m) = RHS(l,m)- FJAC(lijk,lm00,m,n)*DQCO(i-1,j,k,n,NB)*FM00(l) - FJAC(lijk,lp00,m,n)*DQCO(i+1,j,k,n,NB)*FP00(l) - FJAC(lijk,l0m0,m,n)*DQCO(i,j-1,k,n,NB)*F0M0(l) - FJAC(lijk,l0p0,m,n)*DQCO(i,j+1,k,n,NB)*F0P0(l) - FJAC(lijk,l00m,m,n)*DQCO(i,j,k-1,n,NB)*F00M(l) - FJAC(lijk,l00p,m,n)*DQCO(i,j,k+1,n,NB)*F00P(l) 108 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

19 Visual KAP for OpenMP on WinNT (KAI) Generating OpenMP Directives!$OMP PARALLEL SHARED SHARED (ITSUB,LSS,II15,RHS,II14,L2IJK,FJAC,NB,KG,JG,IG,DQCO!$OMP,FM00,II13,FP00,II12,F0M0,II11,F0P0,II10,F00M,II9,F00P,LM00,LP00,L0M0!$OMP,L0P0,L00M,L00P,LEE,LFJ) PRIVATE PRIVATE (II2,II1,N1,M,L,II16,II4,RR1,II3, (II2,II1,N1,M,L,II16,II4,RR1,II3,!$OMPI,J,K,LIJK,II17,II18,II20,II21,II22,II23,II24,II25,N,NM,II19,II32,!$OMPII26,II27,II28,II29,II30,II31,II6,II5)!$OMPI,J,K,LIJK,II17,II18,II20,II21,II22,II23,II24,II25,N,NM,II19,II32,!$OMPII26,II27,II28,II29,II30,II31,II6,II5) DO!$OMP DO II1=LSS(ITSUB),II15,64 II2 = MIN (II15,II1+63) DO II1=LSS(ITSUB),II15,64 DO N1=1,7 DO II2 M=1,7 = MIN (II15,II1+63) long loop splitted DO N1=1,7 L=II1,II2,1 DO RHS(L,M) M=1,7 = RHS(L,M) - FJAC(L2IJK(L),II14,M,N1) * DQCO(IG(L)-1,JG(L),KG(L),N1,NB) * FM00(L) - FJAC(L2IJK(L),II13,M,N1) * DQCO(IG (L)+1,JG(L),KG(L),N1,NB) DO L=II1,II2,1 * FP00(L) - FJAC(L2IJK(L),II12,M,N1) * DQCO (IG(L),JG(L)-1,KG(L),N1,NB) RHS(L,M) = RHS(L,M) *-F0M0(L) FJAC(L2IJK(L),II14,M,N1) - FJAC(L2IJK(L),II11,M,N1) * DQCO(IG(L)-1 *,JG(L),KG(L),N1,NB) DQCO(IG(L),JG(L)+1,KG(L),N1,NB) * FM00(L) * -F0P0(L) FJAC(L2IJK(L),II13,M,N1) - FJAC(L2IJK(L),II10, * DQCO(IG M,N1) * DQCO(IG(L),JG(L),KG(L)-1,N1,NB) * F00M(L) - FJAC(L2IJK(L) (L)+1,JG(L),KG(L),N1,NB) * FP00(L) - FJAC(L2IJK(L),II12,M,N1) * DQCO,II9,M,N1) * DQCO(IG(L),JG(L),KG(L)+1,N1,NB) * F00P(L) (IG(L),JG(L)-1,KG(L),N1,NB) END DO * F0M0(L) - FJAC(L2IJK(L),II11,M,N1) * END DQCO(IG(L),JG(L)+1,KG(L),N1,NB) DO * F0P0(L) - FJAC(L2IJK(L),II10, M,N1) END DO * DQCO(IG(L),JG(L),KG(L)-1,N1,NB) * F00M(L) - FJAC(L2IJK(L) END DO!$OMP END,II9,M,N1) DO NOWAIT * DQCO(IG(L),JG(L),KG(L)+1,N1,NB) * F00P(L)!$OMP BARRIER END DO END DO END DO END DO!$OMP END DO NOWAIT 109 SunHPC 2002, Einführung in OpenMP, Dieter an Mey!$OMP BARRIER Visual KAP for OpenMP on WinNT (KAI) Detailled Listing LR NV SO INF do n = 1, LR NV SO NVS NC: do m = 1, LR NV SO NVS :! do l = LSS(itsub),LEE(itsub) :!: 45 i = IG(l) Abbreviations Used :!: 46 j = JG(l) STD standardized :!: 47 k = KG(l) NO not optimized :!: 48 lijk = L2IJK(l) SO :!: 49 RHS(l,m) = LR loop reordering :!: 50 RHS(l,m) - FJAC(lijk,lm00,m,n)*DQCO(i-1, NV not vectorized :!: 51 FJAC(lijk,lp00,m,n)*DQCO(i+1,j,k,n,NB)*F SO scalar optimization :!: 52 FJAC(lijk,l0m0,m,n)*DQCO(i,j-1,k,n,NB)*F NVS non-vector-stmt :!: 53 FJAC(lijk,l0p0,m,n)*DQCO(i,j+1,k,n,NB)*F :!: 54 FJAC(lijk,l00m,m,n)*DQCO(i,j,k-1,n,NB)*F INF informational :!: 55 FJAC(lijk,l00p,m,n)*DQCO(i,j,k+1,n,NB)*F C 1 concurrentized SO :!: 56 NC not concurrentized :! 57 : 58 Footnote List 1: scalar optimization Statement deleted because of scalar optimization 2: not vectorized Not an inner loop 3: not concurrentized Too little concurrentizable code 4: informational Unrolling of this loop was not done because heuristic says size is o 5: scalar optimization Loop is empty or is zero-trip 6: informational Unrolling of this loop was not done because no executable statements 7: scalar optimization Strip loop for strip mining with block size 64 8: scalar optimization Block loop for strip mining with block size SunHPC 2002, Einführung in OpenMP, Dieter an Mey Manual Parallelization with OpenMP Compilation with the guidef90 Preprocessor (KAI) private(n,m,l,i,j,k,lijk) do n = 1,7 do m = 1,7 do l = LSS(itsub),LEE(itsub) partitioning the long loop i = IG(l) j = JG(l) k = KG(l) lijk = L2IJK(l) RHS(l,m) = RHS(l,m)- FJAC(lijk,lm00,m,n)*DQCO(i-1,j,k,n,NB)*FM00(l) - FJAC(lijk,lp00,m,n)*DQCO(i+1,j,k,n,NB)*FP00(l) - FJAC(lijk,l0m0,m,n)*DQCO(i,j-1,k,n,NB)*F0M0(l) - FJAC(lijk,l0p0,m,n)*DQCO(i,j+1,k,n,NB)*F0P0(l) - FJAC(lijk,l00m,m,n)*DQCO(i,j,k-1,n,NB)*F00M(l) - FJAC(lijk,l00p,m,n)*DQCO(i,j,k+1,n,NB)*F00P(l) nowait!omp end parallel no barrier, no overhead 111 SunHPC 2002, Einführung in OpenMP, Dieter an Mey speedup Paralleler Speedup des Programmkernes (HP V Class) 16 OMP parallel inner loop without barrier OMP splitting loop over l (VisKAP) 12 AUTO parallel over m CPUs out of 16 busy processors 112 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Finites Differenzenverfahren Jacobi-Verfahren - Gebietszerlegung Zur Lösung der zweidimensionalen Helmholtzdifferentialgleichung u + κu = f mit homogenen Dirichlet-Randbedingungen dient ein Finites Differenzenverfahren Bei der Diskretisierung des Laplace-Operators mit dem zentralen 5-Punkte-Differenzenstern entsteht ein lineares Gleichunssystem mit Bandstruktur, daß mit dem Jacobi- oder Gesamtschrittverfahren iterativ gelöst werden kann P1 P2 Shared Memory Parallelisierung Das Jacobi-Verfahren ist einfach parallelisierbar und auch vektorisierbar 113 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 114 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

20 Jacobi-Verfahren - Gebietszerlegung Jacobi-Verfahren - 1 OpenMP Version P1 P1 Überlappbereiche P2 P2 Shared Memory Parallelisierung Distributed Memory Parallelisierung k = 1 do while (klemaxit and errorgt tol) error = 00 do do j=1,m do i=1,n; uold(i,j) = u(i,j); do do private(resid) reduction(+:error) do j = 2,m-1 do i = 2,n-1 resid = (ax*(uold(i-1,j) + uold(i+1,j) u(i,j) = uold(i,j) - omega * resid error = error + resid*resid do k = k + 1 error = sqrt(error)/dble(n*m) 115 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 116 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Jacobi-Verfahren - 2 OpenMP Version k = 1 do while (klemaxit and errorgt tol) error = 00 do j=1,m do i=1,n; uold(i,j) = u(i,j);!$omp private(resid) reduction(+:error) do j = 2,m-1 do i = 2,n-1 resid = (ax*(uold(i-1,j) + uold(i+1,j) u(i,j) = uold(i,j) - omega * resid error = error + resid*resid!$omp nowait k = k + 1 error = sqrt(error)/dble(n*m) 117 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Jacobi-Verfahren - 3 OpenMP Version private(resid,k_local) k_local = 1 do while (k_locallemaxit and errorgttol) do j=1,m; do i=1,n; uold(i,j) = u(i,j); ; error = 00 reduction(+:error) do j;do i;resid=;u(i,j)=;error=;; error = sqrt(error)/dble(n*m) k_local = k_local + 1!$omp master k = k_local!$omp end master 118 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Jacobi-Verfahren Parallelisierung mit Visual KAP for OpenMP DO WHILE ( K LE MAXIT AND ERROR GT TOL ) ERROR = 0D0 C$OMP PARALLEL IF (M GT 83) SHARED (M,N,UOLD,U) PRIVATE (J,I) C$OMP DO DO J=1,M; DO I=1,N; UOLD(I,J) = U(I,J); END DO; END DO C$OMP END DO NOWAIT C$OMP END PARALLEL II1 = II3; IF (II1 GT 0) THEN; II2 = M - 2; IF (II2 GT 0) THEN; DD2 = 1 / B C$OMP PARALLEL SHARED (M,DD2,N,AX,UOLD,F,AY,B,U,OMEGA,ERROR) PRIVATE ( C$OMP DD1,J,I,RESID,ERROR1) ERROR1 = 0D0 C$OMP DO DO J=2,M-1; DD1 = DD2; DO I=2,N-1 RESID = U(I,J) = UOLD(I,J) - OMEGA * RESID ERROR1 = ERROR1 + RESID * RESID END DO; END DO C$OMP END DO NOWAIT C$OMP CRITICAL (II4) ERROR = ERROR + ERROR1 C$OMP END CRITICAL (II4) C$OMP END PARALLEL END IF; END IF K = K + 1; ERROR = SQRT (ERROR) * DD3 END DO Jacobi-Verfahren Automatische Parallelisierung (Linux( Linux-PGI) Übersetzen mit automatischer Parallelisierung und Erzeugen einer Ausgabeliste (in jacobiw2ff): pgf90 -Mlist -Mconcur -Minfo -Mneginfo=concur -fast jacobif90 jacobi: 43, Loop not parallelized: multiple exits 49, Parallel code for non-innermost loop generated; block distribution 50, Loop unrolled 10 times 57, Parallel code for non-innermost loop generated; block distribution 119 SunHPC 2002, Einführung in OpenMP, Dieter an Mey 120 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

1 SunHPC 2002, Einführung in OpenMP, Dieter an Mey

1 SunHPC 2002, Einführung in OpenMP, Dieter an Mey Parallele Programmierung für Shared-Memory Memory-Rechner mit OpenMP Dieter an Mey Rechen- und Kommunikationszentrum der RWTH Aachen 21. Januar 2002 anmey@rz rz.rwth-aachen.de http://www www.rz.rwth-aachen.de

Mehr

Parallele Programmierung. Parallele Programmierung Memory-Rechner mit OpenMP

Parallele Programmierung. Parallele Programmierung Memory-Rechner mit OpenMP Parallele Programmierung für Shared-Memory Memory-Rechner mit OpenMP Dieter an Mey Rechen- und Kommunikationszentrum der RWTH Aachen 21. Januar 2002 anmey@rz rz.rwth-aachen.de http://www www.rz.rwth-aachen.de

Mehr

Beispiel: Schleifenparallelisierung

Beispiel: Schleifenparallelisierung Beispiel: Schleifenparallelisierung for (i = 0; i high) { printf ( Exiting during iteration %d\n,i); break; for (j=low;j

Mehr

Threads und OpenMP. Frank Mietke <frank.mietke@informatik.tu-chemnitz.de> Cluster- & Gridcomputing Frank Mietke 7/4/04

Threads und OpenMP. Frank Mietke <frank.mietke@informatik.tu-chemnitz.de> Cluster- & Gridcomputing Frank Mietke 7/4/04 Threads und OpenMP Frank Mietke 1 Ziel der Vorlesungen Einführung in Threads Programmierung mit Threads Einführung in OpenMP Programmierung mit OpenMP 2 Was ist

Mehr

Master-Thread führt Programm aus, bis durch die Direktive

Master-Thread führt Programm aus, bis durch die Direktive OpenMP seit 1998 Standard (www.openmp.org) für die Shared-Memory Programmierung; (Prä-)Compiler für viele Systeme kommerziell oder frei (z.b. Omni von phase.hpcc.jp/omni) verfügbar Idee: automatische Generierung

Mehr

Parallele Programmierung mit OpenMP

Parallele Programmierung mit OpenMP Parallele Programmierung mit OpenMP - Eine kurze Einführung - 11.06.2003 RRZN Kolloquium SS 2003 1 Gliederung 1. Grundlagen 2. Programmiermodell 3. Sprachkonstrukte 4. Vergleich MPI und OpenMP 11.06.2003

Mehr

6. Der OpenMP Standard. Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++

6. Der OpenMP Standard. Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++ 6. Der OpenMP Standard Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++ OpenMP Programmiermodell OpenMP Direktiven basieren in C and C++

Mehr

Propädeutikum. Dipl.-Inf. Frank Güttler

Propädeutikum. Dipl.-Inf. Frank Güttler Propädeutikum 2015 Vorbereitungskurs Informatikstudium Erfolgreich Studieren Programmieren (C-Kurs) guettler@informatik.uni-leipzig.de Universität Leipzig Institut für Informatik Technische Informatik

Mehr

Deklarationen in C. Prof. Dr. Margarita Esponda

Deklarationen in C. Prof. Dr. Margarita Esponda Deklarationen in C 1 Deklarationen Deklarationen spielen eine zentrale Rolle in der C-Programmiersprache. Deklarationen Variablen Funktionen Die Deklarationen von Variablen und Funktionen haben viele Gemeinsamkeiten.

Mehr

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss Systeme 1 Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss Threads Die Adressräume verschiedener Prozesse sind getrennt und geschützt gegen den Zugriff anderer Prozesse. Threads sind leichtgewichtige

Mehr

OpenMP - Geschichte. 1997: OpenMP Version 1.0 für Fortran

OpenMP - Geschichte. 1997: OpenMP Version 1.0 für Fortran OpenMP - Geschichte 1997: OpenMP Version 1.0 für Fortran Standard für f r die Shared-Memory Memory-Programmierung inzwischen für f r alle namhaften SMP-Rechner verfügbar wird im techn.-wiss. Rechnen die

Mehr

Modellierung und Programmierung 1

Modellierung und Programmierung 1 Modellierung und Programmierung 1 Prof. Dr. Sonja Prohaska Computational EvoDevo Group Institut für Informatik Universität Leipzig 19. November 2015 Gültigkeitsbereich (Scope) von Variablen { int m; {

Mehr

1. Einführung in OpenMP

1. Einführung in OpenMP 1. Einführung in OpenMP Übersicht Einführung Homogene und inhomogene Arbeitsverteilung Rekursive Parallelität Beispiele Parallele Programmierung 1 Nicolas Maillard, Marcus Ritt 1 Überblick OpenMP: Vereinfachte

Mehr

Shared-Memory Programmiermodelle

Shared-Memory Programmiermodelle Shared-Memory Programmiermodelle mehrere, unabhängige Programmsegmente greifen direkt auf gemeinsame Variablen ( shared variables ) zu Prozeßmodell gemäß fork/join Prinzip, z.b. in Unix: fork: Erzeugung

Mehr

Übersicht Programmablaufsteuerung

Übersicht Programmablaufsteuerung Übersicht Programmablaufsteuerung Konditionale Verzweigung: if - else switch-anweisung Schleifenkonstrukte: while, do - while for Schleife Sprung-Anweisungen: break, continue, goto, return Anweisungen

Mehr

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung Annabelle Klarl Zentralübung zur Vorlesung Einführung in die Informatik: http://www.pst.ifi.lmu.de/lehre/wise-13-14/infoeinf WS13/14 Action required now 1. Smartphone: installiere die App "socrative student"

Mehr

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet C++ Grundlagen ++ bedeutet Erweiterung zum Ansi C Standard Hier wird eine Funktion eingeleitet Aufbau: In dieser Datei stehen die Befehle, die gestartet werden, wenn das Programm gestartet wird Int main()

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

Universität Karlsruhe (TH)

Universität Karlsruhe (TH) Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 OpenMP-Programmierung Teil I Multikern-Praktikum Wintersemester 06-07 Inhalt Was ist OpenMP? Parallele Regionen Konstrukte zur Arbeitsteilung

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Universität Karlsruhe (TH)

Universität Karlsruhe (TH) Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 OpenMP-Programmierung Teil III Multikern-Praktikum Wintersemester 06-07 Inhalt Was ist OpenMP? Parallele Regionen Konstrukte zur Arbeitsteilung

Mehr

S7-Hantierungsbausteine für R355, R6000 und R2700

S7-Hantierungsbausteine für R355, R6000 und R2700 S7-Hantierungsbausteine für R355, R6000 und R2700 1. FB90, Zyklus_R/W Dieser Baustein dient zur zentralen Kommunikation zwischen Anwenderprogramm und dem Modul R355 sowie den Geräten R6000 und R2700 über

Mehr

OpenMP - Threading- Spracherweiterung für C/C++ Matthias Klein, Michael Pötz Systemprogrammierung 15. Juni 2009

OpenMP - Threading- Spracherweiterung für C/C++ Matthias Klein, Michael Pötz Systemprogrammierung 15. Juni 2009 - Threading- Spracherweiterung für C/C++ Matthias Klein, Michael Pötz Systemprogrammierung 15. Juni 2009 Grundlagen der Parallelen Programmierung Hardware Threads vs. Prozesse Kritische Abschnitte Lange

Mehr

Programmierung in C. Grundlagen. Stefan Kallerhoff

Programmierung in C. Grundlagen. Stefan Kallerhoff Programmierung in C Grundlagen Stefan Kallerhoff Vorstellungsrunde Name Hobby/Beruf Schon mal was programmiert? Erwartungen an den Kurs Lieblingstier Für zu Hause C-Buch online: http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

Mehr

Universität Karlsruhe (TH)

Universität Karlsruhe (TH) Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 OpenMP-Programmierung Teil II Multikern-Praktikum Wintersemester 06-07 Inhalt Was ist OpenMP? Parallele Regionen Konstrukte zur Arbeitsteilung

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund - mit / ohne Parameter - mit / ohne Rückgabewerte

Mehr

Parallel Regions und Work-Sharing Konstrukte

Parallel Regions und Work-Sharing Konstrukte Parallel Regions und Work-Sharing Konstrukte Um eine Parallelisierung von größeren Programmabschnitten, als es einzelne Schleifen sind, zu ermöglichen, stellt OpenMP als allgemeinstes Konzept die Parallel

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar 2013. CAP-News 40

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar 2013. CAP-News 40 CAP-News 40 CAP-News ist in unrägelmäßigen Abständen erscheinende Information zum Produktkonfigurator CAP/VARIANTS. Hier werden die neuen Befehle, Funktionen und Möglichkeiten beschrieben. In CAP-News

Mehr

Erwin Grüner 09.02.2006

Erwin Grüner 09.02.2006 FB Psychologie Uni Marburg 09.02.2006 Themenübersicht Folgende Befehle stehen in R zur Verfügung: {}: Anweisungsblock if: Bedingte Anweisung switch: Fallunterscheidung repeat-schleife while-schleife for-schleife

Mehr

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7 Java 7 Elmar Fuchs Grundlagen Programmierung 1. Ausgabe, Dezember 2011 JAV7 5 Java 7 - Grundlagen Programmierung 5 Kontrollstrukturen In diesem Kapitel erfahren Sie wie Sie die Ausführung von von Bedingungen

Mehr

Speicher in der Cloud

Speicher in der Cloud Speicher in der Cloud Kostenbremse, Sicherheitsrisiko oder Basis für die unternehmensweite Kollaboration? von Cornelius Höchel-Winter 2013 ComConsult Research GmbH, Aachen 3 SYNCHRONISATION TEUFELSZEUG

Mehr

Tutorium Rechnerorganisation

Tutorium Rechnerorganisation Woche 2 Tutorien 3 und 4 zur Vorlesung Rechnerorganisation 1 Christian A. Mandery: KIT Universität des Landes Baden-Württemberg und nationales Grossforschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu

Mehr

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung: Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Der Sourcecode wird an den entsprechenden Stellen im Programm wiederholt Programm wird lang

Mehr

Lokale Installation von DotNetNuke 4 ohne IIS

Lokale Installation von DotNetNuke 4 ohne IIS Lokale Installation von DotNetNuke 4 ohne IIS ITM GmbH Wankelstr. 14 70563 Stuttgart http://www.itm-consulting.de Benjamin Hermann hermann@itm-consulting.de 12.12.2006 Agenda Benötigte Komponenten Installation

Mehr

Schmitt, Günter (1996): Fortran 90 Kurs technisch orientiert, R. Oldenbourg Verlag, München

Schmitt, Günter (1996): Fortran 90 Kurs technisch orientiert, R. Oldenbourg Verlag, München MANUEL KALLWEIT & FABIAN KINDERMANN Literaturempfehlung: Vorlesungsskript von Heidrun Kolinsky zu FORTRAN 90/95: http://www.rz.uni-bayreuth.de/lehre/fortran90/vorlesung/index.html Schmitt, Günter (1996):

Mehr

Softwarelösungen: Versuch 4

Softwarelösungen: Versuch 4 Softwarelösungen: Versuch 4 Nichtstun in Schleife wird ersetzt durch zeitweilige Zurücknahme der Anforderung, um es anderen Prozessen zu erlauben, die Ressource zu belegen: /* Prozess 0 */ wiederhole flag[0]

Mehr

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014)

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014) Handbuch NAFI Online-Spezial 1. Auflage (Stand: 24.09.2014) Copyright 2016 by NAFI GmbH Unerlaubte Vervielfältigungen sind untersagt! Inhaltsangabe Einleitung... 3 Kundenauswahl... 3 Kunde hinzufügen...

Mehr

Klausur in Programmieren

Klausur in Programmieren Studiengang Sensorik/Sensorsystemtechnik Note / normierte Punkte Klausur in Programmieren Wintersemester 2010/11, 17. Februar 2011 Dauer: 1,5h Hilfsmittel: Keine (Wörterbücher sind auf Nachfrage erlaubt)

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Kontrollstrukturen, Strukturierte Programmierung

Kontrollstrukturen, Strukturierte Programmierung , Strukturierte Programmierung Steuer- und Kontrollfluss Strukturierte Programmierung Arten von Strukturblöcken Sequenz Alternative Iteration C-Spezifisches Seite 1 Elementare Algorithmen SelectionSort

Mehr

OpenMP am Beispiel der Matrizenmultiplikation

OpenMP am Beispiel der Matrizenmultiplikation OpenMP am Beispiel der Matrizenmultiplikation David J. Meder, Dr. Victor Pankratius IPD Tichy Lehrstuhl für Programmiersysteme KIT die Kooperation von Forschungszentrum Karlsruhe GmbH und Universität Karlsruhe

Mehr

Die Programmiersprache C99: Zusammenfassung

Die Programmiersprache C99: Zusammenfassung Die Programmiersprache C99: Zusammenfassung Jörn Loviscach Versionsstand: 7. Dezember 2010, 19:30 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.youtube.com/joernloviscach

Mehr

Delegatesund Ereignisse

Delegatesund Ereignisse Delegatesund Ereignisse «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Definition eines Ereignisses

Mehr

Parallele Programmierung mit OpenMP

Parallele Programmierung mit OpenMP Parallele Programmierung mit OpenMP Wolfgang Dautermann FH Joanneum Chemnitzer Linuxtage 2008 1 Motivation 2 OpenMP Übersicht 3 Hello World - der erste Code 4 OpenMP-Compilerdirektiven Threaderzeugung

Mehr

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur Unterprogramme Unterprogramme sind abgekapselte Programmfragmente, welche es erlauben, bestimmte Aufgaben in wiederverwendbarer Art umzusetzen. Man unterscheidet zwischen Unterprogrammen mit Rückgabewert

Mehr

Lehrer: Einschreibemethoden

Lehrer: Einschreibemethoden Lehrer: Einschreibemethoden Einschreibemethoden Für die Einschreibung in Ihren Kurs gibt es unterschiedliche Methoden. Sie können die Schüler über die Liste eingeschriebene Nutzer Ihrem Kurs zuweisen oder

Mehr

Praktikum: Paralleles Programmieren für Geowissenschaftler

Praktikum: Paralleles Programmieren für Geowissenschaftler Praktikum: Paralleles Programmieren für Geowissenschaftler Prof. Thomas Ludwig, Hermann Lenhart, Ulrich Körner, Nathanael Hübbe hermann.lenhart@zmaw.de OpenMP Einführung I: Allgemeine Einführung Prozesse

Mehr

2010 Ing. Punzenberger COPA-DATA GmbH. Alle Rechte vorbehalten.

2010 Ing. Punzenberger COPA-DATA GmbH. Alle Rechte vorbehalten. 2010 Ing. Punzenberger COPA-DATA GmbH Alle Rechte vorbehalten. Die Weitergabe und Vervielfältigung dieses Dokuments ist - gleich in welcher Art und Weise nur mit schriftlicher Genehmigung der Firma COPA-DATA

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Name, Vorname Matrikelnummer Probeklausur zur Vorlesung Einführung in die Programmierung WS 2008/09 Dauer: 2 Stunden Hinweise: Schreiben Sie Ihren Namen und Ihre Matrikelnummer auf dieses Deckblatt und

Mehr

Vorlesung Parallelrechner und Parallelprogrammierung, SoSe 2016

Vorlesung Parallelrechner und Parallelprogrammierung, SoSe 2016 Paralleles Programmieren mit und MPI Vorlesung Parallelrechner und Parallelprogrammierung, SoSe 2016 Steinbuch Centre for Computing Hartmut Häfner, Steinbuch Centre for Computing (SCC) STEINBUCH CENTRE

Mehr

Kontrollstrukturen und Funktionen in C

Kontrollstrukturen und Funktionen in C Kontrollstrukturen und Funktionen in C Lernziele: Vertiefen der Kenntnisse über Operatoren, Kontrollstrukturen und die Verwendung von Funktionen. Aufgabe 1: Quickies: Datentypen in C a) Was sind die elementaren

Mehr

C/C++ Programmierung

C/C++ Programmierung 1 C/C++ Programmierung Grundlagen: Anweisungen Sebastian Hack Christoph Mallon (hack mallon)@cs.uni-sb.de Fachbereich Informatik Universität des Saarlandes Wintersemester 2009/2010 2 Anweisungen (Statements)

Mehr

5. Tutorium zu Programmieren

5. Tutorium zu Programmieren 5. Tutorium zu Programmieren Dennis Ewert Gruppe 6 Universität Karlsruhe Institut für Programmstrukturen und Datenorganisation (IPD) Lehrstuhl Programmierparadigmen WS 2008/2009 c 2008 by IPD Snelting

Mehr

Objektbasierte Entwicklung

Objektbasierte Entwicklung Embedded Software Objektbasierte Entwicklung Objektorientierung in C? Prof. Dr. Nikolaus Wulff Objektbasiert entwickeln Ohne C++ wird meist C im alten Stil programmiert. => Ein endlose while-schleife mit

Mehr

Wie Sie mit Mastern arbeiten

Wie Sie mit Mastern arbeiten Wie Sie mit Mastern arbeiten Was ist ein Master? Einer der großen Vorteile von EDV besteht darin, dass Ihnen der Rechner Arbeit abnimmt. Diesen Vorteil sollten sie nutzen, wo immer es geht. In PowerPoint

Mehr

2. Semester, 2. Prüfung, Lösung

2. Semester, 2. Prüfung, Lösung 2. Semester, 2. Prüfung, Lösung Name Die gesamte Prüfung bezieht sich auf die Programmierung in C++! Prüfungsdauer: 90 Minuten Mit Kugelschreiber oder Tinte schreiben Lösungen können direkt auf die Aufgabenblätter

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Software Engineering Interaktionsdiagramme

Software Engineering Interaktionsdiagramme Software Engineering Interaktionsdiagramme Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Nachrichtenaustausch Welche Nachrichten werden ausgetauscht? (Methodenaufrufe)

Mehr

Backup-Server einrichten

Backup-Server einrichten Einsteiger Fortgeschrittene Profis markus.meinl@m-quest.ch Version.0 Voraussetzungen für diesen Workshop. Die M-Quest Suite 2005-M oder höher ist auf diesem Rechner installiert 2. Das Produkt M-Lock ist

Mehr

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version 1.0.0. 23. September 2015 - 1 -

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version 1.0.0. 23. September 2015 - 1 - Matrix42 Use Case - Sicherung und Rücksicherung persönlicher Version 1.0.0 23. September 2015-1 - Inhaltsverzeichnis 1 Einleitung 3 1.1 Beschreibung 3 1.2 Vorbereitung 3 1.3 Ziel 3 2 Use Case 4-2 - 1 Einleitung

Mehr

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff Programmieren in C Felder, Schleifen und Fließkommaarithmetik Prof. Dr. Nikolaus Wulff Addition von Zahlen 1 2 3 4 5 #include int main() { int x,y,z,sum; x = 1; y = 2; z = 4; sum = x + y + z;

Mehr

Grundlagen verteilter Systeme

Grundlagen verteilter Systeme Universität Augsburg Insitut für Informatik Prof. Dr. Bernhard Bauer Wolf Fischer Christian Saad Wintersemester 08/09 Übungsblatt 3 12.11.08 Grundlagen verteilter Systeme Lösungsvorschlag Aufgabe 1: a)

Mehr

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu) HMExcel Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu) Inhalt 1. Einleitung...1 2. Beispiele...2 2.1. Daten in ein Tabellenblatt schreiben...2

Mehr

2A Basistechniken: Weitere Aufgaben

2A Basistechniken: Weitere Aufgaben 2A Basistechniken: Weitere Aufgaben 2A.3 Programmierung unter UNIX/Linux 1. Gegeben sind einige Ausschnitte von C-Programmen, die unter UNIX/Linux ausgeführt werden sollen. Beantworten Sie die zugehörigen

Mehr

Thermoguard. Thermoguard CIM Custom Integration Module Version 2.70

Thermoguard. Thermoguard CIM Custom Integration Module Version 2.70 Thermoguard Thermoguard CIM Custom Integration Module Version 2.70 Inhalt - Einleitung... 3 - Voraussetzungen... 3 - Aktivierung und Funktion der Schnittstelle... 3 - Parameter... 4 - NLS-Einfluss... 4

Mehr

Monitore. Klicken bearbeiten

Monitore. Klicken bearbeiten Sascha Kretzschmann Institut für Informatik Monitore Formatvorlage und deren Umsetzung des Untertitelmasters durch Klicken bearbeiten Inhalt 1. Monitore und Concurrent Pascal 1.1 Warum Monitore? 1.2 Monitordefinition

Mehr

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

Automatisches Parallelisieren

Automatisches Parallelisieren Automatisches Parallelisieren Vorlesung im Wintersemester 2010/11 Eberhard Zehendner FSU Jena Thema: Datenabhängigkeitsanalyse Eberhard Zehendner (FSU Jena) Automatisches Parallelisieren Datenabhängigkeitsanalyse

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen Übungen if / else / else if... 2... 2 Aufgabe 2:... 2 Aufgabe 3:... 2 Aufgabe 4:... 2 Aufgabe 5:... 2 Aufgabe 6:... 2 Aufgabe 7:... 3 Aufgabe 8:... 3 Aufgabe 9:... 3 Aufgabe 10:... 3 switch... 4... 4 Aufgabe

Mehr

Einführung in die C++ Programmierung für Ingenieure

Einführung in die C++ Programmierung für Ingenieure Einführung in die C++ Programmierung für Ingenieure MATTHIAS WALTER / JENS KLUNKER Universität Rostock, Lehrstuhl für Modellierung und Simulation 14. November 2012 c 2012 UNIVERSITÄT ROSTOCK FACULTY OF

Mehr

10.6 Programmier-Exits für Workitems

10.6 Programmier-Exits für Workitems 10.6 Programmier-Exits für Workitems 279 10.6 Programmier-Exits für Workitems 10.6.1 Das Interface IF_SWF_IFS_WORKITEM_EXIT Am Schritt einer Workflow-Definition im Reiter»Programmier-Exits«können verschiedene

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Anleitung für zwei C++ - Openmp - Beispiele auf der NWZSuperdome

Anleitung für zwei C++ - Openmp - Beispiele auf der NWZSuperdome Anleitung für zwei C++ - Openmp - Beispiele auf der NWZSuperdome (Timo Heinrich, t_hein03@uni-muenster.de) Inhaltsverzeichnis: 0.Einleitung 1.Teil: Helloworldprogramm 1.1 Quellcode: Helloworld.cpp 1.2

Mehr

DIGITALVARIO. Anleitung Bootloader. Ausgabe 0.1 deutsch 29.11.2005. für Direkt-Digital-Vario. Firmware ab 00-06-00 Hardware 01 Seriennummer ab 0003

DIGITALVARIO. Anleitung Bootloader. Ausgabe 0.1 deutsch 29.11.2005. für Direkt-Digital-Vario. Firmware ab 00-06-00 Hardware 01 Seriennummer ab 0003 DIGITALVARIO Anleitung Bootloader Ausgabe 0.1 deutsch 29.11.2005 für Direkt-Digital-Vario Firmware ab 00-06-00 Hardware 01 Seriennummer ab 0003 1. Funktion Der Bootloader dient dazu Updates der Variosoftware

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Praktikum: Paralleles Programmieren für Geowissenschaftler

Praktikum: Paralleles Programmieren für Geowissenschaftler Praktikum: Paralleles Programmieren für Geowissenschaftler Prof. Thomas Ludwig, Hermann Lenhart & Enno Zickler hermann.lenhart@zmaw.de OpenMP Allgemeine Einführung I OpenMP Merkmale: OpenMP ist keine Programmiersprache!

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Einführung in Java PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Gliederung 1. Was ist Java / Geschichte von Java 2. Prinzip der Plattformunabhängigkeit 3. Wie kommt man vom Quellcode zum Programm

Mehr

C++ Tutorial: Timer 1

C++ Tutorial: Timer 1 C++ Tutorial: Timer 1 Timer v1.0 Einleitung Raum und Zeit sind spätestens seit der kopernikanischen Wende wichtige Gegenstände des Denkens geworden. In einem Programm bestimmt die Zeit die Abläufe und

Mehr

188.154 Einführung in die Programmierung für Wirtschaftsinformatik

188.154 Einführung in die Programmierung für Wirtschaftsinformatik Beispiel 1 Vererbung (Liste) Gegeben sind die beiden Klassen ListNode und PersonNode. 188.154 Einführung in die Programmierung für Wirtschaftsinformatik Wiederholung, Prüfungsvorbereitung Monika Lanzenberger

Mehr

Mediator 9 - Lernprogramm

Mediator 9 - Lernprogramm Mediator 9 - Lernprogramm Ein Lernprogramm mit Mediator erstellen Mediator 9 bietet viele Möglichkeiten, CBT-Module (Computer Based Training = Computerunterstütztes Lernen) zu erstellen, z. B. Drag & Drop

Mehr

teamsync Kurzanleitung

teamsync Kurzanleitung 1 teamsync Kurzanleitung Version 4.0-19. November 2012 2 1 Einleitung Mit teamsync können Sie die Produkte teamspace und projectfacts mit Microsoft Outlook synchronisieren.laden Sie sich teamsync hier

Mehr

Dokumentation IBIS Monitor

Dokumentation IBIS Monitor Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt

Mehr

Wir arbeiten mit Zufallszahlen

Wir arbeiten mit Zufallszahlen Abb. 1: Bei Kartenspielen müssen zu Beginn die Karten zufällig ausgeteilt werden. Wir arbeiten mit Zufallszahlen Jedesmal wenn ein neues Patience-Spiel gestartet wird, muss das Computerprogramm die Karten

Mehr

Nutzung von GiS BasePac 8 im Netzwerk

Nutzung von GiS BasePac 8 im Netzwerk Allgemeines Grundsätzlich kann das GiS BasePac Programm in allen Netzwerken eingesetzt werden, die Verbindungen als Laufwerk zu lassen (alle WINDOWS Versionen). Die GiS Software unterstützt nur den Zugriff

Mehr

Eine Einführung in C-Funktionen

Eine Einführung in C-Funktionen Eine Einführung in C-Funktionen CGK-Proseminar 2014 Philip Gawehn 04.07.2014, Hamburg Inhaltsverzeichnis 1 Einleitung 2 2 Grundlagen 2 2.1 Der Aufbau einer Funktion....................... 2 2.2 Schlüsselwörter.............................

Mehr