JaMP Implementierung eines OpenMP Dialektes im DSM System Jackal

Größe: px
Ab Seite anzeigen:

Download "JaMP Implementierung eines OpenMP Dialektes im DSM System Jackal"

Transkript

1 JaMP Implementierung eines OpenMP Dialektes im DSM System Jackal Studienarbeit im Fach Informatik vorgelegt von Matthias Bezold angefertigt am Institut für Informatik Lehrstuhl für Informatik 2 Programmiersysteme Friedrich-Alexander-Universität Erlangen Nürnberg (Prof. Dr. M. Philippsen) Betreuer: Dipl.-Inf. Michael Klemm Ph.D. Ronald Veldema Prof. Dr. Michael Philippsen Beginn der Arbeit: 1. Dezember 2004 Abgabe der Arbeit: 18. April 2005

2

3 Ich versichere, dass ich die Arbeit ohne fremde Hilfe und ohne Benutzung anderer als der angegebenen Quellen angefertigt habe und dass die Arbeit in gleicher oder ähnlicher Form noch keiner anderen Prüfungsbehörde vorgelegen hat und von dieser als Teil einer Prüfungsleistung angenommen wurde. Alle Ausführungen, die wörtlich oder sinngemäß übernommen wurden, sind als solche gekennzeichnet. Der Universität Erlangen-Nürnberg, vertreten durch die Informatik 2 (Programmiersysteme), wird für Zwecke der Forschung und Lehre ein einfaches, kostenloses, zeitlich und örtlich unbeschränktes Nutzungsrecht an den Arbeitsergebnissen der Studienarbeit einschließlich etwaiger Schutzrechte und Urheberrechte eingeräumt. Erlangen, den 18. April 2005 Matthias Bezold

4

5 Studienarbeit Thema: JaMP Implementierung eines OpenMP Dialektes im DSM System Jackal Hintergrund: Für Shared Memory Systeme existieren zahlreiche Compiler, die es dem Programmierer erlauben, ein sequentielles Programm mittels Compiler Direktiven zu parallelisieren. Der Compiler unternimmt hierbei die nötigen Schritte, um einen als parallel ausführbar markierten Programmteil ohne weiteres Zutun des Programmierers auf mehrere parallel ablaufende Threads aufzuteilen. Ein Beispiel hierfür ist der OpenMP Standard. Die automatische Parallelisierung beruht auf der Tatsache, dass alle Threads den gleichen Adressraum sehen und so auf einen gemeinsamen Speicherbereich zugreifen können. Das Jackal System bietet mit seiner Implementierung eines DSMs (Distributed Shared Memory) für Java eine Umgebung, die als Basis für diese Art von automatischer Parallelisierung (auch im Cluster) dienen kann. Aufgabenstellung: Im Rahmen der Studienarbeit soll das Jackal System um eine (partielle) OpenMP Implementierung erweitert werden. Die von OpenMP geforderten Direktiven sind auf Verträglichkeit mit dem Java Memory Model (JMM) zu untersuchen und (soweit möglich) dem JMM entsprechend zu implementieren. Die wesentlichen Direktiven des Standards müssen auf das Jackal System übertragen werden. Hierzu ist der existierende Java Compiler in Jackal geeignet zu erweitern, so dass die Übersetzung der neuen Direktiven möglich wird. Die Implementierung soll weiterhin Möglichkeiten zur automatischen Erzeugung von Threads zur Ausführung der parallelen Regionen (Schleifen, Abschnitte) bereitstellen sowie die Reduktion von parallel berechneten Zwischenergebnissen erlauben. Abschließend soll untersucht werden, wie das dynamische Hinzufügen und Entfernen von Cluster Knoten zum/vom ausgeführten Programm unterstützt werden kann. Meilensteine: Einarbeitung in den Compiler Erzeugung von Threads (omp parallel) Einbinden von private/shared Variablen Unterstützung von Schleifen (omp for), Zuteilung dynamisch und statisch Unterstützung von Sektionen

6 optimierte Reduktionen Anpassung zum dynamischen Hinzufügen/Entfernen von Knoten aus dem Cluster Messungen Ausarbeitung Literatur: J. Obdržálek, M. Bull JOMP Application Program Interface Version 1.1 (draft), 25. August, 2000 Betreuung: Bearbeiter: Michael Klemm, Dipl. Inf. und Ronald Veldema, Ph.D. Matthias Bezold

7 Zusammenfassung Bei OpenMP handelt es sich um ein Programmiermodell für die Sprachen C/C++ und Fortran, welches eine einfache und flexible Schnittstelle zur Entwicklung von Shared Memory Anwendungen bietet. In dieser Arbeit präsentieren wir eine OpenMP Implementation, die sich zum einen davon von anderen unterscheidet, dass sie den OpenMP Standard an Java anpasst, und zum anderen, dass sie in einem DSM System umgesetzt wurde, um die Eignung von OpenMP für solche Systeme zu prüfen. Die Basis für JaMP bildet das Übersetzersystem Jackal, welches Java Quellprogramme in Maschinenprogramme für eine ganze Reihe von Architekturen übersetzen kann. Jackal verfügt dabei auch über die Fähigkeit, ein Rechnerbündel mit Hilfe eines speziellen Laufzeitsystems als DSM System nutzen zu können. Für die Implementation von JaMP wurde der Übersetzer Jackal um die Fähigkeit erweitert, parallele Programme aus sequentiellen Quellprogrammen zu erzeugen, die mit speziellen Kommentaren, so genannten Pragmas, angereichert wurden. Mit Hilfe dieser Pragmas ist es möglich, einzelne Programmabschnitte zu markieren, die parallel ausgeführt werden sollen. Innerhalb dieser Regionen können wiederum Abschnitte angegeben werden, die von nur einem Kontrollfaden ausgeführt werden sollen. Außerdem bietet JaMP eine Unterstützung für Schleifen, durch welche die Schleifeniterationen auf die laufenden Kontrollfäden aufgeteilt werden können, so dass jede Iteration der Schleife nur einmal ausgeführt wird, und nicht einmal von jedem Kontrollfaden. Teilergebnisse, die von den einzelnen Kontrollfäden berechnet wurden, können mit dem so genannten Reduktions Mechanismus zusammengefasst werden. Ein wichtiger Teil dieser Arbeit ist nicht nur die Portierung des OpenMP Standards für die Programmiersprache Java, sondern auch dessen Verwendung für ein DSM System. Die Basis hierfür bildet das System Jackal. Im Rahmen dieser Arbeit wurde weiterhin das Entfernen und das Hinzufügen von Kontrollfäden während der Ausführung eines parallelen Abschnitts untersucht. Hierzu wurden neue Methoden zum Laufzeitsystem von JaMP hinzugefügt, die es erlauben, Kontrollfäden zur Laufzeit zu entfernen. Das Hinzufügen von Kontrollfäden könnte Teil einer auf dieser Implementation aufbauenden Arbeit sein. In verschiedenen Benchmarks wurde gezeigt, dass die Geschwindigkeit von Programmen, die unter Verwendung von JaMP parallelisiert wurden, mit der Geschwindigkeit von manuell parallelisierten Programmen vergleichbar ist. i

8 ii

9 Inhaltsverzeichnis 1 Einleitung Hintergrund Überblick über parallele Systeme Jackal Ein Distributed Shared Memory System OpenMP JaMP Gliederung JaMP OpenMP für Jackal Kennzeichnung von Abschnitten Parallele Abschnitte Zuweisung von Daten Schleifen Reduktionen Weitere Konstrukte Ausführung mit nur einem Kontrollfaden Abschnitte Barrieren Kritische Abschnitte Unterschiede zu OpenMP Hinweise zum Arbeiten mit JaMP Zusammenfassung Implementation Allgemeine Struktur des Jackal Systems Parallele Regionen Datenübergabe an Kontrollfäden Zugriff auf private Variablen iii

10 Inhaltsverzeichnis Zugriff auf gemeinsame Variablen Transformation von Reduktionen Transformation von Schleifen Statische Blockzuteilung Dynamische Blockzuteilung Geführte Blockzuteilung Implementation weiterer Funktionen Barrieren Ausführung durch nur einen Kontrollfaden Umsetzung der Regionenstruktur Zusammenfassung Benchmarks Testumgebung Mikro Benchmarks Einfacher Raytracer Matrix Summe Java Grande Benchmark Weitere Benchmarks Optimierungsmöglichkeiten Zusammenfassung Verwandte Arbeiten und Ausblick Verwandte Arbeiten Parallele Programmiermodelle OpenMP OpenMP für Java OpenMP für DSM Systeme Weitere Implementationen Dynamische Veränderung der Anzahl von Kontrollfäden Entfernen von Kontrollfäden Hinzufügen von Kontrollfäden Ausblick Zusammenfassung 59 iv

11 Inhaltsverzeichnis A Anhang: JaMP Referenz 61 A.1 parallel Konstrukt A.2 Konstrukte zur Arbeitsteilung A.2.1 for Konstrukt A.2.2 sections Konstrukt A.2.3 single Konstrukt A.3 Hauptkontrollfaden und Synchronisation A.3.1 master Konstrukt A.3.2 critical Konstrukt A.3.3 barrier Direktive A.4 Attribute A.4.1 default A.4.2 firstprivate A.4.3 lastprivate A.4.4 nowait A.4.5 num threads A.4.6 private A.4.7 reduction A.4.8 schedule A.4.9 shared A.5 Laufzeitsystem A.5.1 setnumthreads() A.5.2 getnumthreads() A.5.3 getmaxthreads() A.5.4 getthreadnum() A.5.5 getnumprocs() A.5.6 inparallel() A.5.7 setdynamic() A.5.8 getdynamic() A.5.9 setnested() A.5.10 getnested() B Anhang: Unterschiede zwischen JaMP und OpenMP 75 v

12 Inhaltsverzeichnis vi

13 Abbildungsverzeichnis 1.1 Summe einer Reihnung in C++ mit OpenMP Parallelisierung Gerüst eines JaMP Progammes Das Konstrukt parallel Schematische Darstellung von parallelen Abschnitten Das Attribut num threads Die Attribute private und shared Private und gemeinsame Variablen Beispiel für private, firstprivate und shared Deklaration eines for Konstruktes Ablauf einer Reduktion Reduktion in einer Reihungs Summenberechnung Skizze einer Reduktion Die Direktiven master und single Das Konstrukt sections Die Direktive barrier Das Konstrukt critical Verschachtelte Schleifen Produktschleife zu Abbildung Transformation eines parallelen Abschnitts Beispiel für firstprivate Variable Transformierter Zugriff auf eine firstprivate Variable Zugriff auf gemeinsame Variable i Transformierter Zugriff auf eine gemeinsame Variable Einteilung des Iterationsraumes in Blöcke Gerüst einer statisch zugeteilten Schleife single Konstrukt vor der Transformation single Konstrukt nach der Transformation Aufbau der Regionenhierarchie Laufzeit zu Benchmark Raytracing Beschleunigung zu Benchmark Raytracing vii

14 Abbildungsverzeichnis 4.3 Ausschnitt des Matrix Summen Programmes Laufzeit zu Benchmark Matrix Summe Effizienz zu Benchmark Matrix Summe Laufzeit zu Benchmark Series Beschleunigung zu Benchmark Series Laufzeit zu Benchmark SparseMatrixMultiplication Beschleunigung zu Benchmark SparseMatrixMultiplication Direkte Übersetzung Übersetzung mit Vorübersetzer Beispielprogramm zum Entfernen eines Kontrollfadens viii

15 Tabellenverzeichnis 1.1 Überlick über die Typen von parallelen Systemen Variablenwerte zu Abbildung Vorbelegungen der Reduktionsoperationen Mögliche Kombinationen für eine Reduktion Messergebnisse zu Benchmark Raytracing Messergebnisse zu Benchmark Matrix Summe Messergebnisse zu Benchmark Series Messergebnisse zu Benchmark SparseMatrixMultiplication A.1 Kanonische Form der Schleife A.2 Ablauftypen des for Konstruktes A.3 Vorbelegung bei einer Reduktion A.4 Mögliche Kombinationen für eine Reduktion ix

16 Tabellenverzeichnis x

17 1. Einleitung 1.1. Hintergrund Trotz der rasanten Entwicklung von Rechnern in den letzten Jahrezehnten ist der Bedarf an leistungsfähigen Rechenanlagen ungebrochen und Großrechner sind gefragter denn je. Im letzten halben Jahr wurden zwei Rechner BlueGene/L am Department of Energy von IBM sowie das System Columbia der NASA von SGI [14] in Betrieb genommen, die beide den bisher schnellsten Rechner, den Earth Simulator von NEC am Earth Simulation Center in Yokohama, übertreffen. Neben den Hochleistungssystemen erfreuen sich aber auch kleinere, oft Linux basierte Rechnerbündel dank Systemen wie Beowulf [2] immer größerer Beliebtheit, da die Anschaffungskosten aufgrund der Verwendung von Standardkomponenten nur noch einen Bruchteil der Kosten früherer Hochleistungsrechner betragen. Allerdings ist die Programmierung von parallelen Systemen mit deutlich mehr Aufwand verbunden als die Entwicklung von Programmen für Einprozessorsysteme, da ein Entwickler sich selbst zusätzlich zur Implementation seines Programmes um dessen Parallelisierung kümmern muss. Da die Anwendungen, die auf diesen Systemen genutzt werden, oft aus dem wissenschaftlichen bzw. ingenieurtechnischen Bereich kommen, ist es wünschenswert, dass die Programmierung vom Wissenschaftler selbst durchgeführt werden kann und dabei möglichst wenig Zeit und Fachkenntnis für die Parallelisierung des Programmes aufgewendet werden muss. Eine Möglichkeit, die Entwicklung dabei zu unterstützen, ist OpenMP [20], ein Standard zur einfachen und flexiblen Parallelisierung sequentieller Programme. In dieser Arbeit soll der OpenMP Standard für das DSM System Jackal implementiert werden. Sie unterscheidet sich dabei von bisherigen OpenMP Implementationen dadurch, dass zum einen die OpenMP Spezifikation für die Sprache Java übernommen wird. Zum anderen handelt es sich bei JaMP um eine Umsetzung des OpenMP Standards für DSM Systeme, für welche die OpenMP Spezifikation ursprünglich nicht ausgelegt ist Überblick über parallele Systeme Diese Arbeit bewegt sich im Bereich der verteilten Systeme. Daher ist es hilfreich, zuerst einen Überblick über verschiedene Arten von parallelen Systemen zu geben. Diese lassen 1

18 1. Einleitung sich unter anderem nach der Art des Speicherzugriffes untergliedern. Tabelle 1.1 zeigt einen Überblick über die hier vorgestellten Systeme. Gemeinsamer Speicher (Shared Memory) Bei einem System mit gemeinsamem Speicher verfügen alle Rechner über einen gemeinsamen, einheitlichen Adressraum. Dies ist z.b. bei einem symmetrischen Mehrprozessorsystem (SMP) der Fall, bei dem ein Rechner über mehrere Prozessoren, aber nur über einen Arbeitsspeicher verfügt, der von allen Prozessoren gemeinsam genutzt wird. Da die für die Programmausführung nötigen Daten nur in einem Speicher vorhanden sind, müssen diese nicht zwischen den Programminstanzen abgeglichen werden. Die Programmierung eines Shared Memory Systems unterscheidet sich von der Programmierung eines Einprozessorsystems dadurch, dass der Programmierer diejenigen Abschnitte seines Quellprogrammes, die parallel ausgeführt werden sollen, mit mehreren Kontrollfäden ausführt und dabei selbst für die Erzeugung dieser Kontrollfäden sorgt. Dazu können spezielle Bibliotheken verwendet werden (siehe dazu Kapitel 5.1.1). Da kein Datenaustausch über ein Netzwerk stattfinden muss, sind die Latenzzeiten von Shared Memory Systemen gering. Im Vergleich zu anderen Systemen sind allerdings die maximale Anzahl von Prozessoren sowie die Speichergröße begrenzt. Verteilter Speicher (Distributed Memory) In Systemen mit verteiltem Speicher verfügt jeder Rechner über eigenen Speicher mit eigenem Adressraum, der aber von allen Rechnern genutzt wird. Gemeinsam genutzte Daten müssen dabei vom Programmierer an die einzelnen Programminstanzen zugewiesen und zwischen diesen abgeglichen werden, wozu es verschiedene Bibliotheken gibt (z.b. MPI [13]). Dies bedeutet aber einen wesentlichen Mehraufwand, da zusätzlich zur Erzeugung der Prozesse auch der Datenaustausch zwischen diesen implementiert werden muss. Prozesse können auf unterschiedlichen Rechnern laufen und jeweils aus mehreren Kontrollfäden bestehen. Die Größe des verwendbaren Arbeitsspeichers ist bei Distributed Memory Systemen um ein Vielfaches höher als bei Shared Memory Systemen. Jedoch ist auch die Latenzzeit beim Zugriff auf den Speicher wesentlich größer, da die Daten nicht über einen internen Systembus, sondern beispielsweise über ein wesentlich langsameres Netzwerk ausgetauscht werden müssen. Verteilter gemeinsamer Speicher (Distributed Shared Memory) Wie der Name schon andeutet, verbindet ein System mit verteiltem gemeinsamem Speicher (Distributed Shared Memory, DSM) die Vorteile der beiden vorher genannten Modelle. Durch eine zusätzliche Hardware oder Software Schicht (H DSM bzw. S DSM) wird der verteilte Speicher zu einem virtuellen gemeinsamen Speicher. Die Verteilung der Daten, die bei einem DSM System vorgenommen werden muss, geschieht automatisch und für den Programmierer transparent. Somit ist der Aufwand für die Programmierung in einem DSM System mit dem für ein Shared Memory System vergleichbar. Nahezu alle großen 2

19 1.3. Jackal Ein Distributed Shared Memory System Shared M. Distributed M. DSM Speichergröße gering hoch hoch Anzahl CPUs gering hoch hoch Zugriff sehr schnell langsam langsam Programmieraufwand mittel hoch mittel Tabelle 1.1.: Überlick über die Typen von parallelen Systemen. parallelen Systeme mit gemeinsamem Speicher und einer großen Anzahl von Prozessoren fallen in diese Kategorie Jackal Ein Distributed Shared Memory System Bei Jackal [26] handelt es sich um ein Übersetzersystem, das ein virtuelles DSM System durch eine zusätzliche Softwareschicht erzeugt. Als Knoten für dieses System können die Rechner eines beliebigen, vernetzten Rechnerbündels dienen. Jackal übersetzt Java Programme in Maschinenprogramme für verschiedene Architekturen, so z.b. für IA32, IA64, AMD64 oder PowerPC. Java Programme werden mit Hilfe der Java Threading API parallelisiert, indem die Programmabschnitte, die parallel ausgeführt werden sollen, in eine Klasse eingefügt werden, die von der Klasse java.lang.thread abgeleitet ist. Solche Java Programme können mit Jackal ohne Änderungen am Quellprogramm von einem Mehrprozessorsystem auf einen Rechnerbündel übernommen werden. Bei der Übersetzung werden in das Programm zusätzliche Befehlssequenzen, so genannte Access Checks, eingefügt, durch die bei jedem Zugriff auf gemeinsam genutzte Objekte sichergestellt wird, dass diese auf allen Knoten verfügbar sind, die darauf zugreifen [26]. Die Daten werden dabei automatisch auf dem gleichen Stand gehalten. Änderungen, die an einem Rechner vorgenommen werden, werden so an alle anderen Knoten weitergegeben und automatisch über das Netzwerk mit Hilfe einer Message Passing Bibliothek ausgetauscht (siehe dazu Kapitel 5.1.1). Neu angelegte Kontrollfäden werden automatisch auf dem Rechnerbündel verteilt, so dass alle vorhandenen Knoten in den Programmablauf einbezogen werden. Dazu wird beim Hinzufügen eines weiteren Kontrollfadens bestimmt, auf welchem Knoten dieser ausgeführt werden soll. Für den Programmierer geschieht dies vollkommen transparent und die Programme bleiben weiterhin Java konform. Eine Besonderheit von Jackal ist die Plattform Heterogenität, die es möglich macht, einen Rechnerbündel aus verschiedenen Knoten der unterstützten Architekturen als DSM System zu verwenden. 3

20 1. Einleitung 1 const int s i z e = 100; 2 3 int main ( ) { 4 int a r r = new int [ s i z e ] ; 5 int i = 0 ; int sum = 0 ; 6 7 // I n i t i a l i s i e r u n g 8 for ( int i = 0 ; i < s i z e ; i ++) a r r [ i ] = i ; 9 10 // Berechnung der Summe 11 #pragma omp parallel for shared ( a r r ) reduction (+:sum) 12 for ( i = 0 ; i < s i z e ; i ++) 13 sum += a r r [ i ] ; 14 } Abbildung 1.1.: Summe einer Reihnung in C++ mit OpenMP Parallelisierung OpenMP Es wäre wünschenswert, den Übersetzer die Parallelisierung des Programmes automatisch vornehmen zu lassen. Solche Übersetzer sind allerdings nur mit großem Aufwand zu realisieren [8], da erkannt werden muss, welche Abschnitte sich für eine parallele Ausführung eignen. Ein einfacherer Ansatz ist, den Programmierer diese parallelen Abschnitte markieren zu lassen. Eine Möglichkeit für diese halbautomatische Parallelisierung ist der Standard OpenMP. OpenMP [20] ist ein herstellerunabhängiger Standard, der aus einer Entwicklung von SGI hervorging und nun von einem Gremium weiterentwickelt wird. Es stellt den De facto Standard zur herstellerunabhängigen Parallelisierung von Programmen für parallele Systeme dar. Der OpenMP Standard beschreibt für die Sprachen C/C++ und Fortran Erweiterungen in Form von Metakommentaren, mit denen parallele Abschnitte markieren werden können und die es dem Übersetzer ermöglichen, eine Parallelisierung des Programmes vorzunehmen. Abbildung 1.1 zeigt ein einfaches C++ Programm, das die Summe einer Reihung errechnet. Durch den OpenMP Kommentar (Zeile 11) wird, wenn das Programm mit einem OpenMP fähigen Übersetzer kompiliert wird, automatisch eine parallele Version erzeugt, deren Ausführung unter Verwendung mehrerer Kontrollfäden abläuft. 4

21 1.5. JaMP 1.5. JaMP Auch wenn die OpenMP Spezifikation DSM Systeme nicht berücksichtigt, so ist Open- MP doch eine realisierbare Erweiterung für Jackal. So wie Jackal dem Programmierer die Daten und Prozessverteilung abnimmt, so ermöglicht OpenMP eine halbautomatische Parallelisierung des Programmes. Aus diesem Grund ist es Ziel dieser Arbeit, eine an Jackal angepasste OpenMP Version, JaMP, zu implementieren. JaMP soll es ermöglichen, Programme schneller und einfacher zu parallelisieren. Dazu soll es möglich sein, einzelne Abschnitte des Programmes von mehreren Kontrollfäden parallel ausführen zu lassen. In dem parallelen Programmteil wird auf Variablen zugegriffen, die vor diesem definiert wurden. Für diese Variablen soll festgelegt werden können, welche von allen Kontrollfäden gemeinsam genutzt werden und für welche für jeden Kontrollfaden eine eigene Kopie angelegt wird. Bei Schleifen sollte jeder Iterationsschritt nur einmal ausgeführt werden. Der Iterationsraum der gesamten Schleife muss dazu auf die laufenden Kontrollfäden aufgeteilt werden. Bei anderen Abschnitten kann es nötig sein, deren Ausführung auf einzelne Kontrollfäden zu beschränken (z.b. Bildschirmausgaben). Weiterhin sind zur Ablaufsteuerung Barrieren und kritische Abschnitte nötig, die nur von einem Kontrollfaden gleichzeitig betreten werden können (z.b. Dateisystemzugriff) Gliederung Nach dieser Einführung wird in Kapitel 2 auf JaMP als Implementierung eines OpenMP Dialektes im Software DSM System Jackal eingegangen und ein Überblick über dessen Funktionalität gegeben. Weiterhin werden die Unterschiede dieser Implementierung zum OpenMP Standard aufgezeigt. Kapitel 3 thematisiert Implementationsdetails und führt genauer in die bei der Umsetzung verwendeten Konzepte und Methoden ein. In Kapitel 4 folgt eine Betrachtung der Leistungsfähigkeit von JaMP in Form von Benchmarks, mit denen die Geschwindigkeit von JaMP untersucht und im Vergleich zu anderen Parallelisierungsmethoden betrachtet werden soll. Kapitel 5 gibt schließlich einen Überblick über verwandte Arbeiten und gibt einen Ausblick darüber, welche Folgearbeiten im Zusammenhang mit dieser Arbeit möglich sind. Im Anhang findet sich abschließend eine Referenz aller JaMP Konstrukte sowie eine Liste der Unterschiede zwischen der Implementierung von JaMP und der OpenMP Spezifikation. 5

22 1. Einleitung 6

23 2. JaMP OpenMP für Jackal Mit JaMP soll es möglich sein, Java Programme mit wenig Aufwand zu parallelisieren. Die an einem Programm nötigen Anpassungen sollen möglichst gering ausfallen und es soll auch nach der Modifikation des Programmes weiterhin möglich sein, dieses mit einem Java Übersetzer, der über keine JaMP Unterstützung verfügt, übersetzen zu lassen. So kann eine serielle Version des Programmes entwickelt werden; zu diesem Programm können Markierungen hinzugefügt werden, die einen JaMP fähigen Übersetzer veranlassen, das Programm in eine parallele Version zu transformieren. Im folgenden werden Programme, die JaMP Direktiven enthalten, als JaMP Programme bezeichnet. Um JaMP Programme mit Jackal zu übersetzen, muss der Kommandozeilenparameter -jamp angegeben werden. Dieses Kapitel soll eine Einführung und einen Überblick über JaMP und dessen Funktionalität geben. Eine vollständige Referenz aller Konstrukte, Direktiven und Attribute findet sich in Anhang A. Auch das Laufzeitsystem, welches weitergehende Unterstützung und Schnittstellen für ein JaMP Programm zur Verfügung stellt, ist in Anhang A dokumentiert Kennzeichnung von Abschnitten Wie bereits in der Einleitung beschrieben, ist OpenMP [20] für C/C++ und Fortran spezifiziert. Bei Jackal handelt es sich jedoch um einen Übersetzer für Java Programme. Da die Unterschiede zwischen Java und C++ im Bezug auf eine mögliche OpenMP Implementierung gering sind, lehnt sich die Implementierung von JaMP an Version 2.0 der OpenMP Spezifikation für C/C++ an. Unterschiede, die zum Teil auf die Verwendung von Java anstelle von C++, aber auch auf den engen Rahmen dieser Arbeit zurückzuführen sind, werden im Abschnitt Unterschiede zu OpenMP am Ende dieses Kapitels beschrieben. In C++ können mit dem Pragma Mechanismus Metakommentare in ein Programm eingefügt werden. Diese Kennzeichnungen werden von einem OpenMP fähigen Übersetzer erkannt und das Programm wird entsprechend transformiert. Da Java über keinen solchen Pragma Mechanismus verfügt und da die Java Konformität von JaMP Programmen auch weiterhin gewährleistet werden soll, haben Pragmas in Jackal die Form von speziell gekennzeichneten Kommentaren: //#pragma <Kennzeichnung=jamp> <Konstruktname> <Attribute> 7

24 2. JaMP OpenMP für Jackal 1 public c l a s s Test { 2 public void foo ( ) { 3 // Java Programm 4 //#pragma jamp <Konstruktname> <Attribute > 5 { 6 // Dieser A b s c h n i t t s o l l von 7 // JaMP m o d i f i z i e r t werden... 8 } 9 // Java Programm 10 } 11 } Abbildung 2.1.: Gerüst eines JaMP Progammes. Auf die Pragma Deklaration folgt eine Kennzeichnung, um verschiedene Pragma Typen voneinander unterscheiden und in einem Programm verwenden zu können. Pragmas werden in Jackal beispielsweise auch für das Zusammenfügen von Objekten [27] genutzt. Für JaMP Pragmas wird die Kennzeichnung jamp verwendet. Der Konstruktname dient zur Unterscheidung verschiedener JaMP Konstrukte bzw. Direktiven. Als Konstrukt werden dabei Blöcke bezeichnet, die sich auf eine Reihe von Programminstruktionen beziehen. Konstrukte benötigen einen zugehörigen Java Block, der durch geschweifte Klammern ({ und }) gekennzeichnet ist. Ohne diese Klammerung ist es in Jackal nicht möglich, die einzelnen Instruktionen der Zwischensprache einer Java Anweisung zuzuordnen. Dieser Block muss direkt auf die Konstruktdeklaration folgen. Auch wenn ein Block nur aus einer einzigen Instruktion besteht, muss dieser mit Klammern umgeben werden. Pragma Anweisungen, die keinen Programmabschnitt zugeordnet haben, werden als Direktiven bezeichnet. Auf den Konstruktnamen können Attribute folgen, deren Werte an das Konstrukt übergeben werden. Konstrukte und Direktiven sind nur innerhalb von Methoden erlaubt. Abbildung 2.1 zeigt das Grundgerüst eines parallelen Abschnitts in einem JaMP Programm. Die Methode mit dem Namen foo() innerhalb der Klasse Test enthält einen Abschnitt, der von JaMP transformiert werden soll. Dazu wird dieser Programmteil mit dem gewünschten Konstrukt umgeben. Bei den folgenden Beispielen wird aus Platzgründen auf die Angabe von Klassen sowie Methodendeklarationen verzichtet Parallele Abschnitte Eine wichtige Aufgabe von JaMP ist es, einen Abschnitt eines Programmes parallel auszuführen. Parallel bedeutet hierbei, dass diese Abschnitt nicht nur mit einem Kontrollfaden, sondern mit einer ganzen Gruppe von Kontrollfäden ausgeführt wird. Um 8

25 2.2. Parallele Abschnitte //#pragma jamp parallel 3 { 4 System. out. p r i n t l n ( Hallo Welt ) ; 5 } 6... Abbildung 2.2.: Das Konstrukt parallel. JaMP mitzuteilen, dass ein Abschnitt parallel ausgeführt werden soll, wird dieser mit einem parallel Konstrukt umgeben. Ein Beispiel hierzu zeigt Abbildung 2.2. Wie Abbildung 2.3 schematisch zeigt, wird dabei der Teil des Programmes, der sich innerhalb des Konstruktes befindet, von jedem der erzeugten Kontrollfäden ausgeführt. Wird dieses Programm mit JaMP Untertützung übersetzt und ausgeführt, so wird in diesem Beispiel der Text Hallo Welt nicht nur einmal, sondern jeweils einmal von jedem Kontrollfaden aus der Gruppe am Bildschirm ausgegeben. Der auf den parallelen Abschnitt folgende Programmteil wird wiederum von nur einem Kontrollfaden ausgeführt. Während der Ausführung des parallelen Abschnitts wartet der Kontrollfaden, von dem aus die Gruppe generiert wurde, darauf, dass die erzeugten Kontrollfäden jeweils mit der Ausführung des Programmabschnitts fertig sind und fährt dann erst mit der Ausführung fort. Dieser Kontrollfaden ist in der Abbildung als gestrichelte Linie dargestellt. Jedem Kontrollfaden wird eine eindeutige, bei 0 beginnende Nummer zugewiesen. Dabei wird der Kontrollfaden mit der Nummer 0 als Hauptkontrollfaden bezeichnet, was in der Abbildung durch den etwas kräftigeren Pfeil auf der linken Seite dargestellt ist. Einige Aufgaben, die nur einmal ausgeführt werden dürfen, werden von diesem Kontrollfaden durchgeführt, beispielsweise die Wiederherstellung von gemeinsamen Variablen nach dem Verlassen einer parallelen Region oder Reduktionen. Es gibt verschiedene Möglichkeiten, die Anzahl der für eine Gruppe erzeugten Kontrollfäden zu beeinflussen. Zuerst steht hierzu das Attribut num_threads zur Verfügung, mit dem die Anzahl der Kontrollfäden direkt im Quellprogramm angegeben werden kann (Abbildung 2.4). Der Abschnitt, der sich in der parallel Umgebung befindet, wird in diesem Beispiel von fünf Kontrollfäden ausgeführt. Der Wert des num_threads Attributs kann entweder eine Ganzzahl oder eine Variable vom Typ int sein. Eine weitere Möglichkeit, die Anzahl der Kontrollfäden festzulegen, bietet das Laufzeitsystem über die Methode setnumthreads() (Anhang A.5.1). Außerdem wird die Eigenschaft JAMP_NUM_THREADS des Java Systems ausgewertet, die beim Start des Programmes über den Kommandozeilenparameter -DJAMP_NUM_THREADS=<...> übergeben werden kann. Dabei wird dem num_threads Attribut vor den anderen Möglichkeiten und der Methode setnumthreads() gegenüber dem Parameter JAMP_NUM_THREADS der Vorzug gegeben. 9

26 2. JaMP OpenMP für Jackal Abbildung 2.3.: Schematische Darstellung von parallelen Abschnitten //#pragma jamp parallel num threads(5) 3 { 4 System. out. p r i n t l n ( Hallo Welt ) ; 5 } 6... Abbildung 2.4.: Das Attribut num threads. 10

27 2.3. Zuweisung von Daten int a ; int b ; int c ; //#pragma jamp parallel private ( a, b ) shared ( c ) 5 { 6 a = 5 ; // Zuweisung an p r i v a t e Variable 7 b = 5 ; // Zuweisung an gemeinsame Variable 8 } 9... Abbildung 2.5.: Die Attribute private und shared. Wurde die Anzahl der Kontrollfäden mit keiner der hier genannten Möglichkeiten angegeben, so werden standardmäßig zehn Kontrollfäden erzeugt. Es ist möglich, verschachtelte parallele Regionen zu verwenden, also parallele Regionen, die im lexikalischen Bereich einer anderen parallelen Region enthalten sind. Das Standardverhalten ist, dass eine innere Region mit nur einem Kontrollfaden ausgeführt wird, da sich die Anzahl der laufenden Kontrollfäden sonst sehr schnell vergrößern kann. Dieses Verhalten kann durch die Methode setnested() im Laufzeitsystem (Anhang A.5.9) beeinflusst werden. Wird dieser Wert auf true gesetzt, so wird eine innere Region ebenfalls mit der angegebenen Anzahl von Kontrollfäden ausgeführt. Hierbei ist zu beachten, dass die Anzahl der laufenden Kontrollfäden sehr schnell ansteigen kann, wobei die maximale Anzahl an Kontrollfäden vom verwendeten Betriebssystem abhängt. Ausnahmen, die innerhalb der parallelen Region entstehen, müssen auch in dieser behandelt werden. Andernfalls wird das laufende Programm vom JaMP Laufzeitsystem beendet. Die Verwendung von Befehlen zur Kontrollfadensteuerung, wie wait() oder notifyall(), ist nicht erlaubt Zuweisung von Daten In parallelen Abschnitten muss es möglich sein, jedem Kontrollfaden entweder eine eigene Kopie einer Variablen zuweisen zu können oder alle Kontrollfäden auf eine gemeinsame Speicherstelle zugreifen zu lassen. Da Veränderungen an gemeinsamen Variablen in einem DSM System an alle Knoten weitergereicht werden müssen, ist die Latenz beim schreibenden Zugriff auf gemeinsame Daten hoch. Wenn es der Algorithmus erlaubt, sollte aus diesem Grund versucht werden, möglichst viele Variablen privat zu halten. Dazu werden die Variablen über Attribute im Pragma Kommentar entsprechend gekennzeichnet. Private Variablen werden mit den Attributen private oder firstprivate versehen, gemeinsame Variablen mit dem Attribut shared. Jedem dieser Attribute kann eine durch Kommata getrennte Liste von Variablen übergeben werden. Ein Beispiel hierzu zeigt 11

28 2. JaMP OpenMP für Jackal Abbildung 2.6.: Private und gemeinsame Variablen. Abbildung 2.5. Bei privaten Variablen ist ein Speicherplatz für jeden Kontrollfaden reserviert, bei gemeinsamen Variablen ein einziger Speicherplatz für alle Kontrollfäden. Dies verdeutlicht Abbildung 2.6. Wenn von einer gemeinsamen Speicherstelle von shared Variablen die Rede ist, so wird nur dann wirklich die selbe Speicherstelle verwendet, wenn das Programm auf einem Shared Memory System läuft. Ein DSM System dagegen sorgt automatisch und für den Nutzer transparent für einen Abgleich der Daten zwischen den einzelnen Knoten, so dass der Eindruck einer gemeinsamen Speicherstelle entsteht. Aus diesem Grund soll diese Bezeichnung auch für DSM Systeme verwendet werden. Private Variablen (private) Private Variablen verfügen in jedem Kontrollfaden über einen eigenen Speicherplatz. Bei primitiven Datentypen (int, double, usw.) wird dieser Speicherplatz nicht initialisiert, bei Objekten wird er mit dem Standardwert vorbelegt, der sich durch das Anlegen eines neuen Objektes und die Ausführung von dessen Standardkonstruktor ergibt. Ist kein Standardkonstruktor vorhanden, so kann ein Objekt nicht als private Variable verwendet werden. In diesem Fall kommt es zu einem Laufzeitfehler, da zur Übersetzungszeit nicht festgestellt werden kann, ob ein entsprechender Konstruktor vorhanden ist, da Jackal keine Möglichkeit zum Auslesen von Informationen über Konstruktoren zur Übersetzungszeit zur Verfügung stellt. Reihungen werden mit einer neu angelegten Reihung der gleichen Größe initialisiert, wobei die Werte der einzelnen Elemente nicht vorbelegt werden. Privat mit Vorbelegung (firstprivate) Soll für eine private Variable der Wert der Variablen aus der umgebenden Region bzw. der Wert vor der parallelen Region übernommen werden, so kann eine Variable als firstprivate deklariert werden. Bei primitiven Datentypen wird der Wert der Variable 12

29 2.3. Zuweisung von Daten in den neuen Speicherplatz kopiert, bei Objekten wird durch den Aufruf der clone() Methode eine Kopie erstellt. Dies setzt voraus, dass die Schnittstelle Cloneable implementiert wird. Ist dies nicht der Fall, so kann ein Objekt nicht als firstprivate Variable genutzt werden. Wie bei privaten Variablen kommt es in diesem Fall zu einem Laufzeitfehler. Reihungen können als firstprivate Variablen nicht verwendet werden und führen ebenfalls zu einem Laufzeitfehler. Gemeinsame Variablen (shared) Sollen alle Kontrollfäden auf eine gemeinsame Speicherstelle zugreifen, so kann die Variable als shared deklariert werden. Die Daten werden hierzu in einem für alle Kontrollfäden sichtbaren Speicherbereich abgelegt und nach der Ausführung der parallelen Region wieder an den ursprünglichen Speicherplatz zurückkopiert. Gemeinsame Variablen können nur an einem parallel Konstrukt deklariert werden. Ist der Typ einer Variablen nicht spezifiziert, so wird sie als gemeinsame Variable angesehen. Dieses Verhalten kann mit dem Attribut default (Anhang A.4.1) geändert werden. Die Variable this wird gesondert behandelt und dem parallelen Abschnitt direkt als Parameter übergeben, so dass ein Zugriff auf diese Variable nicht über das JampParam Objekt erfolgen muss. Es ist möglich, Variablen in verschachtelten Regionen mehrfach als privat zu deklarieren. So ist es z.b. möglich, eine Variable im parallel Konstrukt als gemeinsam und in einer darin enthaltenen anderen Region als privat zu deklarieren. Dies wird als Reprivatisierung bezeichnet. In diesem Fall wird für die Variable in der inneren Region ein neuer Speicherplatz reserviert. Abbildung 2.7 zeigt zur besseren Verdeutlichung hierzu ein weiteres Beispiel. Die Variablen a, b und c werden in einem parallelen Abschnitt jeweils um eins erhöht. Betrachten wir zunächst die Ausführung bis zu Zeile 10, in der die Variablen verändert werden. In Tabelle 2.1(a) befindet sich in jeder Spalte die Bildschirmausgabe eines Kontrollfadens. Da Variable a als private deklariert ist, ist ihr Anfangswert undefiniert und wird in diesem Beispiel mit 0 angenommen. Variable b erhält wie Variable a einen eigenen Speicherplatz, der mit dem Wert vorbelegt wird, den b vor der parallelen Region hatte, in diesem Fall mit dem Wert 2. Variable c wird auch aus dem umgebenden Bereich übernommen und hat somit in allen Kontrollfäden den Wert 3. Die Werte der Variablen nach deren Veränderung in Zeile 10 ist in Tabelle 2.1(b) zu sehen. Die Variablen a und b haben einen jeweils um eins höheren Wert als vor der Veränderung. Bei der Modifikation der Variablen c wird von allen Kontrollfäden jeweils auf den gleichen Speicherplatz zugegriffen und somit jeweils ein anderes Ergebnis erzielt. Dabei ist zu beachten, dass der Zugriff auf gemeinsame Variablen synchronisiert erfolgen sollte. Der Übersicht halber wurde dies in diesem Beispiel weggelassen. Die hierzu benötigten Methoden werden später in diesem Kapitel vorgestellt. Am Ende wird der gemeinsame Wert der Variablen c wieder an die ursprüngliche Speicherstelle kopiert, die neuen Werte von a und b werden verworfen. 13

30 2. JaMP OpenMP für Jackal int a = 1 ; int b = 2 ; int c = 3 ; 3 4 //#pragma jamp parallel num threads ( 3 ) \ 5 private ( a ) firstprivate ( b ) shared ( c ) 6 { 7 p r i n t ( a : + a ) ; 8 p r i n t ( b: + b ) ; 9 p r i n t ( c : + c ) ; 10 a++; b++; c++; 11 p r i n t ( a : + a ) ; 12 p r i n t ( b: + b ) ; 13 p r i n t ( c : + c ) ; 14 } Abbildung 2.7.: Beispiel für private, firstprivate und shared. Thr. 1 Thr. 2 Thr. 3 a: 0 a: 0 a: 0 b: 2 b: 2 b: 2 c: 3 c: 3 c: 3 (a) Vor der Änderung. Thr. 1 Thr. 2 Thr. 3 a: 1 a: 1 a: 1 b: 3 b: 3 b: 3 c: 4 c: 6 c: 5 (b) Nach der Änderung. Tabelle 2.1.: Variablenwerte zu Abbildung 2.7. Am Ende fast aller Konstrukte (siehe dazu Anhang A) befindet sich eine implizite Barriere, an der die Kontrollfäden warten, bis alle Mitglieder der Gruppe die Ausführung des Abschnitts beendet haben. Mit dem Attribut nowait kann diese Barriere deaktiviert werden. In diesem Fall fährt ein Kontrollfaden mit der Ausführung fort, ohne auf die anderen Mitglieder der Gruppe zu warten Schleifen Wenn ein Programmabschnitt von mehreren Kontrollfäden parallel ausgeführt wird und jede Instruktion somit mehrfach ausgeführt wird, so ist es bei Schleifen wünschenswert, dass jede Iteration der Schleife nur einmal bearbeitet wird. Der Arbeitsbereich einer Schleife soll also auf die Kontrollfäden aufgeteilt werden. Dazu muss die Anzahl der Iterationen vor dem Betreten der Schleife berechnet werden. Damit dies möglich ist, wurden 14

31 2.4. Schleifen //#pragma jamp parallel 3 { 4 //#pragma jamp for 5 for ( < I n i t i a l i s i e r u n g >; <Bedingung >; <Inkrement > ) { 6 //... Berechnung 7 } 8 } 9... Abbildung 2.8.: Deklaration eines for Konstruktes. die im Schleifenkopf erlaubten Ausdrücke und Operationen zu einer kanonischen Form eingeschränkt (Abbildung 2.8). Dabei ist die Schleifeninvarianz dieser Ausdrücke eine Bedingung für die Vorbestimmung des Iterationsraumes einer Schleife. Bei verschachtelten Schleifen wird nur diejenige, die direkt auf das for Konstrukt folgt, transformiert, alle anderen werden nicht verändert. Initialisierung Die Initialisierung besteht aus einer einfachen Zuweisung zu einer Variablen vom Typ int, die auch erst an dieser Stelle deklariert werden darf. Sie hat also entweder die Form <Variable> = <Wert> oder int <Variable> = <Wert>. Andere Datentypen werden nicht unterstützt, wobei eine Unterstützung des Typs long möglich wäre, aber aus Zeitgründen nicht implementiert wurde. Die hier verwendete Variable ist automatisch privat und darf, abgesehen von einer Reduktion und dem Typ lastprivate, in keinem Attribut dieses Konstruktes vorkommen. Die selbe Variable muss auch im Bedingungs und im Inkrement Teil des Schleifenkopfes verwendet werden. Damit die Iterationszahl vor dem Schleifendurchlauf bestimmt werden kann, darf weiterhin die in der Initialisierung verwendete Variable im Schleifenrumpf nicht modifiziert werden. Bedingung In der Bedingung muss die in der Initialisierung verwendete Variable mit einem schleifeninvarianten Ausdruck verglichen werden: <Variable> <Operator> <schleifeninvarianter Ausdruck> Als Operatoren stehen <, <=, > und >= mit der üblichen Semantik zur Verfügung, andere Vergleiche sind nicht erlaubt. Der Ausdruck kann entweder ein konstanter ganzzahliger Wert oder eine Variable vom Typ int sein. Komplexere Ausdrücke können 15

32 2. JaMP OpenMP für Jackal verwendet werden, indem diese vor der Schleife in eine temporäre Variable geschrieben werden, die dann als schleifeninvarianter Ausdruck verwendet wird. Inkrement Die in der Initialisierung verwendete Variable wird im Inkrement Ausdruck entweder um einen konstanten Ganzzahlwert oder um eine schleifeninvariante Variable vom Typ int erhöht oder erniedrigt. Es stehen also nur die Operationen + und - zur Verfügung. Steht die Anzahl der Schleifeniterationen fest, so können diese vor dem Betreten der Schleife auf die laufenden Kontrollfäden verteilt werden. Hierzu stehen verschiedene Ablauftypen zur Verfügung, die über das Attribut schedule ausgewählt werden können: //#pragma for schedule(<typ>[, <Blockgröße>]) Der angegebene Typ kann dabei den Wert static, dynamic oder guided haben. Unter einem Berechnungsblock, im folgenden nur Block genannt, versteht man einen zusammenhängenden Abschnitt des Iterationsraumes. Die Bedeutung des optionalen Wertes Blockgröße hängt vom verwendeten Typ ab, gibt aber in der Regel an, wie viele Iterationen zu einem Block zusammengefasst werden. Ist kein Typ angegeben, so wird eine statische Ablaufzuteilung verwendet. Statisch (static) Wird eine statische Ablaufplanung gewählt, so werden die Iterationen vor der Ausführung der Schleife fest den Kontrollfäden der Gruppe zugeteilt. Ist eine Blockgröße angegeben, so werden die Blöcke im so genannten Round Robin Verfahren aufgeteilt. Dabei bekommt jeder Kontrollfaden der Reihe nach einen Block, bis alle verteilt sind. Ist keine Blockgröße angegeben, so wird der Iterationsraum in gleich große Teile aufgeteilt, so dass jeder Kontrollfaden genau einen Block erhält. Lassen sich die Blöcke nicht genau auf die Kontrollfäden aufteilen, so erhält der letzte Kontrollfaden einen kleineren Block als die anderen. Dynamisch (dynamic) Bei der dynamischen Ablaufzuteilung wird der Iterationsraum in Blöcke der angegebenen Größe aufgeteilt. Hat ein Kontrollfaden die Bearbeitung des ihm zugeteilten Blocks beendet, so nimmt er sich den nächsten nicht bearbeiteten Block aus der Liste der noch unbearbeiteten Blöcke. Dies geschieht solange, bis der ganze Iterationsraum vollständig abgearbeitet wurde. Ist keine Blockgröße angegeben, so werden Blöcke der Größe eins erzeugt. 16

33 2.5. Reduktionen Geführt (guided) Diese Methode ähnelt der dynamischen Blockzuteilung, wobei jedoch die Größe der Blöcke von Iteration zu Iteration kleiner wird. Die Größe des ersten Blocks ist ein Drittel der Iterationszahl und sie halbiert sich jeweils im Vergleich zu der des vorhergehenden Blocks, wobei die angegebene Blockgröße als untere Schranke dient. Diese Art von Ablaufzuteilung bietet sich vor allem für Algorithmen an, deren Berechnungszeit pro Iterationselement mit zunehmender Iterationszahl deutlich steigt (z.b. Primzahlberechnung). Bei Schleifen steht zusätzlich zu private und firstprivate ein weiterer Variablentyp zur Verfügung: lastprivate. Ist eine Variable mit diesem Typ gekennzeichnet, so wird der Wert aus dem letzten Iterationsschritt in die gleichnamige Variable des umgebenden Konstruktes bzw. an den ursprünglichen Speicherplatz außerhalb der parallelen Region kopiert. So kann beispielsweise der letzte Wert der Zählvariablen der Schleife auch nach der Schleife noch verwendet werden Reduktionen Will man beispielsweise die Summe über eine Reihung bilden, so benötigt man eine gemeinsame Variable zur Aufsummierung des Ergebniswertes. In jeder Iteration liest jeweils ein Kontrollfaden den gemeinsamen Wert, verändert ihn und schreibt das Ergebnis wieder in die gemeinsame Variable zurück. Damit das Ergebnis korrekt ist, muss der Zugriff auf diese Variable synchronisiert geschehen, was die Berechnung verlangsamt. Eine bessere Lösung ist, die Teilsummen, die jeder Kontrollfaden berechnet, in eine private Variable zu schreiben und diese Teilergebnisse am Ende zusammenzufassen. Dieses Verfahren wird als Reduktion bezeichnet. Um eine Variable zu reduzieren, wird diese im Attribut reduction zusammen mit einer assoziativen Operation aufgeführt:...reduction(<operation>:<liste von Variablen>)... Tabelle 2.2 zeigt alle möglichen Operationen, deren Initialisierungswerte sowie deren semantische Bedeutung. Eine in einer Reduktion verwendete Variable ist automatisch privat. Allerdings ist deren Wert nicht undefiniert, sondern wird mit dem neutralen Element der gewählten Operation initialisiert. Eine Reduktion ist nur mit Variablen möglich, die einen primitiven Datentyp besitzen. Die möglichen Operationen hängen vom Datentyp ab, da nicht mit jedem Datentyp jede Operation möglich ist. Da in Java Operationen mit short und byte Variablen ein Ergebnis vom Typ int zurückliefern, ist mit ihnen keine Reduktion möglich. Alle gültigen Kombinationen aus Datentypen und Operationen zeigt Tabelle 2.3. Nachdem eine Region von allen Kontrollfäden abgearbeitet wurde und die Teilergebnisse in den jeweiligen privaten Variablen stehen, werden diese mit der angegebenen Operation zusammengefasst (Abbildung 2.9). Wird beispielsweise die Operation + 17

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

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

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 02: Klassen & Objekte Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil: Klassen Grundstruktur einer Java-Klasse Eigenschaften (Attribute) Variablen

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

Universität Karlsruhe (TH)

Universität Karlsruhe (TH) Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 Cluster-Praktikum Sommersemester 2007 Transparent Replizierte Objekte in JavaParty Institut für Programmstrukturen und Datenorganisation

Mehr

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden. Grundwissen Informatik Objekt Attribut Methoden Als Objekte bezeichnet man alle Gegenstände, Dinge, Lebewesen, Begriffe oder Strukturen unserer Welt ( Autos, Räume, Bakterien, Lehrer, Schüler, Kunden,

Mehr

Objektorientiertes Programmieren für Ingenieure

Objektorientiertes Programmieren für Ingenieure Uwe Probst Objektorientiertes Programmieren für Ingenieure Anwendungen und Beispiele in C++ 18 2 Von C zu C++ 2.2.2 Referenzen und Funktionen Referenzen als Funktionsparameter Liefert eine Funktion einen

Mehr

Die Programmiersprache C

Die Programmiersprache C Die Programmiersprache C höhere Programmiersprache (mit einigen Assembler-ähnlichen Konstrukten) gut verständliche Kommandos muss von Compiler in maschinenlesbaren Code (Binärdatei) übersetzt werden universell,

Mehr

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich 13 OOP MIT DELPHI Delphi war früher "Object Pascal". Dieser Name impliziert eine Funktionalität, welche in der Welt der Programmierung nicht mehr wegzudenken ist: die objektorientierte Programmierung,

Mehr

Prinzipien Objektorientierter Programmierung

Prinzipien Objektorientierter Programmierung Prinzipien Objektorientierter Programmierung Valerian Wintner Inhaltsverzeichnis 1 Vorwort 1 2 Kapselung 1 3 Polymorphie 2 3.1 Dynamische Polymorphie...................... 2 3.2 Statische Polymorphie........................

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

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

PIWIN 1 Übung Blatt 5

PIWIN 1 Übung Blatt 5 Fakultät für Informatik Wintersemester 2008 André Gronemeier, LS 2, OH 14 Raum 307, andre.gronemeier@cs.uni-dortmund.de PIWIN 1 Übung Blatt 5 Ausgabedatum: 19.12.2008 Übungen: 12.1.2009-22.1.2009 Abgabe:

Mehr

Grundlagen der Programmiersprache C++

Grundlagen der Programmiersprache C++ / TU Braunschweig Grundlagen der Programmiersprache C++ Um den Studierenden den Einstieg in die FE-Programmierung zu erleichtern werden die wesentlichen Elemente eines C-Programmes beschrieben, soweit

Mehr

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Inhalt dieser Einheit Variablen (Sinn und Aufgabe) Bezeichner Datentypen, Deklaration und Operationen Typenumwandlung (implizit/explizit) 2 Variablen

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

Einfache Rechenstrukturen und Kontrollfluss II

Einfache Rechenstrukturen und Kontrollfluss II Einfache Rechenstrukturen und Kontrollfluss II Martin Wirsing in Zusammenarbeit mit Moritz Hammer und Axel Rauschmayer http://www.pst.informatik.uni-muenchen.de/lehre/ss06/infoii/ SS 06 Ziele Lernen imperative

Mehr

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik Informatik I WS 2012/13 Tutorium zur Vorlesung 1. Alexander Zietlow zietlow@informatik.uni-tuebingen.de Wilhelm-Schickard-Institut für Informatik Eberhard Karls Universität Tübingen 11.02.2013 1. 2. 1.

Mehr

Einheit Variablen in der Programmiersprache C Variablen-Modell, Variablen-Vereinbarungen

Einheit Variablen in der Programmiersprache C Variablen-Modell, Variablen-Vereinbarungen Einheit Variablen in der Programmiersprache C Variablen-Modell, Variablen-Vereinbarungen Kurs C/C++ Programmierung, WS 2008/2009 Dipl.Inform. R. Spurk Arbeitsgruppe Programmierung FR 6.2 Informatik R.

Mehr

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf 16 Exceptions Zur Behandlung unerwarteter Situationen bietet Java Unterstützung in Form von Exceptions oder Ausnahmen. Den Sinn von Exceptions können wir Ihnen an einem kleinen Beispiel klarmachen. Nehmen

Mehr

Dr. Monika Meiler. Inhalt

Dr. Monika Meiler. Inhalt Inhalt 5 Referenzdatentypen - Felder... 5-2 5.1 Eindimensionale Felder - Vektoren... 5-3 5.1.1 Vereinbarung... 5-3 5.1.2 Referenzen sind keine Felder... 5-4 5.1.3 Kopieren eindimensionaler Felder... 5-6

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

Java Einführung Methoden in Klassen

Java Einführung Methoden in Klassen Java Einführung Methoden in Klassen Lehrziel der Einheit Methoden Signatur (=Deklaration) einer Methode Zugriff/Sichtbarkeit Rückgabewerte Parameter Aufruf von Methoden (Nachrichten) Information Hiding

Mehr

Vererbung & Schnittstellen in C#

Vererbung & Schnittstellen in C# Vererbung & Schnittstellen in C# Inhaltsübersicht - Vorüberlegung - Vererbung - Schnittstellenklassen - Zusammenfassung 1 Vorüberlegung Wozu benötigt man Vererbung überhaubt? 1.Um Zeit zu sparen! Verwendung

Mehr

Unterprogramme, Pointer und die Übergabe von Arrays

Unterprogramme, Pointer und die Übergabe von Arrays Unterprogramme, Pointer und die Übergabe von Arrays Unterprogramme Wie schon im Abschnitt über Funktionen erwähnt, versteht man unter einem Unterprogramm im engeren Sinn eine Prozedur, welche die Werte

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

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

J.5 Die Java Virtual Machine

J.5 Die Java Virtual Machine Java Virtual Machine Die Java Virtual Machine 22 Prof. Dr. Rainer Manthey Informatik II Java-Compiler und Java Virtual Machine Quellcode-Datei class C... javac D.java Java-Compiler - Dateien class class

Mehr

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11 Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11 Fakultät für Informatik Lehrstuhl 1 Dr. Lars Hildebrand Carla Delgado-Battenfeld Fatih Gedikli Tobias Marschall Benjamin Schowe

Mehr

IT- Handbuch für Fachinformatiker, 7. Auflage: Text- Lösungen Sascha Kersken

IT- Handbuch für Fachinformatiker, 7. Auflage: Text- Lösungen Sascha Kersken IT- Handbuch für Fachinformatiker, 7. Auflage: Text- Lösungen Sascha Kersken Im Folgenden finden Sie jeweils die korrekte Antwort zu den im Buch abgedruckten Prüfungsfragen, soweit die Antworten in Textform

Mehr

5.4 Klassen und Objekte

5.4 Klassen und Objekte 5.4 Klassen und Objekte Zusammenfassung: Projekt Figuren und Zeichner Figuren stellt Basisklassen für geometrische Figuren zur Verfügung Zeichner bietet eine übergeordnete Klasse Zeichner, welche die Dienstleistungen

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

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

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Konstruktor, Statische Methoden Packages Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Initialisierung von Datenstrukturen

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

Abschnitt 9: Schnittstellen: Interfaces

Abschnitt 9: Schnittstellen: Interfaces Abschnitt 9: Schnittstellen: Interfaces 9. Schnittstellen: Interfaces 9.1 Die Idee der Schnittstellen 9.2 Schnittstellen in Java 9.3 Marker-Interfaces 9.4 Interfaces und Hilfsklassen 9.5 Zusammenfassung

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

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine

Mehr

Grundlagen von Python

Grundlagen von Python Einführung in Python Grundlagen von Python Felix Döring, Felix Wittwer November 17, 2015 Scriptcharakter Programmierparadigmen Imperatives Programmieren Das Scoping Problem Objektorientiertes Programmieren

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Von der UML nach C++

Von der UML nach C++ 22 Von der UML nach C++ Dieses Kapitel behandelt die folgenden Themen: Vererbung Interfaces Assoziationen Multiplizität Aggregation Komposition Die Unified Modeling Language (UML) ist eine weit verbreitete

Mehr

Es gibt zwei verschiedene Arten, wie Programme auf dem Rechner ausgeführt werden:

Es gibt zwei verschiedene Arten, wie Programme auf dem Rechner ausgeführt werden: 3 Grundlagen 3.1 Starten eines C++ Programms Es gibt zwei verschiedene Arten, wie Programme auf dem Rechner ausgeführt werden: 1. Programme, die vom Interpreter der Programmiersprache Zeile für Zeile interpretiert

Mehr

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ Objektorientierte Programmierung Objektorientierte Programmierung Eine Einführung mit BlueJ stellt die Daten, ihre Struktur und ihre Beziehungen zueinander in den Vordergrund. Weniger im Blickpunkt: die

Mehr

Übung: Verwendung von Java-Threads

Übung: Verwendung von Java-Threads Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum

Mehr

4. Parallelprogrammierung

4. Parallelprogrammierung 4. Parallelprogrammierung AlDaBi Prak4kum David Weese 2010/11 Enrico Siragusa WS 2011/12 Inhalt Einführung in Parallelität OpenMP Bemerkungen zur P- Aufgabe EINFÜHRUNG IN PARALLELITÄT Folien z.t. aus VL

Mehr

Klassenbeziehungen & Vererbung

Klassenbeziehungen & Vererbung Klassenbeziehungen & Vererbung VL Objektorientierte Programmierung Raimund Kirner teilweise nach Folien von Franz Puntigam, TU Wien Überblick Arten von Klassenbeziehungen Untertypen versus Vererbung in

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

COPPER Best Practices

COPPER Best Practices COPPER Best Practices Version 1.0.1 Wann sollte man überhaupt COPPER verwenden? Allgemein genau dann, wenn man von der COPPER Notation oder den COPPER-Features profitieren kann. Ein wesentliches Feature

Mehr

Erstellung von Bibliotheken in CoDeSys V3

Erstellung von Bibliotheken in CoDeSys V3 Dokument Version 2.0 3S - Smart Software Solutions GmbH Seite 1 von 10 INHALT 1 EINFÜHRUNG 3 2 BIBLIOTHEKSKONZEPT IM DETAIL 4 2.1 Kategorien von Bibliotheken 4 2.1.1 System 4 2.1.2 Internal 4 2.1.3 Application

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung Kapitel 6 Vererbung Vererbung 1 Ziele Das Vererbungsprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen

Mehr

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung Eltern Kind Kind Vererbung Definition von Klassen auf Basis von bestehenden Klassen. Implementierung von ist ein. bildet ein hierarchisches

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

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

VBA-Programmierung: Zusammenfassung

VBA-Programmierung: Zusammenfassung VBA-Programmierung: Zusammenfassung Programmiersprachen (Definition, Einordnung VBA) Softwareentwicklung-Phasen: 1. Spezifikation 2. Entwurf 3. Implementierung Datentypen (einfach, zusammengesetzt) Programmablaufsteuerung

Mehr

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl PROGRAMMIEREN MIT C Allgemeine hinweise Alles was hier beschrieben wird, soll auch ausprobiert werden. Warum C? Weil die coolen Dinge mit C am einfachsten gehen. Das werden wir in den folgenden Übungen

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Tafelübung 04 Referenzen, Overloading, Klassen(hierarchien) Clemens Lang T2 18. Mai 2010 14:00 16:00, 00.152 Tafelübung zu AuD 1/13 Organisatorisches Nächster Übungstermin

Mehr

Einführung in die Programmiersprache C

Einführung in die Programmiersprache C Einführung in die Programmiersprache C Marcel Arndt arndt@ins.uni-bonn.de Institut für Numerische Simulation Universität Bonn Der Anfang Ein einfaches Programm, das Hello World! ausgibt: #include

Mehr

LeJOS: Mindstorms in Java programmieren

LeJOS: Mindstorms in Java programmieren LeJOS: Mindstorms in Java programmieren Alexander Koller Softwareprojekt "Sprechende Roboter" 30. April 2004 Überblick Warum Java? Was ist LeJOS? Motoren steuern Auf Sensoreingaben reagieren Wie geht's

Mehr

Parallele Systeme. 1 Einführung 2 1.1 Durchführung der erweiterten Übung... 3 1.2 OpenMP... 3

Parallele Systeme. 1 Einführung 2 1.1 Durchführung der erweiterten Übung... 3 1.2 OpenMP... 3 Lehrstuhl für Informatik 12 Cauerstraße 11 91058 Erlangen TECHNISCHE FAKULTÄT 1. Erweiterte Übung zur Vorlesung Parallele Systeme Inhaltsverzeichnis 1 Einführung 2 1.1 Durchführung der erweiterten Übung..........................

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

Inhalt. Max Lini. ax. inie. Einleitung... VII

Inhalt. Max Lini. ax. inie. Einleitung... VII rst Inhalt Einleitung....................................................... VII 1 Schöne neue Welt: Objektorientierte Programmierung in PHP 5.............. 1 Klassen, Interfaces und Objekte...................................

Mehr

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung Übersicht 3.1 Modell Konto 3.2 Modell Konto - Erläuterungen 3.3 Benutzer Ein- und Ausgabe mit Dialogfenster I 3.4 Benutzer Ein- und Ausgabe mit Dialogfenster II 3.5 Klassen- und Objekteigenschaften des

Mehr

In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch

In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch Kapitel Matrizen in C++ In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch 1 const int n=10; 3 double a[n][n]; gegeben. Allerdings gibt es bei dieser Methode eine Reihe

Mehr

Kurzeinführung LABTALK

Kurzeinführung LABTALK Kurzeinführung LABTALK Mit der Interpreter-Sprache LabTalk, die von ORIGIN zur Verfügung gestellt wird, können bequem Datenmanipulationen sowie Zugriffe direkt auf das Programm (Veränderungen der Oberfläche,

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

Bedienung von BlueJ. Klassenanzeige

Bedienung von BlueJ. Klassenanzeige Im Folgenden werden wichtige Funktionen für den Einsatz von BlueJ im Unterricht beschrieben. Hierbei wird auf den Umgang mit Projekten, Klassen und Objekten eingegangen. Abgeschlossen wird dieses Dokument

Mehr

Einführung in die C-Programmierung

Einführung in die C-Programmierung Einführung in die C-Programmierung Warum C? Sehr stark verbreitet (Praxisnähe) Höhere Programmiersprache Objektorientierte Erweiterung: C++ Aber auch hardwarenahe Programmierung möglich (z.b. Mikrokontroller).

Mehr

9 Multithreading. 1 Idee des Multithreading

9 Multithreading. 1 Idee des Multithreading 9 Multithreading Jörn Loviscach Versionsstand: 21. Juli 2015, 11:50 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work is licensed

Mehr

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03 Reihungen Martin Wirsing in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03 2 Ziele Die Datenstruktur der Reihungen verstehen: mathematisch und im Speicher Grundlegende Algorithmen auf Reihungen

Mehr

Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10. computer graphics & visualization

Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10. computer graphics & visualization Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10 Übersicht In den ersten Wochen: Einführung in objektorientierte Programmierung mit C++ Anschließend: Einführung in die programmierbare

Mehr

Parallele Programmierung mit OpenMP

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

Mehr

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann Einführung in die Informatik für Hörer aller Fakultäten II Andreas Podelski Stephan Diehl Uwe Waldmann 1 Einführung in die Informatik für Hörer aller Fakultäten II Andreas Podelski Stephan Diehl Uwe Waldmann

Mehr

Java Virtual Machine (JVM) Bytecode

Java Virtual Machine (JVM) Bytecode Java Virtual Machine (JVM) durch Java-Interpreter (java) realisiert abstrakte Maschine = Softwareschicht zwischen Anwendung und Betriebssystem verantwortlich für Laden von Klassen, Ausführen des Bytecodes,

Mehr

Parallel Processing in a Nutshell OpenMP & MPI kurz vorgestellt

Parallel Processing in a Nutshell OpenMP & MPI kurz vorgestellt Parallel Processing in a Nutshell & kurz vorgestellt 16. Juni 2009 1 / 29 1 Das Problem 2 2 / 29 1 Das Problem 2 3 2 / 29 1 Das Problem 2 3 4 2 / 29 1 Das Problem 2 3 4 2 / 29 Multi-Core Prozessoren halten

Mehr

6. Tutorium zu Softwaretechnik I

6. Tutorium zu Softwaretechnik I 6. Tutorium zu Softwaretechnik I Parallelität und Testen Michael Hoff 01.07.2014 INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum

Mehr

5.5.8 Öffentliche und private Eigenschaften

5.5.8 Öffentliche und private Eigenschaften 5.5.8 Öffentliche und private Eigenschaften Schnittstellen vs. Implementierungen: Schnittstelle einer Klasse beschreibt, was eine Klasse leistet und wie sie benutzt werden kann, ohne dass ihre Implementierung

Mehr

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm Programmiersprachen Einführung in C Teil 2: Prof. Dr. int main (int argc, char *argv[]) int sum = 0; for (i = 0; i

Mehr

Perzentile mit Hadoop ermitteln

Perzentile mit Hadoop ermitteln Perzentile mit Hadoop ermitteln Ausgangspunkt Ziel dieses Projektes war, einen Hadoop Job zu entwickeln, der mit Hilfe gegebener Parameter Simulationen durchführt und aus den Ergebnissen die Perzentile

Mehr

1. Der Einstieg in Java. Was heißt Programmieren?

1. Der Einstieg in Java. Was heißt Programmieren? 1. Der Einstieg in Java Lernziele: Am Ende dieses Kapitels sollen Sie wissen, aus welchen Bestandteilen ein Java-Programm besteht, Java-Programme übersetzen und ausführen können, Möglichkeiten der Kommentierung

Mehr

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. michael.roth@h-da.de. Hochschule Darmstadt -Fachbereich Informatik-

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. michael.roth@h-da.de. Hochschule Darmstadt -Fachbereich Informatik- Informatik Studiengang Chemische Technologie Michael Roth michael.roth@h-da.de Hochschule Darmstadt -Fachbereich Informatik- WS 2012/2013 Inhalt Teil VII Einstieg in Java I Michael Roth (h_da) Informatik

Mehr

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 22

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf http://informatik.swoke.de. Seite 1 von 22 Kapitel 19 Vererbung, UML Seite 1 von 22 Vererbung - Neben der Datenabstraktion und der Datenkapselung ist die Vererbung ein weiteres Merkmal der OOP. - Durch Vererbung werden die Methoden und die Eigenschaften

Mehr

4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen

4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen 4 Objektorientierte Programmierung mit Java 4.1 Java-Grundlagen Highlights: objektorientierte Sprache Plattformunabhängigkeit bei Hardware und Betriebssystem optimale Einbindung im Internet und Intranet

Mehr

Grundwissen Informatik JS 10 24. September 2015

Grundwissen Informatik JS 10 24. September 2015 Grundwissen Informatik JS 10 24. September 2015 Grundlagen der Objektorientierung 1. Erkläre die Begriffe Klasse, Attribut, Attributwert, Objekt, Methode und Dienst. Beispiel! Allgemein Eine Klasse ist

Mehr

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff Die Java Stream API Funktionale Programmierung mit der Stream API des JDK 1.8 Prof. Dr. Nikolaus Wulff Funktionale Programmierung Neben der Collection API mit default Methoden ist als weitere Neuerung

Mehr

Über den Autor 7. Teil I Los geht s mit Java für die Android-Entwicklung 25. Kapitel 1 Alles über Java und Android 27

Über den Autor 7. Teil I Los geht s mit Java für die Android-Entwicklung 25. Kapitel 1 Alles über Java und Android 27 Inhaltsverzeichnis Über den Autor 7 Einführung 19 Wie Sie dieses Buch verwenden 19 In diesem Buch verwendete Konventionen 19 Was Sie nicht lesen müssen 20 Törichte Voraussetzungen 20 Wie dieses Buch aufgebaut

Mehr

Objektorientierung: Klassen und Objekte

Objektorientierung: Klassen und Objekte Objektorientierung: Klassen und Objekte Klasse: Beschreibung für eine Menge von Objekten Schablone, Bauplan abstrakte Form Objekt: Instanz einer Klasse konkreter Inhalt (Werte) Klassen bestehen aus Attributen

Mehr

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Übung 1 mit C# 6.0 MATTHIAS RONCORONI Übung 1 mit C# 6.0 MATTHIAS RONCORONI Inhalt 2 1. Überblick über C# 2. Lösung der Übung 1 3. Code 4. Demo C# allgemein 3 aktuell: C# 6.0 mit.net-framework 4.6: Multiparadigmatisch (Strukturiert, Objektorientiert,

Mehr

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java Willkommen zur Vorlesung Objektorientierte Programmierung Vertiefung - Java Zum Dozenten Mein Name: Andreas Berndt Diplom-Informatiker (TU Darmstadt) Derzeit Software-Entwickler für Web- Applikationen

Mehr

Parallele und funktionale Programmierung Wintersemester 2013/14. 8. Übung Abgabe bis 20.12.2013, 16:00 Uhr

Parallele und funktionale Programmierung Wintersemester 2013/14. 8. Übung Abgabe bis 20.12.2013, 16:00 Uhr 8. Übung Abgabe bis 20.12.2013, 16:00 Uhr Aufgabe 8.1: Zeigerverdopplung Ermitteln Sie an folgendem Beispiel den Rang für jedes Listenelement sequentiell und mit dem in der Vorlesung vorgestellten parallelen

Mehr

Dialekte der Klimaforschung

Dialekte der Klimaforschung Dialekte der Klimaforschung Vom Fortran-Programm zum parallelen Programm Thomas Ludwig Inhalt Welche Dialekte werden transformiert? Welche Anforderungen stellen wir? Wozu diese Transformation? Wie ist

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

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java Bisherige Beobachtungen zu Objekten: werden in Klassen zusammengefasst besitzen Eigenschaften und Verhalten verbergen private Informationen werden geboren, leben und

Mehr

Klausurvorbereitung VS1 (Prof. Brecht) (B0rg Edition)

Klausurvorbereitung VS1 (Prof. Brecht) (B0rg Edition) Ein Prozess kann unmittelbar vom Zustand 1. Running in den Zustand Ready 2. Running in den Zustand Blocked 3. Ready in den Zustand Running Klausurvorbereitung VS1 (Prof. Brecht) (B0rg Edition) Der Adressraum

Mehr

3. Auflage. O Reillys Taschenbibliothek. C# 5.0 kurz & gut. Joseph Albahari & Ben Albahari O REILLY. Aktualisierung von Lars Schulten

3. Auflage. O Reillys Taschenbibliothek. C# 5.0 kurz & gut. Joseph Albahari & Ben Albahari O REILLY. Aktualisierung von Lars Schulten O Reillys Taschenbibliothek 3. Auflage C# 5.0 kurz & gut O REILLY Joseph Albahari & Ben Albahari Aktualisierung von Lars Schulten Inhalt C# 5.0 kurz & gut... 1 Ein erstes C#-Programm... 2 Syntax... 5 Typgrundlagen...

Mehr

Tutorium Java Ein Überblick. Helge Janicke

Tutorium Java Ein Überblick. Helge Janicke Tutorium Java Ein Überblick Helge Janicke 26. Oktober 2000 1 VORRAUSSETZUNGEN ZUM PROGRAMMIEREN MIT JAVA. 1 1 Vorraussetzungen zum Programmieren mit Java. Was braucht man, wenn man mit Java programmieren

Mehr

HOCHSCHULE KONSTANZ TECHNIK, WIRTSCHAFT UND GESTALTUNG. Das Luzifer-Rätsel. Prof. Dr. Hartmut Plesske Wintersemester 2008/09. von.

HOCHSCHULE KONSTANZ TECHNIK, WIRTSCHAFT UND GESTALTUNG. Das Luzifer-Rätsel. Prof. Dr. Hartmut Plesske Wintersemester 2008/09. von. HOCHSCHULE KONSTANZ TECHNIK, WIRTSCHAFT UND GESTALTUNG Fakultät Informatik Das Luzifer-Rätsel Prof. Dr. Hartmut Plesske Wintersemester 2008/09 von Max Nagl nagl@fh-konstanz.de Inhaltsverzeichnis Inhaltsverzeichnis

Mehr

AKTUEL ZU JAVA 8 PROGRAMMIEREN IN JAVA. 7. Auflage. Im Internet: Alle Beispielprogramme und Lösungen

AKTUEL ZU JAVA 8 PROGRAMMIEREN IN JAVA. 7. Auflage. Im Internet: Alle Beispielprogramme und Lösungen L AKTUEL ZU fritz JOBST JAVA 8 PROGRAMMIEREN IN JAVA 7. Auflage Im Internet: Alle Beispielprogramme und Lösungen 4 1 Der Einstieg in Java keinem Fall zulässig. Die Schreibweisen Hello.java für den Namen

Mehr

Prüfung VO Betriebssysteme SS2008 / 7. Juli 2008

Prüfung VO Betriebssysteme SS2008 / 7. Juli 2008 Name: Matrikel-Nr: Prüfung VO Betriebssysteme SS2008 / 7. Juli 2008 Bitte schreiben Sie leserlich und antworten Sie kurz und präzise. 1. Zeichnen Sie das Schichten-Modell eines Computersystems und markieren

Mehr

Ergänzungen zum Manual OS V 2.05/2.06

Ergänzungen zum Manual OS V 2.05/2.06 Ergänzungen zum Manual OS V 2.05/2.06 SYSTEMRESOURCEN - PROGRAMM DOWNLOAD - Ab der Betriebssystemversion 2.05 haben die C-Control Units M-2.0 und Station 2.0 die Möglichkeit das Anwenderprogramm von einem

Mehr