Paralleles Rechnen Konzepte und Anwendungen im Data Mining

Größe: px
Ab Seite anzeigen:

Download "Paralleles Rechnen Konzepte und Anwendungen im Data Mining"

Transkript

1 Paralleles Rechnen Konzepte und Anwendungen im Data Mining Stefan Wissuwa 1. Dezember 2008 Thesis zur Erreichung des Grades Master of Science (M.Sc.) in Wirtschaftsinformatik Hochschule Wismar - Fakultät für Wirtschaftswissenschaften Eingereicht von: Stefan Wissuwa, Dipl. Wirt.-Inf. (FH) Erstbetreuer: Jürgen Cleve, Prof. Dr. rer. nat. Zweitbetreuer: Uwe Lämmel, Prof. Dr.-Ing.

2 Inhaltsverzeichnis 1 Einleitung Motivation Anwendungsgebiete Inhalt der Arbeit Begriffsklärung I Grundlagen der parallelen Datenverarbeitung 5 2 Stufen der Parallelisierung 6 3 Parallele Architekturen Flynnsche Klassifizierung Speichermodelle Rechner mit gemeinsamem Speicher Rechner mit verteiltem Speicher Prozesse / Threads Client-Server-Architekturen Cluster-Computing Grid-Computing Parallelisierungsebenen Parallelität auf Instruktionsebene Parallelität auf Datenebene Parallelität in Schleifen Parallelität auf Funktionsebene Parallele Programmiermodelle Darstellung Strukturierung Datenverteilung und Kommunikation Broadcast Scatter Gather Reduktion Synchronisation Kritische Abschnitte Barrieren Locks Einflussfaktoren Paralleler Programme Parallele Skalierbarkeit Speedup Amdahl sches Gesetz Gustafson-Gesetz Karp-Flatt-Metrik

3 6.2 Load Balancing und Scheduling Lokalität Speichersynchronisation II Bibliotheken und Systeme 28 7 Unified Parallel C Verfügbarkeit Parallelisierungskonzept Speichermodell Synchonisation Globale Operatoren Message Passing Interface Verfügbarkeit Parallelisierungskonzept Speichermodell Synchronisation Globale Operatoren OpenMP Verfügbarkeit Parallelisierungskonzept Speichermodell Synchronisation Globale Operatoren Andere BOINC BLAS PThreads Parallel Virtual Machine Vergleichende Betrachtung Implementierung Matrizenmultiplikation Seriell Matrizenmultiplikation UPC Matrizenmultiplikation MPI Matrizenmultiplikation OpenMP Performance Bewertung UPC MPI OpenMP III Parallelisierung im Data Mining 49

4 12 Data Mining Grundlagen Ablaufmodell Klassifikation der Verfahren Künstliche Neuronale Netze Feed-Forward-Netze Selbstorganisierende Karten Parallele Algorithmen Serielle Selbstorganisierende Karte Parallele Selbstorganisierende Karte Performance Test Parallele Modelle Hierarchische Kohonen-Karten Konzept Umsetzung Testaufbau Vergleich der Modellqualität Vergleich der Rechengeschwindigkeit Feed-Forward-Netze Konzept Umsetzung Vergleich der Modellqualität Vergleich der Rechengeschwindigkeit IV Zusammenfassung und Ausblick 76 V Ehrenwörtliche Erklärung 79 VI Anhang 80 A Schnittstellen und Bibliotheken 81 A.1 UPC Konsortium A.2 Compilerübersicht B Messwerte 84 B.1 Messwerte Matrizenmultiplikation B.2 Messwerte SOM B.3 Messwerte Feed-Forward-Netz B.4 Inhalt der CD

5 Algorithmenverzeichnis 1 Matrizenmultiplikation Seriell Matrizenmultiplikation MPI Global SOM Seriell Parallele SOM mit OpenMP Hierarchische SOM

6 Abbildungsverzeichnis 1 Gemeinsames Speichermodell UMA Gemeinsames Speichermodell NUMA Verbindungsnetzwerke Effiziente Broadcast-Operation Effiziente Akkumulations-Operation Parallele Skalierbarkeit nach Amdahl Parallele Skalierbarkeit nach Amdahl Speedup Amdahl vs. Gustafson Row- vs. Column-first Ordering Message-Passing OpenMP Fork-Join-Modell Performance UPC Performance OpenMP Performance MPI Performance MPI vs. MPI Global Performance OpenMP vs. MPI Global Performance OpenMP vs. MPI Global CRISP-DM Phasenmodell Rechenzeit SOM OpenMP für kleine Karten SOM OpenMP Rechenzeiten und Speedup nach Kartengröße U-Matrix einer Kohonen-Karte Aufteilung einer SOM Interpolation der Gewichte Clusterqualität vs. Lernrate / Kartengröße U-Matrix Seriell U-Matrix Hierarchisch Clusterqualität Speedup SOM Parallel / Seriell

7 Tabellenverzeichnis 1 Linpack Top-5 Supercomputer Stand 06/ Übersicht UPC-Compiler OpenMP-fähige Compiler Matrizenmultiplikation Seriell Matrizenmultiplikation UPC Matrizenmultiplikation OpenMP Matrizenmultiplikation MPI Master-Worker Matrizenmultiplikation MPI Global Clusterqualität (seriell) in Abhängigkeit von Lernrate und Kartengröße Clusterqualität (parallel) in Abhängigkeit von Lernrate und Kartengröße Rechenzeit in Abhängigkeit von Kartengröße und Parallelisierungsgrad Berechnungszeiten Parallele SOM mit OpenMP Erkennungsrate Teilklassifikatoren Rechenzeiten und Erkennungsrate n-fach vs. binär nach Netzgröße

8 1 Einleitung 1.1 Motivation Parallelrechner, Mehrkernprozessoren, Grid-Computing und seit geraumer Zeit Cloud-Computing sind Schlagworte, die immer dann genannt werden, wenn es um enorme Rechenleistung von Computern geht. Doch um was handelt es sich dabei genau? Die Entwicklung schnellerer Prozessoren erfolgte bisher zu einem signifikanten Anteil durch immer stärkere Miniaturisierung der Schaltkreise, was eine höhere Zahl an Transistoren pro Chip und höhere Taktraten erlaubte. Die Anzahl der Transistoren verdoppelt sich etwa alle 18 Monate. Dieser Zusammenhang wurde 1965 empirisch durch Gordon Moore festgestellt und wird daher auch als Moore sches Gesetz bezeichnet 1. Obwohl der dafür notwendige technologische Aufwand mit der Zeit immer größer wurde, wird diese Steigerungsrate auch in nächster Zukunft beibehalten werden können, bis die physikalische Grenze erreicht ist. Eine stetige Steigerung der Taktraten stellt sich bereits als sehr viel schwieriger heraus, da die damit verbundene Abwärme des Prozessors nur sehr schwer zu handhaben ist und bereits Werte erreicht hat, die - relativ zur Oberfläche - etwa der Heizleistung einer Herdplatte gleichkommen. Statt die Geschwindigkeit nur durch höhere Taktraten zu steigern, wurde die Komplexität der Prozessoren so weit erhöht, dass bereits mehrere Prozessorkerne auf einem Chip zusammengefasst werden und somit das, was man unter einem Prozessor-Chip versteht, selbst einen kleinen Parallelrechner bildet. 2 Doch auch eine stetige Erhöhung der Anzahl der Prozessorkerne ist nicht unbedingt sinnvoll. Da Prozessoren heute um ein Vielfaches schneller Arbeiten als Daten vom Hauptspeicher zum Prozessor übertragen werden können, sind schnelle, teure und damit kleine Zwischenspeicher - Caches - notwendig. Da jeder Prozessorkern einen eigenen Cache besitzt, aber für alle Prozessorkerne ein konsistenter Speicherinhalt sichergestellt sein muss, sind Synchronisationsmechanismen notwendig, deren Komplexität mit der Zahl der Prozessoren steigt. Da eine Synchronisation zudem Zeit kosten, schmälert dies den Geschwindigkeitsgewinn durch zusätzliche Prozessorkerne. In bestimmten Fällen können zusätzliche Prozessoren sogar dazu führen, dass ein Programm langsamer wird 3. Diese vielfältigen Abhängigkeiten, die so auch in größerem Maßstab für Rechennetze gelten, führen dazu, dass Parallelisierung auf technischer wie auch auf softwaretechnischer Seite keine triviale Aufgabe ist. Parallelrechner waren bis vor wenigen Jahren hauptsächlich in der wissenschaftlichen Simulation im Einsatz. Sie erlaubten es erstmals, komplexe Phänomene, deren physische Analyse zu aufwändig, teuer oder gefährlich ist, am Computer zu simulieren. Rund um diese Simulationstechnik hat sich ein eigener Wissenschaftszweig etabliert, der unter dem Begriff Computational Science bekannt ist. Beginnend mit der Einführung der ersten Pentium Dual-Core Prozessoren für den Consumer- Markt durch die Firma Intel Corp., sind heute kaum noch aktuelle PCs auf dem Markt zu finden, die nicht mindestens einen Doppelkern-Prozessor enthalten. Obwohl die jeweiligen Ziele, für die diese Technologien entwickelt werden, höchst unterschiedlich sind, gleichen sie sich jedoch in einem Punkt: die Steigerung der Leistungsfähigkeit von Computersystemen erfolgt nicht hauptsächlich durch höhere Taktrate, sondern durch Parallelisierung. Dies wird dazu führen, 1 Vgl.: [RAUBER 2007] S Vgl.: [RAUBER 2008] S.6ff. 3 Vgl.: Linux-Magazin, Ausgabe 11/2008, MySQL - 1 -

9 dass verstärkt parallele Programmiertechniken in der Softwareentwicklung eingesetzt werden müssen, um die Leistung auch nutzen zu können. Doch auch durch Parallelisierung können nicht unbegrenzt nutzbar höhere Rechengeschwindigkeiten erzielt werden. Die Leistungsangaben für Supercomputer mögen einen in Erstaunen versetzen, jedoch ist dabei zu beachten, dass diese Leistung nur für sehr spezielle Programme auch wirklich genutzt werden kann - nämlich für Programme oder Algorithmen, die sich überhaupt parallelisieren lassen. Die 1,026 Peta-Flop/s des derzeit weltweit schnellsten Supercomputers 4 werden nur durch Kombination von über hunderttausend Mehrkern-Prozessoren erreicht. Diese Leistung zur Lösung einer Aufgabe bündeln zu wollen bedeutet, die Aufgabe in über hunderttausend separate Teilaufgaben zu zerlegen, was weder immer möglich noch stets sinnvoll ist 5. Eine Bürosoftware wird auf einem Parallelrechner nicht unbedingt schneller ausgeführt werden, da sie meist nur einen einzigen der vorhandenen Prozessoren nutzen kann. Eine komplexe physikalische Simulation hingegen kann enorm von der Verteilung auf mehrere Prozessoren profitieren, sofern der Algorithmus diese Aufteilung zulässt. Data-Mining ist ein weiteres Anwendungsgebiet, für das Parallelisierung vorteilhaft sein kann, da sehr große Datenmengen zu verarbeiten sind und dafür komplexe Algorithmen eingesetzt werden. Die langen Rechenzeiten, die für das Erstellen eines Data-Mining-Modells notwendig sind, behindern eine interaktive und intuitive Arbeitsweise bei der Exploration von Datenmengen. Um Zeit zu sparen, können mehrere unterschiedliche Modelle nach dem Versuch-und-Irrtum- Prinzip parallel berechnet werden. Dies erfordert jedoch große Planungssorgfalt und führt in der Regel zu vielen überflüssigen Berechnungen und damit zur Vergeudung von Rechenzeit. Ein Ansatz ist, die Gesamtrechenzeit eines Experiments zu verringern, in dem sowohl der Data- Mining-Prozess als auch einzelne Algorithmen parallel ausgeführt werden. Vor dem Hintergrund, dass selbst aktuelle, kostengünstige PCs häufig Mehrkern-Prozessoren enthalten, ist eine Parallelisierung umso interessanter. 1.2 Anwendungsgebiete Für parallele Rechnerarchitekturen lassen sich prinzipiell zwei Anwendungsgebiete unterscheiden: 6 Das High-Availability-Computing dient der Zurverfügungstellung ausfallsicherer Dienste, beispielsweise für Datenbanken oder Web-Server, indem alle anfallenden Aufgaben nach Bedarf auf einzelne Knoten verteilt werden und dadurch auch der Ausfall einzelner Knoten kompensiert werden kann. Das High-Performance-Computing dient vor allem der Bündelung von Rechenleistung, um eine einzelne Aufgabe entweder schneller oder sehr viel genauer zu lösen 7. Dies ist auch das Anwendungsgebiet paralleler Algorithmen und Inhalt dieser Arbeit. Es existieren eine Reihe von wissenschaftlichen Anwendungen, die in großem Maßstab auf Parallelisierung setzen und die durch die Art, diese zu realisieren, in der Öffentlichkeit große 4 Siehe Tabelle 1 auf Seite Siehe Kapitel 6 auf Seite Vgl.:[BAUKE 2006] S. 31ff. 7 Zur Unterscheidung siehe Kapitel

10 Popularität erlangt haben. Die wohl bekanntesten Vertreter gehören zur Gruppe der auf dem BOINC-Framework 8 basierenden at-home-projekte, bei denen durch ans Internet angeschlossenen PCs ein Parallelrechner nach dem Master-Worker-Prinzip aufgebaut wird. Da hierbei auch sehr viele Privat- und Bürorechner zum Einsatz kommen, werden diese Verfahren auch als Desktop-Grid-Computing bezeichnet. Die bekanntesten Projekte sind Seti@Home 9 und Folding@Home 10. Seti@Home dient der Analyse von Radiosignalen auf Muster, die von einer extraterrestrischen Intelligenz stammen könnten. Obwohl bisher erfolglos, ist das Projekt wohl unbestritten der populärste Vertreter seiner Art, vor allem unter Privatpersonen. Diese stellen Rechenzeit zur Verfügung, die sie selbst nicht nutzen, indem sie eine spezielle Software - in der ursprünglichen Version ein Windows-Bildschirmschoner - installieren, der Datenpakete von einem Server lädt und das Ergebnis der Berechnung zurückschickt. Folding@Home funktioniert auf die gleiche Weise, nur ist das Ziel die Bestimmung der Tertiärstruktur 11 von Proteinen. Da die Funktion eines Proteins nicht nur von dessen chemischer Zusammensetzung - die durch die DNA codierte Aminsosäuresequenz - abhängt, sondern auch von dessen räumlicher Struktur. Die Ausbildung der dreidimensionalen Struktur aus einer langen Kette von Aminosäuren wird als Faltung bezeichnet, wobei es mehrere Varianten gibt. Nur die physiologisch korrekte Form kann die ihr zugedachte Funktion erfüllen, falsch gefaltete Proteine haben eine reduzierte, keine oder im schlimmsten Fall pathogene Funktion. Es wird vermutet, dass Krankheiten wie BSE oder die Kreutzfeldt-Jakob-Krankheit durch falsch gefaltete Proteine (Prionen) hervorgerufen werden. Neben der Erforschung, wie und unter welchen Bedingungen der Faltungsprozess genau funktioniert, ist die Bestimmung der Tertiärstruktur ein wichtiger Schritt, wenn es gilt, die Funktion eines neu entdeckten Gens des dadurch kodierten Proteins herauszufinden. Weitere, jedoch weniger populäre Projekte sind zum Beispiel Docking@Home 12 zur Untersuchung der Molekülbindungen zwischen Liganden und Proteinen in der Biochemie sowie NQueens@Home 13 zur Lösung des N-Damen-Problems auf Feldern größer als 26x26 Einheiten. 1.3 Inhalt der Arbeit Diese Arbeit befasst sich mit den Anwendung von Parallelisierungstechniken auf dem Gebiet des Data-Mining. Da das Thema dieser Arbeit viele Teilbereiche der Informatik berührt, die selbst wiederum sehr Umfangreich sind, gliedert sich diese Arbeit in drei Teile, die jedes für sich eine eigenständige thematische Einheit bilden. Der Erste Teil stellt eine hauptsächlich konzeptionelle Einführung in die Thematik des parallelen Rechnens dar. Es werden Begriffe und die theoretischen Grundlagen erläutert sowie grundlegende Modelle und Konzepte vorgestellt. Der Zweite Teil widmet sich konkreten Implementationen der im ersten Teil vorgestellten Konzepte. Der Schwerpunkt liegt auf Sprachen, Schnittstellen und Bibliotheken für die parallele 8 Siehe dazu Kapitel Vgl.: [KNIPPERS 2001] S. 37ff

11 Programmierung, die relativ verbreitet und frei verfügbar sind. Es werden ausgewählte Schnittstellen vorgestellt, deren Arbeitsweise anhand von Beispielen erläutert und eine erste vergleichende Bewertung vorgenommen. Der Dritte Teil behandelt das Thema Data Mining und ausgewählte Algorithmen. Es wird untersucht, inwiefern sich Verfahren parallelisieren lassen, welcher Aufwand hierfür notwendig ist und welche Resultate erzielt werden können. Insbesondere die Parallelisierung von Data- Mining-Modellen unter Verwendung vorhandener, rein sequentieller Data-Mining-Algorithmen wird untersucht. 1.4 Begriffsklärung Da aufgrund der Komplexität des Themas und der Vielzahl der angeschnittenen Themen zwangsläufig Überschneidungen von Begriffen auftreten, werden der Einfachheit halber folgende Begriffe verwendet: Als Prozessor wird in dieser Arbeit nicht der physikalische Chip, sondern die tatsächlich ausführende Recheneinheit bezeichnet. Demzufolge besitzt ein Computer mit einem Mehrkern- Prozessor-Chip eine entsprechende Anzahl an Prozessoren. Diese Sichtweise ist aus dem Grund günstig, da es sich hier hauptsächlich um die Software-Sicht der parallelen Programmierung geht, und weniger um die Hardware. Zudem stellt sich ein Mehrkern-Prozessor aus Sicht eines Programms ebenfalls als eine Anzahl von Einzelprozessoren dar 14. In der Literatur wird zwischen Prozessen und Threads unterschieden, in dieser Arbeit wird nur der Begriff Prozesse verwendet. Der Grund dafür ist, dass sich Prozesse und Threads hauptsächlich durch die Art der Ressourcenteilung der Kindprozesse mit dem Elternprozess unterscheiden. Da die hier vorgestellten Programme und Bibliotheken unter Linux eingesetzt werden und Linux nur Prozesse unterstützt, ist die Nutzung von Threads zwangsläufig mit einer Emulation durch Prozesse verbunden. 14 Vgl.:[RAUBER 2007] S

12 Teil I Grundlagen der parallelen Datenverarbeitung In diesem Kapitel werden die theoretischen Grundlagen verschiedener Ansätze zur Parallelisierung von Algorithmen vorgestellt. Dabei werden konkrete Methoden, Konzepte und Umsetzungsmöglichkeiten gezeigt. This chapter provides an introduction to the theory of parallel programming, concepts and techniques. It shows the most popular approaches, methods and concepts for parallelization of algorithms

13 2 Stufen der Parallelisierung Unter Parallelisierung wird die Zerlegung eines Problems in Teilprobleme verstanden, die gleichzeitig von mehreren Prozessoren verarbeitet werden können, so dass die Berechnung weniger Zeit benötigt, als würde sie auf einem einzelnen Prozessor erfolgen. Auf diese Weise lässt sich ein gegebenes Problem in kürzerer Zeit oder aber ein größeres Problem in der selben Zeit lösen. Es lassen sich vier Stufen der Parallelisierung unterschieden 15, wobei sich die ersten drei Stufen Wortbreite, Pipelining und Superskalare Prozessoren direkt auf die verwendete Technik im Prozessorkern beziehen. Die letzte Stufe, Parallelisierung auf Prozessebene, ist eher ein programmtechnisches Konstrukt, das nicht mehr direkt vom Prozessor abhängt 16, sondern vom Betriebssystem übernommen wird. Die Wortbreite ist der Anzahl der Bits, die in einer Operation vom Prozessor gleichzeitig verarbeitet werden können und entspricht somit der internen Busbreite und der Registergrösse. Die Wortbreite bestimmt maßgeblich, wie viele Bytes bei einem Speicherzugriff gleichzeitig übertragen werden können. Aktuelle Prozessoren haben eine Wortbreite von 32 oder 64 Bit. Eine Instruktion besteht aus mehreren atomaren Operationen, die in der Regel mindestens die folgenden Schritte umfasst: 1. fetch: Laden der nächsten Instruktion aus dem Speicher, 2. decode: Dekodieren der Instruktion, 3. execute: Bestimmung von Quell- und Zieladressen der Operanden und Ausführen der Instruktion, 4. write back: Zurückschreiben des Ergebnisses. Unter Pipelining versteht man die Ausführung solcher atomaren Operationen durch separate Hardwareeinheiten, wodurch eine zeitlich überlappende Ausführung mehrerer Instruktionen möglich wird. Die Verarbeitung der nachfolgenden Instruktion kann im günstigsten Fall bereits mit der fetch-operation beginnen, sobald die vorhergehende Instruktion die decode-operation durchläuft. Dies funktioniert jedoch nur dann, wenn keine Abhängigkeiten zwischen den Instruktionen bestehen 17. Superskalare Prozessoren 18 erweitern das im Pipelining eingesetzte Konzept separater Hardwareeinheiten für atomare Operationen auf Instruktionsebene. Dazu verfügt der Prozessor über separate Funktionseinheiten für bestimmte Aufgaben, zum Beispiel für Ganzzahlarithmetik (ALU - arithmetic logical unit), Fließkommaarithmetik (FPU - floatin point unit) und Speicherzugriffe (MMU - memory management unit). Die Beschränkung der parallelen Ausführung hinsichtlich der Abhängigkeiten nachfolgender Instruktionen gelten auch hier. Moderne Prozessoren enthalten darüber hinaus auch spezielle erweiterte Befehlssätze wie MMX (Multi-Media-Extension) oder SSE (Streaming SIMD Extension) 19, die für die parallele Verar- 15 Vgl.: [RAUBER 2007] S Eine Abhängigkeit besteht insofern, dass der verwendete Prozessor eine virtuelle Speicheradressierung unterstützt, was bereits mit der IA-32-Architektur eingeführt wurde. Dies schließt natürlich nicht aus, dass die Prozessortechnik Funktionen speziell für die Parallelisierung enthalten kann, wie z.b. Multi- und Hyperthreading. 17 Siehe auch Abschnitt 4.1 auf Seite Vgl.: [RAUBER 2007] S.14ff. 19 Intel: MMX ab Pentium, SSE ab Pentium III AMD: 3D-Now! ab K-6, SSE ab Athlon XP IBM/Motorola: VMX/AltiVec ab PowerPC 7400/G4-6 -

14 beitung größerer Datenmengen nach dem SIMD-Prinzip vorgesehen sind. Diese werden in der Regel als Technologie zur Beschleunigung von Multimedia-Applikationen angepriesen, lassen sich aber ebenso gut für sinnvolle Rechenaufgaben nutzen. Die letzte Stufe der Parallelisierung auf Prozessebene ermögliche die parallele Ausführung mehrere Programme. Diese auch als Multitasking bezeichnete Konzept wird in erster Linie durch das Betriebssystem realisiert. Wenn man vom Parallelcomputing spricht, ist in der Regel eine solche Form der Parallelisierung von Algorithmen gemeint, wobei die Berechnung durch mehrere, parallel ausgeführte Prozesse erfolgt. Dies resultiert nur dann in einer kürzeren Berechnungszeit, wenn für jedes Programm auch ein eigener Prozessor zur Verfügung steht. 3 Parallele Architekturen 3.1 Flynnsche Klassifizierung Die Flynnsche Klassifizierung beschreibt vier idealisierte Klassen von Parallelrechnern basierend auf der Anzahl separater Programmspeicher, Datenspeicher und Recheneinheiten sowie deren Abhängigkeiten untereinander. Flynn unterscheidet dabei: 20 SISD Single Instruction - Single Data beschreibt einen sequentiellen Rechner, der jeweils genau eine Anweisung auf genau einem Datenelement ausführt. Es existiert keine Parallelität. MISD Multiple Instruction - Single Data ist ein Konzept, bei dem ein Datenelement nacheinander durch verschiedene Anweisungen verarbeitet wird. Dieses Konzept ist eher theoretisch, jedoch kann Pipelining als eine einfache Form von MISD interpretiert werden. SIMD Single Instruction - Multiple Data entspricht der Verarbeitung mehrerer Datenelemente durch genau eine Anweisung. Dies ist bei Vektorrechnern der Fall, aber auch bei vielen Befehlssatzerweiterungen wie MMX oder SIMD. MIMD Multiple Instruction - Multiple Data ist die Verarbeitung unterschiedlicher Datenelemente durch jeweils unterschiedliche Anweisungen. Dies ist bei Superskalaren Prozessoren sowie Parallelrechnern der Fall, wobei verschiedene Funktionseinheiten oder Prozessoren parallel verschiedene Aufgaben ausführen. Diese Klassifizierung lässt sich auch auf die Parallelisierung von Algorithmen anwenden, wobei jeder der als Multiple aufgeführten Aspekte einen potenziellen Kandidaten für eine Parallelisierung darstellt. 3.2 Speichermodelle Aus logischer und physischer Sicht lassen sich Modelle mit gemeinsamem und verteiltem Speicher unterscheiden. Das physische Speichermodell hat großen Einfluss auf die Ausführungsgeschwindigkeit paralleler Programme, da es Latenz und Bandbreite bei Speicherzugriffen und Kommunikationsoperationen bestimmt. 20 Vgl.: [HOFFMANN 2008] S.11f., [RAUBER 2007] S.17ff., [RAUBER 2008] S.27f

15 3.2.1 Rechner mit gemeinsamem Speicher Bei gemeinsamem Speicher existiert ein für alle Prozessoren einheitlicher Adressraum. Gemeinsamer Speicher stellt hohe Anforderungen an Synchronisations- und Konsistenzmechanismen, um einen einheitlichen Speicherinhalt zu gewährleisten, was insbesondere zur Vermeidung von Race-Conditions bei konkurrierendem Schreib-Lese-Zugriffen notwendig ist. Bei gemeinsamem Speicher kann der Speicherzugriff auf unterschiedliche Weise realisiert werden, abhängig davon, wie die Speicherbänke physisch organisiert sind. Der Datenaustausch zwischen Prozessoren und Speicherbänken erfolgt über einen sogenannten Interconnect. Dieser kann z.b. als Bus ausgelegt sein, so dass abwechselnd immer nur ein Prozessor exklusiven Zugriff auf alle Speichermodule hat. Diese Architektur ist in der Regel bei Mehrkern-Prozessoren anzutreffen, die über einem gemeinsamen Adressbus mit dem Speicher-Controller kommunizieren. In diesem Fall ist die Zugriffsgeschwindigkeit stets gleich, daher spricht man von UMA- Architektur (Uniform Memory Access). Das Gegenstück hierzu bildet die NUMA-Architektur (Non-Uniform Memory Access), bei der jedem Prozessor ein eigenes Speichermodul zugeordnet ist, auf das demzufolge schneller zugegriffen werden kann als auf Module anderer Prozessoren. 21 Die physische Verteilung des Speichers muss nicht zwingend mit dem logischen Speichermodell übereinstimmen. So kann z.b. ein gemeinsamer Speicher auch über einen Netzwerkverbund von Rechnern mit jeweils eigenem Speicher realisiert werden, wobei Adressumsetzung und Datenaustausch durch die jeweilige Programmierschnittstelle vorgenommen werden. Abbildung 1: Gemeinsames Speichermodell UMA Quelle: [BAUKE 2006] S. 11 Abbildung 2: Gemeinsames Speichermodell NUMA 21 Vgl.: [RAUBER 2007] S. 25ff. Quelle: [BAUKE 2006] S

16 3.2.2 Rechner mit verteiltem Speicher Verteilter Speicher bedeutet, dass alle Prozessoren einen eigenen, privaten Adressraum besitzen. Für den Datenaustausch muss ein Verbindungsnetzwerk existieren, und er findet nur dann statt, wenn er explizit ausgelöst wird. Durch die entfallenden Synchronisationsmechanismen beim Speicherzugriff ermöglicht es diese Architektur, wesentlich mehr Rechner miteinander zu verbinden. Dies erfolgt allerdings auf Kosten der Übertragungsgeschwindigkeit von Daten zwischen den beteiligten Rechnern, was derartige Rechner für feingranulare Probleme wenig geeignet macht. 22 Das Verbindungsnetzwerk hat erheblichen Einfluss auf die Geschwindigkeit. Die bestimmenden Faktoren sind Bandbreite und Latenz. Es kann davon ausgegangen werden, dass mit zunehmender physikalischer Entfernung zwischen den Rechnern die Latenz steigt und die Bandbreite sinkt. 23 Weiterhin kann durch geschicktes Ausnutzen der Netzarchitektur die Geschwindigkeit von Datenverteilungs-Operationen wie Broadcast erhöht werden, wenn Nachbarschaftsbeziehungen ausgenutzt werden. 24 Abbildung 3: Verbindungsnetzwerke Quelle: [BAUKE 2006] S.26 Durch die Verwendung von lokal zugeordneten Cache-Speichern 25 entsteht das Problem der Cache-Kohärenz 26, da hier lokale Kopien gemeinsamer Variablen vorgehalten werden. Die Änderung einer Kopie muss nicht nur eine Aktualisierung des gemeinsamen Speichers, sondern 22 Vgl.: [RAUBER 2007] S.21ff. 23 Vgl.: [RAUBER 2007] Kapitel 2.5 Verbindungsnetzwerke, S. 32ff. 24 Vgl.: [SANTORO 2007] S. 32ff. 25 Vgl.: [RAUBER 2007] S.73ff. 26 Vgl.: [RAUBER 2007] S.31., S. 84ff

17 auch eine Aktualisierung aller anderen Kopien zur Folge haben. Die Steuerung des Caching erfolgt durch einen eigenen Cache-Controller und ist sowohl für den Prozessor als auch aus Programmsicht transparent. 27 Die Probleme des Cachings lassen sich auf höhere Ebene übertragen, wenn es um die Entwicklung paralleler Programme und insbesondere von Bibliotheken für das verteilte Rechnen geht, da hier ebenfalls lokale und entfernte Daten synchronisiert werden müssen. 3.3 Prozesse / Threads Als Prozesse werden Programme bezeichnet, die zu einem gegebenen Zeitpunkt ausgeführt werden. Ein Prozess besitzt dabei eine Prozessumgebung, die durch eine Datenstruktur im Betriebssystem realisiert wird und zur Verwaltung des Zustandes sowie der Ressourcen eines Prozesses dient. Dazu gehören z.b. die Inhalte der Prozessorregister, verwendete Speicherbereiche, Umgebungsvariablen und geöffnete Dateien. Threads sind ebenfalls eine Form von Prozessen. Sie unterscheiden sich von richtigen Prozessen nur dadurch, dass sie keinen exklusiven Zugriff auf ihre Ressourcen haben, sondern diese mit anderen Prozessen, insbesondere mit dem Eltern- Prozess, teilen. Prozesse werden unter Unix erzeugt, indem der laufende Prozess durch Aufruf eines fork()-kommandos in seinem aktuellen Zustand dupliziert wird. Der so entstandene Kind- Prozess kann nun einen anderen Programmzweig ausführen als der Elternprozess, andere Daten berechnen oder seine Prozessumgebung durch die eines anderen Programms ersetzen. Die Unterscheidung zwischen Prozessen und Threads dient hauptsächlich dazu, den physischen Ressourcenbedarf zu reduzieren, da beim Erzeugen eines Prozesses (theoretisch) dessen gesamte Prozessumgebung (inklusive Speicherbereiche) dupliziert werden muss, was beim Erzeugen von Threads nicht der Fall ist. Threads besitzen somit per Definition einen gemeinsamen Adressraum mit dem Elternprozess, währen Prozesse eigene Adressräume besitzen. Allerdings gibt es Methoden, wie z.b. Shared Memory, durch die auch Prozesse auf gemeinsame Speicherbereiche zugreifen können. Letztendlich bilden Prozesse die Grundlage für parallele Programme. Ein paralleler Algorithmus kann also bereits durch die Methoden, die für die Verwaltung von Prozessen sowie für die Interprozesskommunikation vom Betriebssystem bereitgestellt werden, realisiert werden. Allerdings ist die komplette Logik zur Steuerung der einzelnen Prozesse explizit zu implementieren, was zwar sehr viele Möglichkeiten zur Optimierung der Rechengeschwindigkeit, aber auch sehr viel Aufwand und hohe Fehleranfälligkeit bedeutet. Die Verwendung von speziell für diesen Zweck optimierten Bibliotheken ist häufig einfacher und auch effizienter. 3.4 Client-Server-Architekturen Client-Server-Architekturen verwenden als logische Struktur ein Stern-Modell, wobei der Server im Zentrum steht und direkte Verbindungen mit allen Clients unterhält. Parallelisierung durch Client-Server-Architekturen werden durch das Master-Worker-Konzept umgesetzt, bei dem der Server (Master) Rechenaufgaben oder Daten an die verbundenen Clients (Worker) sendet und diese das Resultat zurücksenden. Eine derartige Architektur lässt sich durch viele parallele Schnittstellen abbilden. Da die Abhängigkeiten zwischen den verbundenen Rechnern wenig 27 Die Existenz eines Caches macht sich durch Unterschiede in der Geschwindigkeit von Speicherzugriffen bemerkbar. Siehe dazu Kapitel

18 komplex sind, ist diese Architektur relativ einfach zu implementieren und - sofern die physischen Ressourcen entsprechend dimensioniert sind - auch für sehr große Rechennetze höchst effektiv, wie z.b. das Seti@Home-Projekt zeigt. 3.5 Cluster-Computing Die Idee des Cluster-Computings besteht darin, durch Verwendung handelsüblicher Komponenten und freier Cluster-Software einen Parallelrechner mit verteiltem Speicher zu realisieren. Durch die günstigen Kosten werden derartige Cluster häufig von Universitäten und Forschungseinrichtungen eingesetzt. Diese auch als Beowulf-Cluster 28 bezeichneten Computer gehen auf das Beowulf-Projekt der NASA von 1994 zurück, bei dem 16 Linux-PCs mittels PVM 29 zu einem Parallelrechner verbunden wurden. 30 Jeder Rechner in einem Cluster wird als Knoten bezeichnet und kann wiederum selbst eine eigene parallele Architektur aufweisen. Beowulf-Cluster lassen sich sehr leicht skalieren, da hierfür lediglich weitere Knoten an das Netzwerk angeschlossen und mit der Cluster-Software versehen werden müssen. Auf diese Weise lassen sich sogar ältere Rechner noch sinnvoll verwenden. Das Potential dieser Architektur zeigt sich darin, dass sich in Verbindung mit Hochleistungs- Netzwerken und moderner Rechentechnik Cluster bauen lassen, die zu den weltweit schnellsten Rechnern zählen. Die Tabelle 1 zeigt die weltweit fünf schnellsten Parallelrechner nach dem Linpack-Benchmark. Diese sind natürlich nicht mehr aus einzelnen PCs zusammengesetzt, sondern bestehen aus Racks mit einer entsprechenden Anzahl von Einschüben, verwenden jedoch handelsübliche Großserientechnik. Die Bedeutung freier Software für das Cluster-Computing zeigt sich daran, dass viele Hersteller auf eine Linux-Distribution zurückgreifen und diese nach Bedarf anpassen. Da der Quelltext der Programme frei verfügbar und veränderbar ist, können so zum Beispiel optimierte Kernel (z.b. von Cray und IBM) zum Einsatz kommen. 3.6 Grid-Computing Als Grid-Computing 31 wird eine Form des Cluster-Computings bezeichnet, bei der eine wesentlich losere Koppelung der Knoten zum Einsatz kommt. Ein derartiges Computing-Grid ist häufig geographisch weit verteilt. Im deutschen Sprachraum wird häufig mit dem Begriff Grid ein regelmäßiges Gitter assoziiert und damit dem Grid-Computing seine Besonderheit durch Verwendung einer speziellen Topologie unterstellt. Tatsächlich weisen regelmäßige - und damit auch gitterförmige - Topologien manche Vorteile für Routingverfahren auf, in Wirklichkeit aber stammt die Bezeichnung Grid vom Englischen Begriff für Stromnetz (power grid) ab und weist eine beliebige Netzstruktur im Allgemeinen - und auf das Internet im Speziellen - hin. Die Analogie zum Stromnetz ist, dass Ressourcen im Grid transparent zur Verfügung gestellt und durch einfachen Anschluss an das Grid abgerufen werden können Siehe dazu Kapitel Vgl.: [BAUKE 2006] S.27f. 31 Vgl.:[BARTH 2006]

19 Tabelle 1: Linpack Top-5 Supercomputer Stand 06/2008 # System Standort Typ OS #Prozessoren GFlop/s 1. IBM BladeCenter QS22/LS21 Cluster 2. IBM eserver Blue Gene Solution 3. IBM Blue Gene/P Solution 4. Sun Microsystems SunBlade x Cray Inc. Cray XT4 LANL Cluster Linux (PowerXCell 8i, AMD Opteron Dual-Core) LLNL MPP Suse Linux Enterprise Server 9 / CNK ANL MPP Suse Linux Enterprise Server 9 / CNK (PowerPC 440) (PowerPC 450) TACC Cluster Linux (AMD x86_64 Opteron Quad Core) ORNL MPP CNL (AMD x86_64 Opteron Quad Core) Erläuterung: LANL: Los Alamos National Laboratory, National Nuclear Security Administration LLNL: Lawrence Livermore National Laboratory, National Nuclear Security Administration ANL: Argonne National Laboratory TACC: Texas Advanced Computing Center/Univ. of Texas, ORNL: Oak Ridge National Laboratory CNK: Compute Node Kernel; von IBM angepasster Linux-Kernel CNL: Compute Node Linux von Cray Inc. Quelle: Stand Ein wichtiges Alleinstellungsmerkmal des Grid-Computing - vor allem im wissenschaftlichen Bereich - gegenüber anderen Formen des Vernetzen Rechnens ist die Bereitstellung der Ressourcen auf volontärer Ebene. Dabei stellen die Teilnehmer freiwillig und kostenfrei nicht benötigte Rechenkapazität zur Verfügung, in sie ein Programm installieren, das mit niedriger Priorität ausgeführt wird und immer dann Berechnungen durchführt, wenn der Rechner nur gering ausgelastet ist

20 4 Parallelisierungsebenen Parallelisierung von Programmen kann auf verschiedenen konzeptionellen Ebenen erfolgen, für die es verschiedene Ansätze und Nebenbedingungen gibt. 4.1 Parallelität auf Instruktionsebene Die am dichtesten an der Hardware angesiedelte Ebene, in der eine Parallelisierung möglich ist, ist die Instruktionsparallelität. Unter bestimmten Voraussetzungen kann die Ausführung von Instruktionen eines an sich sequentiellen Programms von einer dafür ausgelegten CPU optimiert und parallel durchgeführt werden. Dabei legt der Scheduler die Reihenfolge der auszuführenden Instruktionen fest. Die zu parallelisierenden Instruktionen dabei lediglich auf folgende Abhängigkeiten zu prüfen: Fluss-Abhängigkeit 2. Anti-Abhängigkeit 3. Ausgabe-Abhängigkeit Die Prüfung der Abhängigkeiten beschränkt sich jeweils auf die Verwendung der CPU-Register durch die einzelnen Instruktionen. Besteht zwischen zwei Instruktionen keine dieser Abhängigkeiten, so können sie parallel ausgeführt werden. Eine Fluss-Abhängigkeit besteht immer dann, wenn eine Instruktion A einen Wert in ein Register lädt, das anschließend durch Instruktion B als Operand verwendet wird. In diesem Fall muss Instruktion A zwingend vor Instuktion B ausgeführt werden. Umgekehrt besteht eine Anti- Abhängigkeit, wenn Instruktion B einen Wert in ein Register lädt, dass Instruktion A als Operand verwendet. Eine parallele oder umgekehrte Ausführungsreihenfolge führt in beiden Fällen dazu, dass falsche Operanden verwendet werden. Wenn beide Instruktionen das selbe Register zur Speicherung eines Ergebnisses verwenden, spricht man von Ausgabe-Abhängigkeit. Hier kann eine Parallelisierung dazu führen, dass eine nachfolgende Operation das falsche Ergebnis aus dem Register liest. Es tritt eine sogenannte Race-Condition ein, bei der das Ergebnis davon abhängt, welche Instruktion schneller ausgeführt wurde. 4.2 Parallelität auf Datenebene Datenparallelität 33 liegt immer dann vor, wenn eine Operation auf mehrere, voneinander unabhängige Elemente oder Datenblöcke angewandt wird. Ein einfaches Beispiel hierfür ist eine Schleife, die ein Array mit Werten initialisiert: for(int i=0; i<size; i++){ array[i]=0; } 32 Vgl.: [RAUBER 2007] S.120f. 33 Vgl.: [RAUBER 2007] S.122f

21 Es ist in diesem Fall völlig unerheblich, in welcher Reihenfolge auf die einzelnen Array- Elemente zugegriffen wird, das Resultat ist stets dasselbe. Daher ließe sich die Berechnung in 1...size Teilschritte zerlegen, die parallel ausgeführt werden können. Ein anderes Beispiel ist die Matrizenmultiplikation A=B*C. Hier können alle Elemente der Ergebnismatrix A unabhängig voneinander berechnet werden. Tatsächlich stellt die Implementierung von Berechnungen als eine Reihe von Matrixoperationen eine der leichtesten Parallelisierungsmöglichkeiten dar, da für diese Operationen bereits parallele Verfahren existieren Parallelität in Schleifen Schleifen lassen sich parallelisieren, wenn zwischen einzelnen Iterationen keine Datenabhängigkeiten bestehen. Da dadurch die Reihenfolge der Iterationen unwichtig wird, kann jede Iteration unabhängig von den anderen ausgeführt werden. 35 Dieser Ansatz wird beispielsweise durch OpenMP verfolgt. Unter bestimmten Umständen lassen sich auch Schleifen parallelisieren, die Datenabhängigkeiten enthalten. Voraussetzung hierfür ist, dass sich die einzelnen Iterationen in Gruppen aufteilen lassen, deren Resultate sich zu einem Gesamtergebnis zusammenfassen lassen. So kann z.b. die folgende Schleife: for(int i=0; i<100; i++){ summe+=array[i]; } in Teilschleifen aufgeteilt werden, deren Einzelresultate sich durch Addition zu einem Gesamtergebnis zusammenfassen lassen: for(int i=0; i<50; i++){ summe1+=array[i]; } for(int i=50; i<100; i++){ summe2+=array[i]; } summe=summe1+summe2; Ist eine derartige Aufteilung möglich, kann die ursprüngliche Schleife ebenfalls parallel ausgeführt werden. Derartige Konstrukte werden von verschiedenen parallelen Schnittstellen unterstützt, wobei die lokalen Ergebnisvariablen (hier summe) nach Beendigung aller Schleifendurchläufe unter Verwendung eines sogenannten Reduktionsoperators zusammengefasst werden. 4.4 Parallelität auf Funktionsebene Bei der Verwendung rein funktionaler Programmiersprachen wie z.b. Haskell lassen sich alle Funktionsläufe parallel ausführen, da durch die Konzeption der Sprache Seiteneffekte ausgeschlossen sind. Funktionen bestehen dabei nur aus elementaren Operationen oder aus anderen 34 Siehe Kapitel Vgl.: [RAUBER 2007]S.123ff

22 Funktionen, besitzen Eingabe- und Rückgabewerte, lösen aber keine Aktionen aus. Somit ist ausgeschlossen, dass eine Funktion die Eingabedaten einer anderen Funktion manipuliert. Dieses Konzept lässt sich auch auf nicht rein funktionale Programmiersprachen anwenden, sofern für den parallelisierenden Teil ausschließlich Funktionen verwendet werden, die nur lokale Variablen verwenden. Dies entspricht der Zerlegung eines Programms sind unabhängige Teilaufgaben, sogenannte Tasks Vgl.: [RAUBER 2007]S.127ff

23 5 Parallele Programmiermodelle 5.1 Darstellung Die Darstellung der Parallelität innerhalb eines Programms kann an unterschiedlichen Stellen erfolgen. Es lässt sich hier grob zwischen impliziter und expliziter Darstellung unterscheiden, wobei sich jeweils weitere Detaillierungsgrade ableiten lassen. 37 Implizite Darstellung Die implizite Darstellung stellt sich aus Sicht eines Programmierers als einfachere Variante dar. Die Programmierung erfolgt gewohnt in sequentieller Weise, die Parallelisierung wird durch den Compiler oder durch die Eigenschaften der verwendeten Programmiersprache selbst realisiert. Die Parallelisierung durch einen Compiler erfordert, dass der Programmablauf und die Verbindungen zwischen Variablen analysiert und auf Parallelisierbarkeit hin untersucht werden. Dies ist ein sehr komplexer Vorgang und die erzielbaren Resultate sind in der Regel nicht sehr gut. Daher gibt es den Ansatz, im Quellcode Hinweise für den Compiler einzubetten, die Parallelisierbare Abschnitte anzeigen. Ein derartiger Ansatz - OpenMP - ist im Kapitel 9 beschrieben. Eine weitere Möglichkeit der impliziten Darstellung kann zum Beispiel durch die Verwendung rein funktionaler Programmiersprachen wie Haskell geschehen. Eine Parallelisierung kann Erfolgen, indem Funktionen, die als Argumente in anderen Funktionen auftreten, parallel ausgeführt werden, da in rein funktionalen Programmiersprachen Seiteneffekte ausgeschlossen sind. Explizite Darstellung Die Varianten der expliziten Darstellung sind zahlreicher als die der impliziten, da es mehr Einflussmöglichkeiten auf die konkrete Umsetzung der Parallelisierung gibt, während sich die implizite Darstellung letztendlich auf eine sehr formale Beschreibung der Parallelität beschränkt. Es lassen sich die folgenden vier Klassen unterscheiden: 1. Die Parallelität wird durch Konstrukte einer parallelen Programmiersprache (z.b. High Performance FORTRAN) oder durch Erweiterungen sequenzieller Programmiersprachen (z.b. OpenMP) explizit dargestellt. Die konkrete Umsetzung der Parallelität erfolgt jedoch durch den Compiler. 2. Die Zerlegung eines Algorithmus in parallele Abschnitte wird ebenfalls explizit vorgenommen, zum Beispiel durch Verwendung von mehreren Prozessen oder Threads. Die Aufteilung auf einzelne CPUs sowie die Kommunikation zwischen den Prozessen/Threads erfolgt durch den Compiler oder das Betriebssystem. 3. Die Zuordnung einzelner Prozesse/Threads zu den CPUs kann ebenfalls explizit vorgenommen werden. Dies ist jedoch nur in Ausnahmefällen notwendig, da die Verteilung von Prozessen auf CPUs durch das Betriebssystem vorgenommen werden sollte. 4. Die Synchronisation zwischen Prozessen sowie die Kommunikation und der Datenaustausch können ebenfalls explizit dargestellt werden. Als Vorteil wird angesehen, dass diese Methode die Verwendung eines Standard-Compilers erlaubt und eine sehr effiziente, auf den Anwendungsfall abgestimmte Implementierung zulässt, die dafür jedoch einen gewissen Aufwand 37 Vgl.: [RAUBER 2007]S.128ff

24 erfordert. Als Beispiel sind Message-Passing-Konzepte wie PVM und MPI zu nennen, auf die im Abschnitt 10.4 bzw. im Kapitel 8 genauer eingegangen wird. 5.2 Strukturierung Die Aufgabenverteilung zwischen den Prozessen kann auf verschiedene Weise erfolgen. 38 Häufig eingesetzte Modelle sind: Master-Worker: Hier wird die Arbeit durch ein oder mehrere Kindprozesse (Slaves) ausgeführt, die von einem Hauptprozess (Master) gestartet, kontrolliert und koordiniert werden. Pipelining: Beim Pipelining werden einzelne Prozesse so miteinander verbunden, dass die Ausgabe eines Prozesses direkt als Eingabe des nachfolgenden Prozesses dient, wobei alle Prozesse gleichzeitig aktiv sind. Client-Server: Dieses Modell entspricht in seiner Funktionsweise dem umgekehrten Master- Worker-Modell, mit dem zusätzlichen Unterschied, das es sich auf einen Netzwerkverbund bezieht und es mehrere Server geben kann. Die Rechenleistung wird durch den/die Server erbracht und von den Clients angefordert. 5.3 Datenverteilung und Kommunikation Die verschiedenen Arten, wie Daten zwischen Tasks ausgetauscht werden, können unter einer Menge von Operationen zusammengefasst werden. Diese werden so oder in ähnlicher Form durch die meisten parallelen Sprachen und Bibliotheken implementiert. Dabei lassen sich prinzipiell Einzel- und kollektive (globale) Operationen unterscheiden. Während erstere die asynchrone Kommunikation zwischen genau zwei Kommunikationspartnern beschreiben, werden letztere von alle beteiligten Einheiten gleichzeitig ausgeführt Broadcast Eine Broadcast-Operation verteilt Daten X, die einem Task P zugeordnet sind, auf alle anderen Tasks, so dass jeder Task nach der Operation exakt die gleichen Daten besitzt. P 1 : X P 2 : []... P n : [] Broadcast = P 1 : X P 2 : X... P n : X Eine Broadcast-Operation ließe sich auch mit n nachrichtenbasierten Einzeloperationen erzielen. Das Zusammenfassen der Einzeloperationen in eine einzige Broadcast-Anweisung erlaubt es, dem zugrundeliegenden System eine effizientere Reihenfolge für das Verteilen der Daten zu organisieren, indem die zugrundeliegende Topologie das Verteilungsschema bestimmt. Kriterien sind die notwendige Anzahl von Schritten, bis die Daten komplett verteilt sind, und die dafür notwendige Anzahl von Nachrichten. 38 Vgl.: [RAUBER 2007] S.133f. 39 Vgl.: [RAUBER 2007] S.142ff

25 Eine als Flooding bezeichnete Methode besteht darin, dass ausgehend von initiierenden Knoten, jeder Knoten die Daten genau einmal an alle benachbarten Knoten schickt, sobald er sie empfangen hat. Die maximale nötige Anzahl von Schritten entspricht hier dem Durchmesser des Graphen. 40 Die Anzahl der Nachrichten hängt von der Topologie ab. Ist die Topologie beispielsweise ein kompletter Graph, genügt genau ein Schritt, da jeder Empfänger direkt erreicht werden kann. Abbildung 4: Effiziente Broadcast-Operation Quelle: [BAUKE 2006] S Scatter Eine Scatter-Operation verteilt Daten X, die einem Prozess P zugeordnet sind, in Blöcken x : x X gleichmäßig auf alle Prozesse, so dass jeder Prozess eine eindeutige Teilmenge der ursprünglichen Daten hält. In der Regel wird eine direkte Zuordnung Prozess-Nummer = Block- Nummer vorgenommen, aber auch anderer Verteilungsmuster sind möglich. P 1 : X P 2 : []... P n : [] Scatter = P 1 : x 1 P 2 : x 2... P n : x n Gather Die Gather-Operation entspricht einer umgekehrten Scatter-Operation. Dabei werden die Blöcke x 1...x n aller Prozesse im Datenbereich eines einzelnen Prozesses zusammengefasst. Sie wird als Gather-all-Operation bezeichnet, wenn das Zusammenfassen der Blöcke für jeden Prozess geschieht, die Prozesse also nach der Operation jeweils über alle Datenblöcke verfügen. P 1 : x 1 P 2 : x 2... P n : x n Gather = P 1 : [x 1,..., x n ] P 2 : x 2... P n : x n 40 Vgl.: [SANTORO 2007] S.13f

26 P 1 : x 1 P 2 : x 2... P n : x n Gather All = P 1 : [x 1,..., x n ] P 2 : [x 1,..., x n ]... P n : [x 1,..., x n ] Reduktion Eine Reduktions- oder Akkumulations-Operation führt eine Funktion f() über den Daten aller Prozesse aus und stellt das Ergebnis in einem Prozess zur Verfügung. Typischerweise werden für f() arithmetische Funktionen (Summe, Produkt, Durchschnitt) oder Vergleichoperationen (größtes Element, kleinstes Element) implementiert. P 1 : x 1 P 2 : x 2... P n : x n Akkumulation = P 1 : f(x 1,..., x n ) P 2 : x 2... P n : x n Der Sinn kollektiver Reduktionsfunktionen liegt ebenfalls in der Erzielung einer höheren Geschwindigkeit durch Verringerung der Anzahl notwendiger Kommunikationsschritte gegenüber der entsprechenden Anzahl von Einzeloperationen oder Synchronisierungsoperationen. Eine Akkumulationsfunktion muss sowohl kommutativ als auch assoziativ sein, da die Reihenfolge der Einzeloperationen nicht vorhergesagt werden kann. Abbildung 5: Effiziente Akkumulations-Operation Quelle: [BAUKE 2006] S Synchronisation Eine parallele Ausführung bedeutet nicht, dass Programme auch synchron ausgeführt werden. Neben unterschiedlichen Prozessorgeschwindigkeiten und der jeweiligen Prozessorauslastung gibt es eine Reihe von Störfaktoren, die Einfluss auf die tatsächliche Ausführungsgeschwindigkeit haben. Daher kann man nicht davon ausgehen, dass sich eine gemeinsame Ressource - wie zum Beispiel ein Speicherinhalt - in einem stets definierten Zustand befindet. Wenn ein Prozess einen Abschnitt erreicht, der einen definierten Zustand voraussetzt, muss dieser zunächst hergestellt werden. Dies wird durch Synchronisationsmechanismen erreicht, die dafür sorgen, dass sich die zu synchronisierende Ressource zu einem bestimmten Zeitpunkt für jeden beteiligten

27 Prozess in einem definierten Zustand befindet. Beispielsweise stellt die Speichersynchronisation identische Speicherinhalte für alle Prozesse sicher, eine Ablaufsynchronisation sorgt dafür, dass alle parallelen Prozesse die exakt gleiche Stelle im Programmtext erreicht haben Kritische Abschnitte Bei Race-Conditions ist der Zustand einer Ressource davon abhängig, welche Prozesse in welcher Reihenfolge darauf zugreifen. Insbesondere nicht-atomare Anweisungen, die während der Ausführung unterbrochen werden können, sind dafür anfällig. Solche Programmabschnitte werden als Kritische Abschnitte bezeichnet. Für die Koordinierung der Prozesse sind eine Reihe von Verfahren bekannt. 41 Parallele Sprachen und Bibliotheken stellen in der Regel Möglichkeiten zum Kennzeichnen kritischer Abschnitte bereit, so dass der Programmierer keine eigene Zugriffssteuerung implementieren muss. Probleme bereiten nur solche kritischen Abschnitte, die vom Programmierer nicht als kritisch erkannt werden, da die dadurch resultierenden Programmfehler sporadisch, an verschiedenen Programmstellen und schlecht reproduzierbar auftreten können, was den Anschein zufälliger Fehler erzeugt. Weiterhin kann es vorkommen, dass optimierende Compiler Code erzeugen, der nicht der Ausführungsreihenfolge der Anweisungen im Quelltext entspricht Barrieren Barrieren sind eine Methode der Ablaufsynchronisation. Sie stellen sicher, dass sich alle Prozesse zu einem bestimmten Zeitpunkt an der selben Stelle im Programmtext - der Barriere - befinden. Nachdem alle Prozesse die blockierende Barriere erreicht haben, werden sie synchron fortgesetzt. Dabei kann es vorkommen, dass einzelne Prozesse sehr lange auf andere warten müssen. Nicht-blockierende Barrieren dagegen erlauben es einem Prozess, mit der Ausführung von Programmcode fortzufahren, der nicht von anderen Prozessen abhängig ist, sofern diese mindestens eine bestimmte Stelle im Programmcode erreicht haben. Auf diese Weise kann ein Performancegewinn erzielt werden, da die Wartezeiten verkürzt werden können Locks Der konkurrierende Zugriff auf Ressourcen kann durch Locking-Mechanismen gesteuert werden. Locks stellen eine Möglichkeit dar, Race-Conditions zu vermeiden, da der Zugriff auf gemeinsame Ressourcen exklusiv erfolgt. Anders als kritische Abschnitte können Locks über verschiedene Programmteile hinweg aufrecht erhalten werden. So kann an einer Stelle ein Lock erzeugt und später an einer anderen Stelle wieder freigegeben werden. Die Verantwortung für die Freigabe eines Locks liegt allein beim Programmierer, daher ist die Verwendung potentiell Anfällig für Deadlock-Situationen. 41 Vgl. hierzu: [CARVER 2006] S. 46ff

28 6 Einflussfaktoren Paralleler Programme 6.1 Parallele Skalierbarkeit Durch Parallelisierung soll in der Regel ein Geschwindigkeitszuwachs in der Form erzielt werden, dass pro Zeiteinheit mehr Rechenoperationen durchgeführt werden. Ähnlich der Frage nach den Grenzkosten oder dem Grenznutzen in der BWL und VWL stellt sich auch hier die Frage, welcher Aufwand - vor allem in Form zusätzlicher Rechner oder Prozessoren - für eine Parallelisierung notwendig ist und in welchem Verhältnis dieser zum erzielten Geschwindigkeitsgewinn steht Speedup Geht man davon aus, dass ein parallelisierbares Programm auf einem Prozessor die Rechenzeit T 1 benötigt, so ist die Rechenzeit auf p Prozessoren im optimalen Fall T 1 /p. Parallelisierbare Abschnitte machen in der Regel nur einen Teil des gesamten Programms aus, so dass ein bestimmter Anteil der Rechenzeit immer für einen sequentiellen Teil verbraucht wird, der konstant ist. Durch Erhöhung der Parallelität nimmt im parallelen Teil die Rechenzeit pro Prozessor ab, was beabsichtigt ist, wodurch der relative Anteil der sequentiellen Abschnitte größer wird. Das führt dazu, dass eine obere Grenze für den erzielbaren Geschwindigkeitszuwachs durch Hinzunahme eines weiteren Prozessor existiert. Dieser Effekt wird nach seinem Entdecker Gene Amdahl als Amdahl sches Gesetz 42 bezeichnet. Ist für Eingaben der Größe n die Rechenzeit auf einem Prozessor T 1 (n) und die Rechenzeit auf p Prozessoren T p (n), so ergibt sich der theoretisch erzielbare Geschwindigkeitszuwachs (Speedup) aus: 43 S p (n) = T 1(n) T p (n) (1) Der höchste theoretisch erzielbare Speedup ist S p (n) = p, was einem linear skalierenden Programm entspricht. In der Praxis kann jedoch ein Speedup S p (n) > p auftreten, was als superlinearer Speedup bezeichnet wird. Dies kann dadurch eintreten, dass die Problemgröße bzw. Datenmenge pro Prozessor so klein wird, dass geschwindigkeitssteigernde Effekte durch Caching-Mechanismen eintreten 44. Es ließe sich auch umgekehrt argumentieren, nämlich dass im Regelfall geschwindigkeitssenkende Effekte durch Verwendung langsamerer Komponenten außerhalb des schnellen Cache bei zu großen Datenmengen die Ursache sind Amdahl sches Gesetz Amdahl nimmt einen Faktors f für den seriellen Anteil 45 eines Programmlaufs an, so dass sich die parallele Rechenzeit aus der Summe des nicht parallelisierbaren Anteils und des paralleli- 42 Vgl.: [CHAPMAN 2008] S. 33f., [CHANDRA] S. 173f., [BAUKE 2006] S.10ff., [RAUBER 2008] S. 170ff., [RAUBER 2007] S.37f., [HOFFMANN 2008] S.13ff., [EM KARNIADAKIS 2000] S.39f. 43 Vgl.: [RAUBER 2007] S Vgl.: [RAUBER 2008] S.37, [RAUBER 2007] S In der Literatur wird auch statt des seriellen Anteils f der parallele Anteil verwendet. Der Teiler ist dann entsprechend umzustellen

29 sierbaren Anteils von T 1 ergibt: T p (n) = f T 1 (n) + 1 f T 1 (n) p Nach obiger Formel ergibt sich der nach Amdahl erzielbare Speedup als eine von n unabhängige Größe, was als Amdahl sches Gesetz bezeichnet wird: 46 S p (n) = T 1 (n) f T 1 (n) + 1 f p T 1(n) {f R 0 f 1}{p N p > 0} S(p) = ( 1 f + 1 f p ) (2) Der in Abhängigkeit des Faktors f erzielbare Speedup ist in Abbildung 6 dargestellt 47. Im optimalen Fall einer vollständigen Parallelisierbarkeit mit f=1.0 skaliert ein Programm linear, während bereits für f=0.95 der Zuwachs sehr schnell und deutlich stagniert. In dieser Berechnung ist noch nicht berücksichtigt, dass mit höherer Parallelität der zusätzliche Aufwand für die Erzeugung von Threads/Prozessen sowie für die Synchronisation und den Datenaustausch ebenfalls ansteigt. Abbildung 6: Parallele Skalierbarkeit nach Amdahl Quelle: eigene Darstellung Gustafson-Gesetz Neben dem hier beschriebenen Amdahl schen Gesetz existieren eine Reihe von Varianten, die weitere Faktoren berücksichtigen. Dazu gehören Beispielsweise der in Abhängigkeit von p stei- 46 Vgl.: [RAUBER 2007] S.170, [RAUBER 2008] S.38, [EM KARNIADAKIS 2000] S.79f., 47 Ein Rechner mit 16 Rechenkernen stellt dabei eher die untere Grenze heutiger Parallelrechner dar. Entsprechende Boards mit 4 Sockeln sowie Quad-Core-Prozessoren sind im normalen Handel erhältlich. Ein heutiger kleiner Supercomputer ist Beispielsweise der Cray CX1, der noch unter einem Schreibtisch Platz findet, und bis zu 16 Quad-Core CPUs enthält. Ein Cray XMT enthält bis zu 8096 CPUs. (

30 gende Kommunikationsaufwand, wodurch bei großen p eine weitere Erhöhung zu einer Verringerung des Speedup führt, wie in Abbildung 7 dargestellt. Abbildung 7: Parallele Skalierbarkeit nach Amdahl Quelle: [BAUKE 2006] S.12 Eine weitere Variante besteht darin, den parallelisierbaren Anteil auch in Abhängigkeit von der Eingabegröße zu betrachten. Dabei wird eine konstante Ausführungszeit für den sequentiellen Teil angenommen, wodurch bei steigender Eingabegröße der sequentielle Anteil abnimmt. Das Amdahl sche Gegenstück hierfür ist eine monoton sinkende Funktion f(p, n) > 0 anstelle des Faktors f. In der Betriebswirtschaft existieren prinzipiell zwei Möglichkeiten, um bei konstanten Verkaufszahlen den Gewinn und somit die Effizienz des Kapitaleinsatzes zu erhöhen: eine Erhöhung der Preise oder eine Senkung der Kosten. Um die Effizienz von Parallelisierungsmaßnahmen zu erhöhten, gibt es ebenfalls zwei grundsätzliche Möglichkeiten: Verringerung der Rechenzeit durch mehr Prozessoren oder Erhöhung der Eingabegröße. Die Verringerung der Rechenzeit durch steigende Prozessorzahlen ist durch die bisher beschriebenen Gesetzmäßigkeiten limitiert. Weiterhin stellt sich die Frage, ob eine signifikante Verringerung der Rechenzeit den dafür notwendigen zusätzlichen Aufwand überhaupt rechtfertigt, was in der Regel nur auf sehr zeitkritische oder aber sehr langwierige Berechnungen zutreffen dürfte. Ein alternatives Ziel stellt eine bei etwa gleichbleibender Rechenzeit erzielbare Erhöhung der Eingabegröße dar. Als Beispiel soll hier eine Anfrage an eine Internet-Suchmaschine dienen. Wenn die Antwortzeit in einem akzeptablen Bereich von z.b. wenigen Sekunden liegt, hat eine weitere Verringerung der Antwortzeit im Verhältnis zur damit verbundenen Erhöhung der Rechenkapazität nur wenig Sinn, wohl aber die Vergrößerung der Suchraumes, um die Trefferzahl zu erhöhen oder die Trefferqualität zu verbessern. Beim Gustafson-Gesetz 48 wird die Eingabegröße berücksichtigt, indem von einer gegebenen parallelen Laufzeit T p (n) für ein Problem ausgegangen und diese in Relation zur hypothetischen sequentiellen Laufzeit T 1 (n) = ft p (n) + p(1 f)t p (n) gesetzt wird. In Anlehnung an die bisherige Notation ergibt sich daraus der skalierte Speedup: S p (n) = ft p(n) + p(1 f)t p (n) T p (n) = f + p(1 f) = p + (1 p)f (3) 48 Vgl.: [RAUBER 2007] S. 171f., [RAUBER 2008] S. 27f., [BAUKE 2006] S.16, [HOFFMANN 2008] S.16f

31 In Abbildung 8 ist der Unterschied zwischen beiden Ansätzen für f=0.05 beispielhaft dargestellt. Der fast lineare Speedup nach Gustafson beruht darauf, dass für ein gegebenes paralleles Problem die entsprechende rein sequentielle Rechenzeit durch die damit linear steigende Eingabegröße zunimmt, während Amdahls Ansatz ein gegebenes Problem auf einem einzelnen Rechner durch Parallelisierung schneller zu lösen versucht, was durch den stets geringer werdenden parallelen Anteil eine asymptotische Funktion zur Folge hat. Abbildung 8: Speedup Amdahl vs. Gustafson Quelle: eigene Darstellung Karp-Flatt-Metrik Nun lässt sich der Faktor f nur sehr schwer anhand theoretischer Überlegungen oder Quelltextanalysen bestimmen. Durch Messung lässt sich f jedoch für ein bestimmtes Problem und Programm empirisch feststellen. Ein solches Maß ist die Karp-Flatt-Metrik. Dabei wird für mehrere p der Wert von T(p) experimentell bestimmt. Anschließend kann durch Amdahl s Gesetz der entprechende empirische Anteil f bestimmt werden: 49 f = 1/S p(n) 1 p 1 1 p Anhand des Verhaltens dieses Wertes zu p lässt sich aussagen, ob der Speedup eher vom sequentiellen Anteil oder vom durch die Parallelisierung induzierten Rechenaufwand (Overhead) bestimmt wird. Letzteres ist daran zu erkennen, dass f mit steigender Prozessorzahl zunimmt, wodurch auch der Speedup langsamer steigt, als durch Amdahl s Gesetz beschrieben. Die Effizienz der Parallelisierung lässt sich aus dem Verhältnis zwischen Prozessor-Anzahl p und dem dadurch erzielten Speedup S(p) bestimmen: 49 Vgl.: [BAUKE 2006] S.16f

32 E(p) = T (1) pt (p) = S(p) p 6.2 Load Balancing und Scheduling Die Aufteilung einer Rechenaufgabe in Teilaufgaben und deren Zuordnung zu Prozessen kann auf verschieden Weise erfolgen. Dies wird als Scheduling bezeichnet. Die Aufteilung erfolgt anhand einer Strategie mit dem Ziel, für eine Aufgabe eine möglichst effiziente Ressourcennutzung zu erzielen. Es lassen sich statische und dynamische Scheduling-Strategien unterscheiden. Die Verwendung einer bestimmten Strategie kann Auswirkungen auf die Gestaltung des Programms haben. Die verwendete Scheduling-Strategie hat Auswirkungen auf die Ausführungsgeschwindigkeit paralleler Programme. Insbesondere statische Strategien sind anfällig für Verzögerungen bei einzelnen Prozessen. Die gesamte Abarbeitungszeit ist dabei vom langsamsten Prozess abhängig. Dies führt dazu, dass eine sehr starke Parallelisierung oft nicht den erwarteten Effekt hat. Besonders wenn die Anzahl der Prozesse sich der Zahl verfügbarer Prozessoren annähert, steigt die Wahrscheinlichkeit, dass einzelne Prozesse sich Ressourcen mit anderen Prozessen teilen müssen, wodurch diese eine längere Zeit zur Beendigung ihrer Aufgabe benötigen. Dynamische Strategien oder das Master-Worker-Modell haben den Vorteil, dass Rechenaufgaben an die gerade verfügbaren Prozesse / Prozessoren verteilt werden. Verzögerungen einzelner Prozesse können leicht kompensiert werden, indem schnellere Prozesse zusätzliche Anteile übernehmen Lokalität Unter Lokalität versteht man, dass die zu verarbeitenden Daten sich im direkten Zugriff des Verarbeiters befinden. Tun sie es nicht, müssen sie erst dorthin übertragen werden, was Zeitaufwändig ist. Diese Beschreibung ist sehr allgemein und kann sich auf unterschiedliche Bereiche bzw. Ebenen beziehen. Je höher diese Ebene angesiedelt ist, desto größer ist der Einfluss der Lokalität auf die Rechengeschwindigkeit, da der Aufwand zur Datenübertragung steigt und die Übertragungsgeschwindigkeit in der Regel sinkt. In einem Computercluster aus mehreren Knoten und einem Verbindungsnetzwerk sind Daten lokal, wenn sie im Speicher des Knoten verfügbar sind, der sie Verarbeitet. Auf der Ebene eines Parallelrechners mit mehreren Prozessoren sind Daten lokal, wenn sie sich im durch den Prozessor adressierbaren physikalischen Speicher befinden, auf Ebene eines Prozessors oder Prozessorkernes dann, wenn sie sich in dessen Cache oder gar in den Prozessorregistern befinden. Der Einfluss der Lokalität lässt sich bereits in seriellen Programmen feststellen. Die Geschwindigkeit, mit der auf Daten zugegriffen werden kann, hängt sehr stark davon ab, ob der Prozessor diese erst aus dem relativ langsamen Hauptspeicher lesen muss, oder ob die Daten bereits im deutlich schnelleren 2nd-Level oder gar 1st-Level Cache zur Verfügung stehen. Caching erfolgt in der Regel blockweise, so dass beim erstmaligen Zugriff auf eine Speicherzelle im RAM auch 50 Zum Vergleich der Strategien siehe Kapitel

33 Abbildung 9: Row- vs. Column-first Ordering Quelle: Eigene Darstellung. benachbarte Bytes in den Cache übertragen werden. Im Zusammenspiel damit, wie ein Compiler Daten - insbesondere Arrays - im Hauptspeicher ablegt, hat dies Auswirkungen auf die Ausführungsgeschwindigkeit des Programms. Im C-Standard wird Row-First-Ordering verwendet. 51 Das bedeutet, die Indizes [0][0] und [0][1] liegen im Speicher an hintereinander folgenden Adressen. Folglich müssen Matrizenoperationen, die Zeilenweise durchlaufen werden, schneller sein als solche, die Spaltenweise arbeiten. Wie groß der Unterschied tatsächlich ist, verdeutlicht die Abbildung 9. Es wurde die Zeit gemessen, um die Summe aller Matrizenelemente für quadratische Matrizen verschiedener Größen zu berechnen. 6.4 Speichersynchronisation Die Einhaltung einer identischen, eindeutigen Sicht aller Prozesse auf den gemeinsamen Speicher wird durch Synchonisierungsmechanismen realisiert. Es lassen sich verschieden strikte Modelle unterscheiden: 52 Das Modell mit den meisten Einschränkungen ist das sequentielle Konsistenzmodell. Es stellt sicher, dass Veränderungen gemeinsamer Variablen unmittelbar und in exakt der gleichen zeitlichen Reihenfolge, in der sie von allen Prozessen ausgeführt werden, für alle Prozesse sichtbar sind. Dies bedeutet im Prinzip eine sofortige Synchronisierung der betroffenen Speicherinhalte nach einem Schreibzugriff. Abgeschwächte Konsistenzmodelle erlauben beschränkt inkohärente Speicherzustände für bestimmte Programmabschnitte was sowohl den Speicherinhalt als auch die Zugriffsreihenfolge betrifft. Da es nicht immer notwendig ist, stets eine kohärente Sicht auf den Speicher zu 51 Vgl. hierzu: [BRANDS 2005] Kapitel 6 - Mehrdimensionale Felder, S. 300ff. 52 Für eine detaillierte Beschreibung siehe [RAUBER 2007] S.92ff

34 gewährleisten, z.b. wenn nacheinander mehrere Schreibzugriffe erfolgen und nur der letzte Zugriff das endgültige Resultat darstellt, kann so die Ausführungsgeschwindigkeit von Programmen deutlich erhöht werden. Die Synchronisierung erfolgt in solchen Fällen explizit nach Beendigung des jeweiligen Programmabschnitts. Parallele Bibliotheken und Programmiersprachen unterstützen in der Regel verschiedene Konsistenzmodelle. Da diese direkte Auswirkungen auf die Funktionsweise und Ausführungsgeschwindigkeit eines parallelen Programms haben, ist dieses Thema auch aus Sicht eines Programmierers relevant

35 Teil II Bibliotheken und Systeme Es existieren eine Reihe von Programmbibliotheken und Compilern, die das entwickeln Paralleler Programme unterstützen sollen. Viele davon sind GPL-Lizensiert und frei verfügbar. In diesem Teil wird auf konkrete Implementierungen und Schnittstellen für das entwickeln paralleler Algorithmen unter C/C++ eingegangen. Development of parallel programs is supported by various programming libraries, interfaces and compilers. Many of them are license under the GPL Public License, which makes them freely available. This chapter provides an introduction to interfaces and programming libraries for the C/C++ programming language

36 7 Unified Parallel C Unified Parallel C (UPC) 53 erweitert ANSI C um Konstrukte, die einen Einsatz auf Hochleistungs- Parallelrechnern ermöglichen 54. Dafür wurden der Sprache C folgende Erweiterungen hinzugefügt: Ein explizites paralleles Ausführungsmodell Ein gemeinsamer Adressraum Synchronisationsmechanismen Speicherkonsistenzmodelle Eine angepasste Speicherverwaltung Die Spezifikation von UPC wurde von einem Konsortium aus Unternehmen, Bildungsträgern und Regierungsorganisationen der USA entwickelt. Die Zusammensetzung des Konsortiums ist der Übersicht im Anhang A.2 zu entnehmen. Um UPC nutzen zu können, sind spezielle Compiler erforderlich. Diese basieren häufig auf quelloffenen C/C++ Compilern, die um UPC-Konstrukte erweitert wurden. In Tabelle 2 auf Seite 82 sind einige aktuell verfügbare Compiler und die jeweils unterstützten Betriebssysteme und Rechnerarchitekturen aufgeführt. Der in dieser Arbeit verwendete Compiler ist der GCC UPC in der Version Verfügbarkeit Ein UPC-Compiler für Linux-Systeme basierend auf dem GCC ist im Internet verfügbar und kann kostenfrei heruntergeladen werden. Neben bereits übersetzten Paketen für verschiedene Prozessoren und Distributionen ist auch ein Quellpaket vorhanden. 55 Nach dem Entpacken der Quellen ist ein separates Verzeichnis anzulegen, in dem die Übersetzung erfolgt, typischerweise build genannt. Die Konfiguration der Make-Umgebung erfolgt mittels des mitgelieferten configure-skriptes. Um nicht in Konflikt mit existierenden GCC- Compilern zu kommen, ist es empfehlenswert, den UPC in einem separaten Verzeichnis zu installieren, z.b. /usr/local/upc. Die Befehle zum Übersetzen der Quellen und anschließendem Installieren sind: $ t a r x z f upc s r c. t a r. gz && cd upc && mkdir b u i l d && cd b u i l d $.. / c o n f i g u r e p r e f i x =/ u s r / l o c a l / $ make && make i n s t a l l 7.2 Parallelisierungskonzept Die Parallelisierung mittels UPC erfolgt durch Threads. Sie unterscheidet sich jedoch von herkömmlicher Thread-Programmierung dadurch, dass der Code für die Erzeugung der Threads durch den UPC-Compiler in das Programm integriert wird und nicht durch den Programmierer. 53 Vgl.: [CHAUVIN 2008], [RAUBER 2007] S.371ff., 54 UPC Homepage: Stand

37 Die Anzahl zu verwendender Threads kann sowohl zur Übersetzungszeit als auch zur Laufzeit festgelegt werden. Um Berechnungen parallel durchzuführen, wird ein Schleifenkonstrukt upc_forall verwendet: upc_forall ( expr1; expr2; expr3; affinity) Die Syntax entspricht exakt der C-Syntax für for-schleifen, mit dem Unterschied, dass ein vierter Parameter affinity existiert, der angibt, durch welchen Thread die aktuelle Iteration durchgeführt wird. Dies kann entweder durch die Angabe der Thread-Nummer oder einer Speicheradresse geschehen. In letzterem Fall wird die Iteration durch den Thread durchgeführt, in dessen Adressraum die Speicheradresse liegt. Dies ist insbesondere dann nützlich, wenn über ein verteiltes Array iteriert wird und die Lokalität verschiedener Array-Elemente ausgenutzt werden soll. 7.3 Speichermodell UPC implementiert ein Modell mit verteiltem Speicher, wobei dieser sowohl gemeinsam (shared) als auch einzeln (private) genutzt werden kann. Der private Speicher eines Threads liegt ausschließlich in seinem eigenen Adressraum und ist nur für ihn selbst sichtbar. Privater Speicher liegt immer dann vor, wenn Speicher in herkömmlicher C-Notation alloziert wird, so das es hier keinen Unterschied zur nicht-parallelen Programmierung gibt. Gemeinsam genutzter Speicher wird durch Verwenden des neuen Schlüsselwortes shared erzeugt. Auf eine als shared deklarierte Variable kann von allen Threads aus zugegriffen werden. Folgendes Listing zeigt einige Möglichkeiten, private und gemeinsame Variablen zu definieren: int local_i; shared int global_i; shared int * ptr1; // private Variable // gemeinsame Variable // privater Zeiger auf gemeinsame Variable shared int * shared ptr2; // gemeinsamer Zeiger auf gemeinsame Variable Eine interessante Variante bilden verteilte Arrays. Die Deklaration erfolgt folgendermaßen: shared [block_size] typ name[size]; Ein derart erzeugtes Array wird in Blöcken der Größe block_size komplett auf den gemeinsamen Speicher verteilt. Wird das Array anschließend durch eine upc_forall-schleife verarbeitet, kann auf diese Weise bereits eine Zuordnung des verwendeten Speichers zu den einzelnen Threads vorgenommen werden, so dass Zugriffe auf die Array-Elemente lokal erfolgen können. Anderenfalls würden Zugriffe auf Elemente, die sich im Speicherbereich eines anderen Threads befinden, in entfernte Zugriffe umgewandelt werden müssen, was einen gewissen Kommunikationsaufwand erfordert und daher langsamer ist. Standardmäßig wird eine Blockgröße von 1 angenommen. Eine Blockgröße von 0 würde dazu führen, dass alle Elemente im Speicherbereich des ersten Threads abgelegt werden. Im Folgenden sind zwei Beispiele für die Verteilung von Elementen bei verschiedenen Blockgrößen dargestellt:

38 shared int a[10]; Thread 1 Thread 2 Thread 3 Thread 4 a[0] a[4] a[8] a[1] a[5] a[9] a[2] a[6] a[3] a[7] shared [2] int a[10]; Thread 1 Thread 2 Thread 3 Thread 4 a[0] a[1] a[8] a[9] a[2] a[3] a[4] a[5] a[6] a[7] Verteilte Arrays müssen global und dürfen nicht dynamisch sein. Daher ist das Anwendungsfeld dieser einfachen Notation von vornherein beschränkt. Weiterhin ist die Verwendung lokaler Variablen, z.b. in Funktionsrümpfen, für die Parallelisierung ausgeschlossen. Es kann zwar verteilter, dynamisch allozierter Speicher erzeugt werden, jedoch muss dieser dann durch entsprechende Speichermanipulationsroutinen explizit gefüllt werden. Diese Beschränkung lässt sich durch Verwendung dynamisch allozierten verteilten Speichers umgehen. UPC bietet dazu verschiedene malloc-ähnliche Funktionen. UPC stellt zwei Konsistenzmodelle bereit: strict und relaxed. Das strict-modell stellt sicher, dass vor Speicherzugriffen eine Synchronisation stattfindet. Ebenso werden Optimierungen seitens des Compilers unterbunden, welche die Reihenfolge von Zugriffsoperationen auf unabhängige Speicherbereiche verändern. Das relaxed-modell dagegen erlaubt den jederzeitigen Speicherzugriff. Synchonisierung und Locking-Mechanismen müssen dabei explizit im Programmtext implementiert werden. Das verwendete Konsistenzmodell kann entweder global durch das Einbinden der Header- Dateien upc_strict.h oder upc_relaxed.h erfolgen, durch #pragma-direktiven für einzelne Programmabschnitte festgelegt, oder direkt bei der Variablendeklaration bestimmt werden. #include <upc_strict.h> #include <upc_relaxed.h> strict shared int i; strict relaxed int j; { #pragma upc strict // code-block

39 } #pragma upc relaxed { #pragma upc relaxed // code-block } 7.4 Synchonisation Neben den beschriebenen Konsistenzmodellen stellt UPC für die Synchronisation weitere Mechanismen bereit. Locks Locking-Mechanismen lassen sich auf Daten-Ebene verwenden. Dabei können gemeinsame Variablen durch den Aufruf von upc_lock() für den Zugriff durch andere Threads gesperrt und später durch upc_unlock() wieder freigegeben werden. Barrieren UPC stellt Barrier-Konstrukte bereit, mit denen sichergestellt werden kann, dass zu einem Zeitpunkt alle Threads eine bestimmte Stelle im Programmcode erreicht haben. Es werden blockierende und nicht-blockierende Barrieren unterschieden. Blockierende Barrieren werden über das upc_barrier-kommando in den Programmcode eingefügt. Der Programmablauf wird an dieser Stelle unterbrochen, bis alle anderen Threads die selbe Stelle erreicht haben. 7.5 Globale Operatoren UPC unterstützt Datenverteilungs- und Sammeloperationen, Reduktionsoperationen sowie Einund Ausgabeoperationen. Diese werden als Funktionsaufruf an entsprechender Stelle im Programmtext eingefügt. Zur Datenverteilung sind Scatter-, Gather- sowie Permutationsverfahren implementiert. Als Reduktionsoperationen stehen arithmetische binäre Operatoren sowie Sortieroperationen zur Verfügung. Der koordinierte Zugriff auf Dateien und das Lesen und Schreiben aus bzw. in gemeinsame Speicherbereiche wird unterstützt

40 8 Message Passing Interface Message-Passing ist ein Konzept für Parallelrechner mit verteiltem Speicher. Die logische Sicht ist, dass Prozesse nur Zugriff auf ihren lokalen Speicher haben, aber miteinander durch das Versenden von Nachrichten kommunizieren können, unabhängig davon, auf welchem Prozessor oder Rechner sie gerade ausgeführt werden. Ein derartiges Modell wird beispielsweise durch MPI oder PVM dargestellt und lässt sich auf verschiedene physische Rechnerarchitekturen abbilden. Abbildung 10: Message-Passing Quelle: [BAUKE 2006] S.45 MPI ist eine Spezifikation für die Abbildung eines Modells nach dem Message-Passing-Prinzip. Es ist ein Standard, der Schnittstellen für die Sprachen C und Fortran definiert. Die Erweiterung MPI-2 stellt Schnittstellen auch für C++ bereit. Auf MPI-Standards wird hauptsächlich durch die Bezeichnungen MPI-1 und MPI-2 verwiesen. MPI-I entspricht dabei der Version MPI 1.2 von MPI-2 ist eine spätere abwärtskompatible Entwicklung, die MPI-1 um neue Funktionen erweitert. Dieser Standard wird nur von sehr wenigen MPI-Implementierungen vollständig unterstützt. MPI ist extrem umfangreich und es existieren von vielen Funktionen mehrere Varianten, die sich nur in Details voneinander unterscheiden. Daher kann MPI hier nur ansatzweise dargestellt werden. Für Details sei auf die Literatur verwiesen Vgl. hierzu: [EM KARNIADAKIS 2000]S.80ff., [RAUBER 2007] S.207ff, [BAUKE 2006] S.167ff., [GROPP 2007]

41 8.1 Verfügbarkeit Da MPI keine spezifische Implementation beinhaltet, existieren verschiedene MPI-Bibliotheken, die meist auf eine spezielle Rechnerarchitektur angepasst sind. Frei verfügbare Implementierungen sind z.b. Open-MPI, LAM-MPI und das vom Argonne National Laboratory stammende MPICH/MPICH2. Daneben existieren noch weitere proprietäre und teils optimierte Lösungen wie z.b. die Intel MPI Library. 8.2 Parallelisierungskonzept Eine MPI-Anwendung besteht stets aus einer konstanten Anzahl von Prozessen. Diese kann beim Programmstart variabel festgelegt werden, lässt sich jedoch zur Laufzeit nicht mehr verändern. Häufig geschieht das Aufrufen eines MPI-Programms durch ein separates Startprogramm, dass von der verwendeten Implementierung zur Verfügung gestellt wird und das entsprechend viele Instanzen des eigentlichen MPI-Programms aufruft. Da MPI auch in heterogenen Rechnerumgebungen ausgeführt werden kann, müssen alle Nachrichten auf MPI-Datentypen abgebildet werden, die von MPI bei Bedarf in die entsprechende Darstellung konvertiert werden. Um komplexere Datenstrukturen nicht Wert für Wert übertragen zu müssen, können eigene MPI-Datentypen und Strukturen definiert werden. 8.3 Speichermodell Einem MPI-Programm sind dabei lokal Daten zugeordnet, auf die frei zugegriffen werden kann. Durch das Verschicken von Nachrichten kann ein MPI-Programm mit anderen MPI- Programmen kommunizieren und so Daten austauschen. MPI definiert verschiedene Funktionen, die Verteil- und Sammeloperationen durchführen. Dabei ist es nicht möglich, dass ein Prozess unbemerkt die Daten eines anderen Prozesses verändern kann, da alle Kommunikationsoperationen stets, jedoch nicht zwingend synchron, durch alle beteiligten Prozesse aufgerufen werden müssen. 8.4 Synchronisation Barrieren und Kritische Abschnitte werden von MPI nicht unterstützt. Dies ist auch nicht notwendig, da jeder Prozess nur Zugriff auf lokalen Speicher hat. Eine Koordinierung des Programmablaufs erfolgt ausschließlich durch das Versenden von Nachrichten mit blockierenden Funktionen. MPI unterstützt bei vielen Kommunikationsfunktionen sowohl synchrone als auch asynchrone Varianten. 8.5 Globale Operatoren MPI unterstützt eine Vielzahl von Datenverteilungs- und Aggregierungsfunktionen. Scatter-, Gather und Reduktionsoperationen sind als globale blockierende Operationen implementiert, die von alle beteiligten Prozessen gleichzeitig ausgeführt werden müssen

42 9 OpenMP OpenMP 57 ist eine Programmierschnittstelle (API) für Fortran und C/C++, um parallele Programme mit gemeinsamem Speicher zu realisieren. Es wurde mit der Maßgabe entworfen, vorhandenen, sequentiellen Code auf einfache Weise zu parallelisieren und dabei schrittweise vorgehen zu können. Ein Ziel von OpenMP ist, dass der vorhandene sequentielle Programmcode nicht oder nur minimal verändert und statt dessen durch Compilerdirektiven ergänzt wird. Ein OpenMP-Programm kann daher auch von einem nicht-openmp-fähigen Compiler übersetzt werden 58, da unbekannte Direktiven grundsätzlich ignoriert werden. Die Aufgabe des Programmierers ist es daher nicht, Algorithmen in eine parallele Version zu ändern, sondern parallelisierbare Abschnitte zu identifizieren, zu kennzeichnen und zu spezifizieren. Dazu stellt OpenMP eine Reihe von Direktiven, Bibliotheksfunktionen und Variablen bereit. 9.1 Verfügbarkeit Um OpenMP nutzen zu können, ist ein entsprechender Compiler erforderlich. In Tabelle 2 im Anhang A.2 ist eine Übersicht verschiedener Produkte aufgeführt, die OpenMP unterstützen. 9.2 Parallelisierungskonzept Grundsätzlich arbeitet OpenMP nach dem Thread-Konzept. Im Gegensatz zu den meisten anderen Konzepten, bei denen ein Programm von Anfang parallel ausgeführt wird, benutzt OpenMP das Fork-Join-Modell zur Parallelisierung, wie in Abbildung 11 dargestellt. Das bedeutet, dass zunächst nur ein einzelner Thread aktiv ist. Erst, wenn ein parallelisierbarer Programmabschnitt erreicht wird, erzeugt OpenMP neue Threads und beendet diese, sobald der Abschnitt wieder verlassen wird. Der notwendige Programmcode für die Erzeugung Synchronisierung der OpenMP-Threads wird durch den Compiler erzeugt. Wie dies konkret vonstatten geht und ob Threads oder Prozesse zum Einsatz kommen, hängt von dessen Implementierung ab und ist aus Sicht des Programmierers irrelevant. Vom Programmierer ist lediglich eine Kennzeichnung und Spezifikation der zu parallelisierenden Programmabschnitte notwendig. Hierfür stellt OpenMP eine Anzahl von Compilerdirektiven, Routinen und Variablen für die Sprachen C/C++ und Fortran bereit. 9.3 Speichermodell OpenMP implementiert ein Modell mit verteiltem Speicher, wobei dieser sowohl gemeinsam (shared) als auch einzeln (private) genutzt werden kann. Der private Speicher eines Threads liegt ausschließlich in seinem eigenen Adressraum und ist nur für ihn selbst sichtbar. Standardmäßig 57 Vgl. hierzu: [CHAPMAN 2008],[HOFFMANN 2008],[CHANDRA],[RAUBER 2008] S.127ff., [RAUBER 2007] S. 207ff., 354ff. 58 Mit Einschränkungen bei der Verwendung von OpenMP Bibliotheksfunktionen, die dann natürlich nicht Verfügbar sind, was beim Linken zu einem Fehler führt. Durch die Verwendung eines #ifdef _OPENMP-Blocks kann dies verhindert werden

43 Abbildung 11: OpenMP Fork-Join-Modell Quelle: [CHAPMAN 2008] S. 24 sind alle Variablen als privat deklariert. Gemeinsame Variablen müssen in der #pragma omp parallel Direktive angegeben werden. 9.4 Synchronisation Für die Synchronisation stellt OpenMP je nach Anforderung verschiedene Mechanismen bereit. Kritische Abschnitte Abschnitte innerhalb eines Parallelen Anweisungsblocks, die Anfällig für eine Race-Condition sind, können durch Markierung mit #pragma omp critical gekennzeichnet werden. OpenMP stellt dadurch sicher, dass der Programmabschnitt nur von einem Thread zur selben Zeit ausgeführt wird. Betrifft dies nur eine kleine Anweisung, beispielsweise eine Operation auf eine gemeinsame Variable wie a=a+b, kann diese als Atomare Operation durch #pragma omp atomic gekennzeichnet werden, die für OpenMP mit geringerem Verwaltungsaufwand zur Synchronisation der beteiligten Prozesse verbunden ist. Durch die Atomare Anweisung wird sichergestellt, dass zwischen den einzelnen dafür notwendigen Prozessoranweisungen kein Prozesswechsel stattfindet. Locks Der konkurrierende Zugriff auf Ressourcen kann durch Locking-Mechanismen gesteuert werden. Im Gegensatz zur Verwendung von critical, das automatisch Locks erzeugt, ist es hier die Aufgabe des Programmierers, Locks zu erzeugen und wieder freizugeben. Dies ist notwendig, wenn auf die zu schützende Ressource nicht nur in einem einzelnen Programmabschnitt zugegriffen wird und somit nicht durch einen critical-block geschützt werden kann. OpenMP stellt keine Funktionen zur Behandlung von Deadlock-Situationen bereit. Barrieren Barrieren lassen sich einfach durch Einfügen von #pragma omp barrier hinter einem Parallelen Abschnitt realisieren. Geordnete Ausführung In OpenMP kann die Ausführungsreihenfolge paralleler Abschnitte durch den Programmierer gesteuert werden. Dies kann z.b. Notwendig sein, wenn Ausgaben realisiert werden müssen. Ein mit #pragma omp ordered gekennzeichneter Bereich innerhalb eines Parallelen Abschnitts wird exakt so ausgeführt, als würde er seriell durchlaufen werden

44 9.5 Globale Operatoren OpenMP unterstützt keine expliziten Kommunikationsanweisungen. Globale Operatoren können daher nur indirekt durch entsprechende Spezifikation der parallelen Abschnitte genutzt werden. Hierfür wird das reduction - Konstrukt bereitgestellt: reduction ( operator : Variable [,Variable]...) Wird beispielsweise eine Schleife, innerhalb der auf eine gemeinsame Variable schreibend zugegriffen wird, parallel ausgeführt, sind zeitaufwändige Synchronisierungsmaßnahmen erforderlich, um den Speicherinhalt für alle Threads konsistent zu halten. Dies muss jedoch nicht immer notwendig sein. Durch das reduction-konstrukt wird die Synchronisierung erst nach Beendigung aller Iterationen unter Verwendung des angegebenen Operators durchgeführt, zum Beispiel für die Summenfunktion: int sum(int * v, int size){ result=0; #pragma omp parallel for reduction (+:result) for(i=0, i<size, i++){ result+=v[i]; } return result; }

45 10 Andere 10.1 BOINC BOINC - Berkeley Open Infrastructure for Network Computing 59 ist eine an der Universität Berkeley, Californien entwickelte Umgebung für das Grid-Computing. BOINC funktioniert nach dem Client-Server-Prinzip. Ein BOINC-Client wird auf einer Anzahl von Rechnern installiert und meldet sich bei einem Server an, von dem er Rechenaufgaben zugeteilt bekommt und die Resultate zurücksendet. Die BOINC-API ist sehr umfangreich und speziell für das Verteilte Rechnen mit sehr hoher Anzahl an Clients in heterogener Rechnerumgebung entwickelt. Basierend auf BOINC wurde weltweit Rechenleistung für verschiedene wissenschaftliche Projekte wie z.b. Seti@Home gebündelt BLAS BLAS ist eine Abkürzung für Basic Linear Algebra Subroutines und bezeichnet Bibliotheken, die lineare algebraischen Funktionen bereitstellen. Es existiert kein formaler Standard, dennoch hat sich ein konkreter Satz an Funktionen als de-facto Standard etabliert, der mit dem Begriff BLAS bezeichnet wird. Je nach Umfang werden diese in Levels 1-3 eingeordnet, wobei Level 1 Vektor-Operationen, Level 2 Vektor-Matrix-Operationen und Level 3 Matrix-Operationen unterstützt. BLAS ist keine Parallele Programmierbibliothek, jedoch existieren auch Implementierungen, die PVM, MPICH oder LAM nutzen. Eine Parallelisierung mittels BLAS gestaltet sich so, dass das zu lösende Problem in eine Reihe von Matrizenoperationen überführt wird, die dann durch BLAS-Funktionen ausgeführt werden. Für BLAS gibt es eine Reihe verschiedener, zum Teil hoch optimierter Implementierungen, die häufig von Hardware-Herstellern stammen und speziell an deren Produkte angepasst sind. Weiterhin sind z.b. auch parallel arbeitende Versionen für verschiedene MPI-Implementierungen verfügbar. Unix-Distributionen enthalten in der Regel mehrere BLAS-Implementierungen. Einige davon sind Beispielsweise refblas3, scalapack und lapack PThreads PThreads ist eine Interface-Spezifikation zur Programmierung von Threads entsprechend dem POSIX.1-Standard für Unix-Basierte Systeme. Aktuelle Implementierungen sind LinuxThreads 60 und die Native POSIX Threads Library (NPTL) Parallel Virtual Machine PVM bildet einen virtuellen Parallelrechner mit nicht zwingend homogener Rechnerstruktur und lokal zugeordnetem Speicher ab. Die Kommunikation der beteiligten Knoten erfolgt durch 59 Homepage: 60 Wird ab glibc 2.4 nicht mehr unterstützt, stattdessen wird seit glibc NPTL verwendet

46 Message-Passing. PVM kann als Vorgänger von MPI betrachtet werden. PVM wird durch einen Dienst (pvmd) realisiert, der auf den beteiligten Rechnern gestartet wird und als Schnittstelle zu allen Rechnern fungiert. Die Parallelisierung erfolgt durch einen Elternprozess, der den Dienst dazu veranlasst, weitere Instanzen des Programms auf den anderen Rechnern zu starten und die Kommunikation zwischen den Instanzen zu steuern. PVM- Programme müssen daher auf allen Rechnern in ausführbarer Form vorliegen und der Nutzer muß Zugriffsrechte auf alle Rechner haben, da sowohl der Dienst als auch die Programme unter seiner Nutzerkennung laufen

47 11 Vergleichende Betrachtung Um den Programmieraufwand sowie die Rechengeschwindigkeit der vorgestellten Bibliotheken im Ansatz vergleichen zu können, wurde ein Algorithmus zur parallelen Matrizenmultiplikation in serieller Form implementiert und anschließend für die Verwendung mit den parallelen Bibliotheken angepasst Implementierung Im Folgenden wird die serielle Version des Algorithmus vorgestellt und auf die speziellen Merkmale der Versionen für jede der untersuchten parallelen Ansätze eingegangen. Der vollständige Quellcode ist, sofern nicht aufgeführt, auf der beiliegenden CD zu finden. Da es um den Vergleich der Techniken geht, wurde auf Optimierungen seitens des Compilers verzichtet Matrizenmultiplikation Seriell Die Serielle Version ist im Algorithmus 1 dargestellt. Das Programm besteht aus zwei Teilen, einer Funktion zur Matrizenmultiplikation und dem Hauptprogramm, dass diese aufruft und die Zeitmessung durchführt. Die Compilierung erfolgt mittels: $gcc -std=c99 standard.c -o standard Matrizenmultiplikation UPC Für UPC sind nur wenige Änderungen erforderlich. Vor allem muss in der Funktion mult_matrix() die Hauptschleife durch das UPC-Pendant ersetzt werden. [...] upc_forall(int ay=0;ay<y1;ay++;ay){ [...] Weiterhin ist die Ergebnismatrix R als shared zu deklarieren. Hierbei wird eine Blockgröße entsprechend der Zeilengröße gewählt, so dass die Matrix zeilenweise auf die Threads verteilt wird: shared double * R=upc_all_alloc(dim,dim*sizeof(double)); Bei der Zeitmessung und der Ausgabe ist zu beachten, dass diese nur von einem einzigen Prozess durchgeführt wird, da es sonst zu mehrfachen Ausgaben kommt. Für die Compilierung muss ein UPC-Compiler eingesetzt werden, in diesem Fall der GCC-UPC Die Compilierung erfolgt mittels: $upc-gcc -std=c99 -lupc -static upc.upc -o upc

48 Algorithm 1 Matrizenmultiplikation Seriell 1 # i n c l u d e < s t d l i b. h> 2 # i n c l u d e < s t d i o. h> 3 # i n c l u d e <math. h> 4 # i n c l u d e < s t r i n g. h> 5 # i n c l u d e < s y s / t ime. h> 6 # i n c l u d e < time. h> 7 8 i n t m a t r i x _ m u l t ( i n t x1, i n t y1, double A, i n t x2, i n t y2, double B, double R) { 9 i f (A!=NULL && B!=NULL && R!=NULL) { 10 i n t o f s _ a =0, o f s _ b =0, o f s _ r =0; 11 f o r ( i n t ay =0; ay <y1 ; ay ++) { 12 f o r ( i n t bx =0; bx<x2 ; bx ++) { 13 o f s _ r = ay x2 +bx ; R[ o f s _ r ] = 0. 0 ; 14 f o r ( i n t ax =0; ax <x1 ; ax ++) { 15 o f s _ a = ay x1 +ax ; o f s _ b = ax x2 +bx ; 16 R[ o f s _ r ]+=A[ o f s _ a ] B[ o f s _ b ] ; 17 } 18 } 19 } 20 } 21 return 1 ; 22 } i n t main ( i n t argc, char a rgv [ ] ) { 25 i f ( argc <1) return 1; / / m a t r i x e r z e u g e n und i n i t i a l i s i e r e n 28 i n t dim= a t o i ( argv [ 1 ] ) ; 29 double A=( double ) m a l l o c ( dim dim s i z e o f ( double ) ) ; 30 double B=( double ) m a l l o c ( dim dim s i z e o f ( double ) ) ; 31 double R=( double ) m a l l o c ( dim dim s i z e o f ( double ) ) ; 32 f o r ( i n t i =0; i <dim dim ; i ++) { 33 A[ i ] = 1 ; B[ i ] = 1 ; R[ i ] = 0 ; 34 } 35 s t r u c t t i m e v a l time1, time2 ; 36 i n t ms1, ms2 ; / / z e i t m e s s u n g und berechnung 39 g e t t i m e o f d a y (& time1,null) ; 40 m a t r i x _ m u l t ( dim, dim, A, dim, dim, B, R) ; 41 g e t t i m e o f d a y (& time2,null) ; ms1= time1. t v _ s e c time1. t v _ u s e c ; 44 ms2= time2. t v _ s e c time2. t v _ u s e c ; 45 i n t d e l t a =ms2 ms1 ; 46 double d e l t a _ s e c =( double ) d e l t a / ; 47 p r i n t f ( "%i %f \ n ", dim, d e l t a _ s e c ) ; 48 return 0 ; 49 }

49 Matrizenmultiplikation MPI Für MPI gibt es prinzipiell zwei Möglichkeiten der Implementierung, die jede ihre Vor- und Nachteile hat: Implementation mit Globalen Operationen oder ein Master-Worker-Modell. Die Verwendung globaler Operationen zur Verteilung der Daten erfordert weniger Aufwand als das Master-Worker-Modell, ist jedoch weniger flexibel in der optimalen Ausnutzung der Rechenkapazität. Im Gegensatz zu UPC oder OpenMP kann sich bei MPI die Parallelisierung nicht nur auf die Anpassung der Funktion matrix_mult beschränken. So muss beispielsweise beim Programmstart eine Initialisierung von MPI erfolgen. Daher wurde der Ansatz gewählt, die originale Funktion matrix_mult zu verwenden, deren Aufruf jedoch mit einem MPI-Konstrukt zu umgeben, so dass jeder Prozess nur Teile der Matrizen berechnen muss. MPI verteilt Daten stets in zusammenhängenden Blöcken. Für die Verteilung der Matrix A bedeutet dies, dass jeder Prozess mehrere aufeinanderfolgende Zeilen erhält. Da die Gesamtzahl der Zeilen nicht notwendigerweise ein Vielfaches der Prozessanzahl darstellt, ist eine ungleiche Verteilung notwendig. Die Anzahl und Größe der Pakete, die jeder Prozess empfängt, muss allen Teilnehmern beim Aufruf der Funktionen bekannt sein, d.h. der Empfänger muss wissen, wieviel Daten er bekommt, da er einen entsprechend dimensionierten Empfangspuffer bereitstellen muss. Globale Operationen Bei der Verwendung globaler Operationen erfolgt das Scheduling der Daten statisch. Dazu berechnet der Root-Prozess anhand der Prozessanzahl und der Datenmenge, wie die Aufteilung erfolgt. Der Algorithmus 2 stellt einen Auszug aus dem entsprechenden Testprogramm dar. Master-Worker-Modell Die Implementierung des Master-Worker-Modells erfolgt in der Form, dass Worker-Prozesse Nachrichten an den Master-Prozess schicken, um diesen zu veranlassen, entweder einen neuen Datenblock zu senden oder ein Ergebnis entgegenzunehmen. Das Master-Programm wird beendet, sobald alle Datenblöcke versendet und alle Ergebnisse empfangen wurden. Da der Algorithmus deutlich umfangreicher ist als bei Verwendung globaler Operatoren wird auf eine Darstellung verzichtet Matrizenmultiplikation OpenMP Der Aufwand für OpenMP ist ähnlich dessen für UPC. In der Funktion mult_matrix() werden Pragmas gesetzt, um dem Compiler mitzuteilen, dass die Indexvariablen ofs_a, ofs_b und ofs_r privat und die Matrizen A,B und R verteilt sind. Weiterhin wird eine statische Aufteilung der for-schleife auf die einzelnen Threads festgelegt, wodurch jeder Thread die selbe Anzahl von Schleifen durchläuft. #pragma omp parallel for schedule(static) \ private(ofs_a,ofs_b,ofs_r) shared (A,B,R) for(int ay=0;ay<y1;ay++){... }

50 Algorithm 2 Matrizenmultiplikation MPI Global 1 # i n c l u d e <mpi. h> 2 3 / / i n t main ( i n t argc, char a rgv [ ] ) { 6 7 / /... 8 i n t rank, nproc ; 9 M P I _ I n i t (& argc,& argv ) ; 10 MPI_Comm_rank (MPI_COMM_WORLD,& rank ) ; 11 MPI_Comm_size (MPI_COMM_WORLD,& nproc ) ; i n t s s i z e s [ nproc ], s o f s [ nproc ] ; 14 i f ( r ank ==0) { 15 f o r ( i n t i =0; i < nproc ; i ++) { 16 i n t rows=dim / nproc ; i f ( rows ==0) rows =1; 17 s s i z e s [ i ]= dim rows ; s o f s [ i ]= dim rows i ; 18 i f ( i == nproc 1){ s s i z e s [ i ]+=( dim%rows ) dim ; } 19 } 20 } MPI_Bcast(&dim, 1, MPI_INT, 0,MPI_COMM_WORLD) ; 23 MPI_Bcast ( B, dim dim, MPI_DOUBLE, 0,MPI_COMM_WORLD) ; 24 MPI_Bcast ( s s i z e s, nproc, MPI_INT, 0,MPI_COMM_WORLD) ; 25 M P I _ S c a t t e r v (A, s s i z e s, s o f s, MPI_DOUBLE, A, s s i z e s [ r ank ], MPI_DOUBLE, 0,MPI_COMM_WORLD) ; m a t r i x _ m u l t ( dim, s s i z e s [ rank ] / dim, A, dim, dim, B, R) ; MPI_Gatherv (A, s s i z e s [ rank ], MPI_DOUBLE, A, s s i z e s, s o f s, MPI_DOUBLE, 0,MPI_COMM_WORLD return 0 ; 32 } Das Hauptprogramm wird lediglich zu Beginn um Anweisungen zur Festlegung der Anzahl zu verwendender Prozesse ergänzt: int procs=atoi(argv[1]); omp_set_dynamic(0); omp_set_num_threads(procs); Die Compilierung erfolgt mittels des GCC-4.2: $gcc-4.2 -fopenmp -std=c99 openmp.c -o openmp 11.2 Performance Um den Einfluss des Betriebssystems beim Programmstart sowie eventuelle Initialisierungsphasen der Bibliotheken zu minimieren, wurde nur die Berechnungszeit für die eigentliche Multiplikation ermittelt. Die Berechnungszeit wurde in Abhängigkeit von Matrizengröße und Prozessanzahl gemessen. Jede Messung wurde drei mal Durchgeführt und das beste Resultat ausgewertet. Die Tests wurden auf einem Parallelrechner mit 8 Dual Core AMD Opteron(tm) Prozessoren mit 1 GHz Taktfrequenz und 32GB RAM durchgeführt. Als Betriebssystem diente Ubuntu 2.6. Außer für UPC wurde als Compiler der GCC verwendet. Alle Messergebnisse sind in Tabellenform im Anhang B.2 aufgeführt

51 Zunächst ist für UPC ein überraschendes Resultat festzustellen. Mit nur einem Prozessor ist die UPC-Version um etwa eine Potenz langsamer als die Serielle Variante. Dies deutet auf einen enormen Overhead hin, der durch UPC zur Speicherverwaltung erzeugt wird. Parität mit der Seriellen Version wird erst bei Verwendung von 8 Prozessoren erreicht. Abbildung 12: Performance UPC Quelle: Eigene Darstellung. Bei OpenMP ist festzustellen, dass das parallelisierte Programm auf nur einem Prozessor deutlich langsamer ausgeführt wird, als die serielle Variante. Dies stellt insofern keinen Nachteil dar, als das ein OpenMP-Programm auch ohne OpenMP-Unterstützung compiliert werden kann und dann rein seriell ausgeführt wird. Auf diese Weise können ohne programmiertechnischen Mehraufwand eine parallele und eine serielle Version des selben Programms erstellt werden. Mit steigender Prozessorzahl ist eine entsprechend gute Skalierung zu erkennen. Der Vergleich einer Master-Worker-Implementierung und einer Implementierung unter Verwendung globaler Operatoren unter MPI zeigt, dass bei wenigen Prozessoren die globalen Operatoren effizienter arbeiten und teilweise um den Faktor 2 schneller sind. Mit steigender Prozessorzahl ist jedoch das Worker-Slave-Modell leicht überlegen, da hier Differenzen in der Auslastung einzelner Prozessoren weniger starke Auswirkungen zeigen. Während bei globalen Operatoren die zu Verarbeitende Datenmenge pro Prozess fest vorgegeben ist und daher die Dauer der Gesamtoperation von dem langsamsten Prozess abhängt, erfolgt beim Master-Worker-Konzept eine lastabhängige Verteilung der Datenpakete. Ein Vergleich zwischen OpenMP und MPI zeigt, dass MPI schneller arbeitet. Hierbei wurde jedoch nur die jeweils einfachste Implementierung gewählt, so dass sich noch keine allgemeingültige Aussage über die Geschwindigkeiten der Implementierungen machen lassen. Sowohl OpenMP als auch MPI erlauben weitere Einstellungen, um die Parallelisierung effizienter zu gestalten. Abbildung 17 zeigt das Verhältnis der Rechenzeiten vom OpenMP und MPI. Für sehr kleine Problemgrößen und hoher Prozessoranzahl arbeitet MPI deutlich langsamer als OpenMP. Dieses Verhältnis kehrt sich bei steigender Problemgröße schnell um

52 Abbildung 13: Performance OpenMP Quelle: Eigene Darstellung. Abbildung 14: Performance MPI 11.3 Bewertung UPC (a) Master-Worker (b) Globale Operatoren Quelle: Eigene Darstellung. Der verwendete Compiler upc-gcc erzeugt Programme, die von Anfang an parallel laufen. Es ist nicht möglich, die parallele Ausführung gezielt auf bestimmte Programmabschnitte, z.b. einzelne Funktionen, zu beschränken. Daher ist das zu parallelisierende Programm sehr stark an die Anforderungen von UPC anzupassen. Die Parallelisierung eines existierenden Programms ist nur mit erheblichem Aufwand möglich. Nur sehr wenige Compiler (z.b. der Berkeley UPC) unterstützen die Verwendung von UPC-Code durch C++. Die Unterstützung der UPC-Spezifikation durch einzelne Compiler ist sehr unterschiedlich. So wurde beim Testen des UPC-GCC mittels einfacher Beispielprogramme aus der UPC- 1.2 Dokumentation festgestellt, dass dieser anscheinend nicht Spezifikationsgerecht funktioniert, da sich diese nicht übersetzen lassen. So ist die schon Definition eines simplen statischen

53 Abbildung 15: Performance MPI vs. MPI Global Quelle: Eigene Darstellung. verteilten Arrays analog zu den Beispielen aus der Dokumentation durch beispielsweise shared [2] int[10] nicht möglich und führt zu einem Syntaxfehler. Mit shared [2] int[] lässt sich sogar ein Speicherzugriffsfehler während der Übersetzung provozieren. Die dynamische Erzeugung von verteiltem Speicher mittels upc_alloc-varianten hingegen scheint zu funktionieren, wenn auch nicht Spezifikationsgerecht. So ist eine Festlegung der Blockgröße nicht möglich gewesen, so dass Speicherbereiche stets Byteweise über alle Threads verteilt wurden, was deutlich zu Lasten der Geschwindigkeit geht. Aufgrund der genannten Probleme wurde nach dem Release die neueste Version UPC getestet, die jedoch das selbe Resultat lieferte. UPC ist ein Projekt, dass sich noch in der Entwicklung befindet. Das Programmierkonzept ist mit Ausnahme der Beschränkung auf reines C vom Funktionsumfang mit anderen Ansätzen zu vergleichen, lediglich die Umsetzung durch die getesteten Compiler scheint weder ausgereift zu sein, noch entspricht sie der in der Spezifikation dargelegten Funktionsweise. Daher wird UPC als nicht für den Produktiven Einsatz geeignet eingestuft MPI Ein MPI-Programm ist schwieriger zu implementieren als Beispielsweise mit OpenMP. Dafür bietet MPI mehr Freiheiten bezüglich der Strukturierung des Programms. Bei Verwendung globaler Operatoren ist der Aufwand vergleichbar mit dem für OpenMP. Eine flexible Aufgabenverteilung nach dem Master-Worker-Prinzip ist deutlich komplizierter zu implementieren, bietet dafür aber eine höhere Geschwindigkeit. In beiden Fällen ist MPI spürbar schneller als OpenMP. Ein weiterer Vorteil von MPI ist, dass sich komplexe rechnerübergreifende Kommunikationshierarchien implementieren lassen, wodurch es sich besonders für hochgradig parallele Anwendungen eignet

54 Abbildung 16: Performance OpenMP vs. MPI Global Quelle: Eigene Darstellung. Abbildung 17: Performance OpenMP vs. MPI Global Quelle: Eigene Darstellung

55 OpenMP Eine Parallelisierung sowohl vorhandenen Codes als auch als Neuentwicklung stellt sich mit OpenMP außerordentlich einfach dar. Das Konzept der Schrittweisen Parallelisierung lässt sich gut umsetzen und es werden schnell erste Resultate erzielt. Dennoch muss der korrekten Spezifikation der parallelen Abschnitte und insbesondere der Unterscheidung zwischen privaten und nicht-privaten Variablen viel Aufmerksamkeit gewidmet werden. Im Gegensatz zu MPI kann ein OpenMP-Programm nur auf einem einzigen Rechner ausgeführt werden. Die maximale sinnvolle Parallelisierbarkeit ist dadurch entsprechend der Anzahl vorhandener Prozessoren eingeschränkt. Der Geschwindigkeitsgewinn durch Parallelisierung ist deutlich messbar, wenn auch nicht so groß wie bei MPI

56 Teil III Parallelisierung im Data Mining Da sich diese Arbeit mit der Anwendung des verteilten Rechnens speziell im Data Mining befasst, gibt dieser Teil eine Einführung in das Data-Mining und die in dieser Arbeit verwendeten Verfahren. Es werden mögliche Umsetzungen für ein verteiltes Rechen im Data-Mining und exemplarisch die konkrete Implementierung zweier Ansätzes vorgestellt. Dabei wird gezeigt, dass eine Parallelisierung nicht in jedem Fall eine große Hürde darstellt, die komplizierte Programme erfordert, sondern dass Bereits mit einfachen Mitteln ein signifikanter Geschwindigkeitszuwachs erzielt werden kann. This chapter deals with the parallization of Data Mining algorithms. It provides a brief introduction into Data Mining and the methods to be parallelized. This chapter also shows that parallization does not necessarily mean complicated algorithms, but that the performance of Data Mining algorithms can be significantly improved using standard tools

57 12 Data Mining Grundlagen Data Mining ist Bestandteil einer Disziplin, die als Wissensextraktion aus Datenbanken - Knowledge Discovery in Databases (KDD) - bekannt ist. Es befasst sich mit der Gewinnung von neuem Wissen aus vorhandenen Daten. Dabei werden die Informationen, die in den Daten implizit enthalten sind, durch verschiedene Data-Mining-Verfahren extrahiert und in geeigneter Form dargestellt. Das auf diese Weise explizierte Wissen kann beispielsweise durch Modelle, Regeln oder Diagramme ausgedrückt und somit nutzbar gemacht werden Ablaufmodell Als Data Mining bezeichnet man sowohl die Anwendung der Methoden als auch das Forschungsgebiet selbst. Da es ein relativ neues und stark experimentelles Forschungsgebiet ist, sind sowohl die Methoden als auch deren Anwendung Forschungsgegenstand. Besonders letzteres ist für den erfolgreichen Einsatz des Data Mining von Bedeutung, da hier stets auf die konkrete Zielstellung und die verfügbaren Daten eingegangen werden muss. Daher existiert kein für alle Fälle geeignetes Verfahren. Es lässt sich lediglich ein allgemeines Vorgehensmodell ableiten, das den Data-Mining-Vorgang als iteratives Phasenmodell beschreibt. Jedoch berücksichtigt dies weder konkrete Methoden noch lassen sich die einzelnen Phasen exakt gegeneinander abgrenzen, da sie sich in der Praxis teilweise überschneiden und stark aufeinander aufbauen. Es lassen sich folgende Phasen definieren: Datenvorverarbeitung (Aufbereitung, Kodierung) Analyse Datennachbearbeitung (Auswertung, Visualisierung) Interpretation Vor der eigentlichen Analyse der Daten ist eine Datenvorverarbeitung notwendig. Neben der inhaltlichen Bereinigung (Eliminieren von Fehlern, fehlenden Werten oder Ausreißern; Auswählen von Untermengen, Test- und Trainingsdaten) müssen die Daten in eine Form gebracht werden, die durch die gewählte Data-Mining-Methode verarbeitet werden kann, zum Beispiel durch Normalisierung, Skalierung, Intervallbildung oder Transformation. Die Datenerhebung als Teil der Datenvorverarbeitung hat dafür Sorge zu tragen, dass die einen Sachverhalt beschreibenden Informationen auch in der Datenmenge enthalten sind und andererseits irrelevante, aber signifikante Informationen die Datenmenge nicht verfälschen. Ebenso können ungenaue, fehlende oder falsche Werte das Ergebnis beeinträchtigen oder unbrauchbar machen. Die Datenvorverarbeitung hat entscheidenden Einfluss auf das Ergebnis der eingesetzten Methoden, da durch die Wahl ungeeigneter Vorverarbeitungsverfahren die Daten verfälscht werden können. Es ist notwendig, bei der Kodierung die Daten korrekt und reproduzierbar abzubilden und dabei deren implizite Eigenschaften und Beziehungen zu berücksichtigen. Die Datenanalyse bezieht sich auf die eigentliche Anwendung der Data-Mining-Methoden. Je nach Zielstellung finden Methoden aus den Bereichen Klassifikation, Clustering, Prognose oder Assoziation Anwendung. Um die für die zu analysierenden Daten optimale Methode aus dem 61 Dieses Kapitel wurde in ähnlicher Form vom Autor in [WISSUWA 2003] und [CLEVE 2005] aufgeführt

58 jeweiligen Bereich zu ermitteln, sind umfangreiche Experimente mit verschiedenen Methoden und Parametern notwendig. Die Validierung dient der Überprüfung des Data-Mining-Ergebnis auf tatsächliche Korrektheit. Dies geschieht meist durch Anwenden des erstellten Modells auf ausgewählte Testdaten. Datenvorverarbeitung (inkl. Datenerhebung) sowie die Validierung sind dem Data-Mining-Prozess vor- bzw. nachgelagert. Beide sind stark anwendungsbezogen und daher nur bedingt dem Data Mining selbst zuzuordnen. Jedoch haben sie großen Einfluss auf den Erfolg des Data Mining. Ein ähnliches Modell wurde durch das CRISP-DM Konsortium erstellt, das mit dem Ziel entwickelt wurde, ein generelles Vorgehensmodell für den praktischen Einsatz von Data Mining in Unternehmen zu bieten. Abbildung 18: CRISP-DM Phasenmodell Quelle: Klassifikation der Verfahren In der Literatur ist eine Vielzahl von Data-Mining-Algorithmen beschrieben, von denen viele in der Praxis mit Erfolg eingesetzt werden. 62 Die Anwendungsmöglichkeiten des Data Mining sind außerordentlich vielfältig. Es lassen sich drei grundlegende Formen der Anwendung unterscheiden: 1. Klassifikation, 2. Assoziation, 3. Clustering, 4. Vorhersage. Bei der Klassifikation werden überwachte Lernverfahren eingesetzt. Es wird anhand der Attribute von bereits klassifizierten Objekten ein Klassifikator erzeugt, der in der Lage ist, unbekannte Objekte ebenfalls korrekt zu klassifizieren. Als Klassifikatoren können zum Beispiel 62 Vgl.: [WITTEN 2001],[WITTEN 2005],[LÄMMEL 2004],[LÄMMEL 2003],[ALPAR 2000],[NAKHAEIZADEH 1998]

59 Entscheidungsbäume, k-nearest-neighbour oder Neuronale Netze zum Einsatz kommen. Typische Anwendungen sind z. B. Klassifikation von Kunden oder die Schrifterkennung. Die Assoziation unterscheidet sich von der Klassifikation dadurch, dass nicht nur die Klasse, sondern die Ausprägungen beliebiger Attribute und Attributkombinationen eines Objektes prognostiziert werden können. Als Methoden kommen hier der a-priori-algorithmus oder wiederum Neuronale Netze in Betracht. Beispielanwendungen findet man in der Warenkorbanalyse oder beim Wiederherstellen eines verrauschten oder fehlerhaften Pixelmusters anhand eines vorher trainierten Beispiels. Das Clustering, ein unüberwachtes Verfahren, wird zur Bildung von Gruppen (Cluster) einander ähnlicher Objekte aus einer Grundmenge eingesetzt. Dabei kommen verschiedene multivariate Verfahren zum Einsatz. Es kann verwendet werden, um die Attribute herauszufinden, die wesentliche Merkmale einer Gruppe darstellen oder durch die sie sich von anderen Gruppen unterscheiden. Bekannte Clustering-Verfahren sind das K-Means-Verfahren und die von Teuvo Kohonen entwickelten Selbstorganisierenden Karten. Die mathematisch motivierten Support Vector Machines stellen ebenfalls einen erfolgversprechenden Clustering-Ansatz dar. Die Vorhersage ähnelt der Klassifikation. Sie dient der Bestimmung von Zielgrößen anhand gegebener Attributausprägungen. Im Gegensatz zur Klassifikation liefert die Vorhersage jedoch quantitative Werte

60 12.3 Künstliche Neuronale Netze Als Ansatz zur Parallelisierung im Data Mining sollen zwei Vertreter der Künstlichen Neuronalen Netze dienen: Feed-Forward-Netze und Selbstorganisierende Karten. Dieses Kapitel gibt eine grobe Einführung in die zugrundeliegenden Konzepte beider Verfahren. Für eine Detaillierte Darstellung sei auf die Literatur verwiesen. 63 Künstliche neuronale Netze sind eine stark idealisierte Nachbildung der Funktionsweise von biologischen Neuronalen Netzen, wie beispielsweise Gehirne oder Nervensysteme. Die Verarbeitung von Informationen erfolgt nicht durch komplexe Algorithmen, sondern vielmehr durch sehr einfache Einheiten, die allerdings in großer Zahl vorhanden sind und untereinander Informationen austauschen. Analog zu ihren biologischen Vorbildern bestehen künstliche neuronale Netze aus Neuronen und einem Verbindungsnetzwerk. Die Informationsverarbeitung erfolgt mit Hilfe der Propagierungsfunktion, die für jedes Neuron den Aktivierungszustand anhand der von anderen Neuronen eingehenden Signale und der Verbindungsgewichte errechnet. Ein daraus abgeleitetes Ausgabesignal wird dann an andere Neuronen über das Verbindungsnetzwerk weitergeleitet. Ein künstliches neuronales Netz kann als gerichteter Graph mit gewichteten Kanten angesehen werden, durch den definiert wird, welche Neuronen miteinander kommunizieren. Die Gewichte dienen der Hemmung oder Verstärkung von Signalen. Zusammen mit dem Schwellwert (Bias) der Neuronen, der bestimmt, ab welchem Aktivierungsgrad ein Neuron aktiv wird und Signale aussendet, sind es die Gewichte, in denen das Wissen des Netzes gespeichert wird. Durch diese verteilte Repräsentation des Wissen sind neuronale Netze relativ unempfindlich gegenüber unvollständigen und verrauschten Eingabemustern. Die Anordnung der Neuronen erfolgt typischerweise in Schichten von Neuronen gleichen Typs. Die zu verarbeitenden Daten werden über Neuronen der Eingabeschicht an das Netz transferiert, indem diesen eine initiale Aktivierung entsprechend dem jeweiligen Trainingsmuster zugewiesen wird. Diese Aktivierungen werden entsprechend der Propagierungsfunktion durch das Netz verarbeitet. Nach vollständiger Propagierung kann die sogenannte Netzantwort als Aktivierungswerte der Neuronen der Ausgabeschicht abgelesen und interpretiert werden. Zwischen Eingabe- und Ausgabeschicht können sich weitere Schichten befinden, die als Versteckte Schichten bezeichnet werden. Der Einsatz Neuronaler Netze sind immer dann sinnvoll, wenn sich andere Lösungsansätze wie zum Beispiel algorithmische Lösungen oder eine regelbasierte Wissensdarstelllung als nicht geeignet herausgestellt haben. Natürlich funktionieren Künstliche Neuronale Netze ebenfalls nach einem Algorithmus, doch dient dieser nicht der Lösung eines Problems, sondern der Anpassung des Netzes an das Problem Feed-Forward-Netze Feed-Forward-Netze gehören zu den Klassifikatoren. Sie sind sind dadurch gekennzeichnet, dass die Propagierung nur in eine Richtung von der Eingabeschicht hin zur Ausgabeschicht erfolgt. Es existiert keine Rückkopplung, das Netz ist ein zyklenfreier Graph Siehe dazu: [ZELL 2000],[LÄMMEL 2004] 64 Vgl.: [ZELL 2000] S

61 Bei Feed-Forward-Netzen werden überwachte Lernverfahren eingesetzt. Dabei wird dem Netz ein Eingabemuster präsentiert, das nach der Propagierung ein Ausgabemuster erzeugt. Durch den Vergleich der Ausgabe mit der gewünschten Ausgabe (teaching input) kann für jedes Ausgabeneuron ein Fehlerwert entsprechend der Abweichung zur gewünschten Ausgabe errechnet werden. Basierend auf diesem Fehlersignal, den Verbindungsgewichten und der Aktivierung der Neuronen kann berechnet werden, wie die Verbindungsgewichte im Netz verändert werden müssen, damit der Fehler minimiert wird. Dieser Vorgang wird iterativ für alle Trainingsmuster durchlaufen bis der Fehler hinreichend klein ist. Ein trainiertes Feed-Forward-Netz ist in der Lage, neue Eingabemuster entsprechend ihrer Ähnlichkeit zu gelernten Mustern zu klassifizieren Selbstorganisierende Karten Unüberwachte Lernverfahren finden überall dort Anwendung, wo Datenmengen nach unbekannten Regeln zu klassifizieren sind, was beim Data Mining meist der Fall ist. Ein gutes Beispiel für die Anwendung unüberwachten Lernens sind die von Teuvo Kohonen entwickelten Selbstorganisierenden Karten, auch Feature Maps genannt. 65 Eine SOM ist ein Neuronales Netz dessen Neuronen typischerweise als zweidimensionale Gitterstruktur angeordnet sind. Die Anzahl der Neuronen beeinflusst die Genauigkeit und die Fähigkeit zur Generalisierung der SOM. Jedes Neuron besitzt einen gewichteten Vektor W als Verbindung mit den Neuronen der Eingabeschicht, deren Anzahl n der Variablen im Eingaberaum entspricht: W i = [w i,1,..., w i,n ] Das Trainieren der SOM beginnt mit der Initialisierung der Gewichtsvektoren durch Zufallszahlen im Intervall [-1,1]. Während des Trainings wird ein zufällig gewählter Eingabevektor I mit dem Gewichtsvektor W jedes Neurons der Kartenschicht verglichen. Das Neuron, dessen Gewichtsvektor der Eingabe am ähnlichsten ist, wird das Gewinnerneuron (BMU, Best Matching Unit). Als Abstandsmaß wird in der Regel die Euklidische Distanz verwendet. d(i, W ) = n (I i W i ) 2 i=0 Der Gewichtsvektor W des Gewinnerneurons wird anschließend so verändert, dass er dem Eingabevektor I ähnlicher wird. Das gleiche gilt für die Neuronen innerhalb eines Radius um das Gewinnerneuron. Der Grad der Beeinflussung wird durch den Lernfaktor η und die Distanzfunktion h (meist Gauss-Funktion) bestimmt, die normalerweise nach jedem Trainingsschritt reduziert werden: W j (t + 1) = W j (t) + η(t)h cj (t)[x(t) W j (t)] 65 Vgl.:[KOHONEN 2001], [ZELL 2000] S179ff

62 Eine SOM hat die Eigenschaft einer topologieerhaltende Transformation eines hochdimensionalen Eingaberaumes auf eine niedrigere Dimension. Ähnliche Eingabevektoren werden dabei auf benachbarte Neuronen projeziert. Da meist zweidimensionale SOMs zum Einsatz kommen, ist eine Visualisierung der Ergebnisse relativ einfach

63 13 Parallele Algorithmen Die augenscheinlichste Möglichkeit zur Parallelisierung im Data-Mining stellt der verwendete Algorithmus selbst dar. Abhängig davon, wie der Zugriff auf die Daten erfolgt, kann dies sogar sehr einfach geschehen, wie im Folgenden anhand künstlicher Neuronaler Netze skizziert wird Serielle Selbstorganisierende Karte Als Ausgangspunkt soll eine Kohonen-Karte dienen, die auf herkömmliche, serielle Weise implementiert ist. Ausgehend davon werden parallele Varianten implementiert, um verschiedene Ansätze miteinander vergleichen zu können. Das Netz wird in Form von Schichten von Neuronen abgebildet. Eine Schicht repräsentiert dabei eine Anzahl von Neuronen gleichen Typs. Schichten können miteinander vernetzt werden. Dies entspricht der vollständigen Vernetzung der Neuronen untereinander. Die Struktur einer Schicht kann wie folgt implementiert werden: typedef struct { char type; int size; int wsize; void * source; double * act; double * bias; double * error; double * weights; } t_layer; // Neuronen-Typ // Anzahl Neuronen // Anzahl Gewichte pro Neuron // Vorhergehende Schicht // Aktivierungs-Vektor // BiasVektor // Fehler-Vektor // Gewichts-Matrix Die Gewichtsmatrix W einer Schicht, wobei i die Anzahl der Quell-Neuronen und j die Anzahl der Ziel-Neuronen ist, stellt sich wie folgt dar: W ij = w 0;0 w 1;0... w i;0 w 0; w 0;j w ij Neuronen als Arrays ihrer Eigenschaftswerte zu speichern, anstelle eine eigene Neuronen- Struktur zu verwenden, hat den Vorteil, dass die Propagierungsfunktionen als Matrix-Operationen dargestellt werden können, die direkt auf den entsprechenden Schichten operieren. Das ist zum einen sehr schnell, zum anderen lassen sich Matrix-Operationen sehr leicht parallelisieren. Eine Propagierungsfunktion, die Aktivierungen einer Schicht mit den entsprechenden Gewichten auf die Aktivierung der nachfolgenden Schicht abbildet, hat somit die Form: A i+1 = A i W i Analog dazu lässt sich auch die Rückwärtspropagierung des Fehlersignals z.b. beim Backpropagation-Lernverfahren als Matrizenoperationen darstellen:

64 E i = E i+1 W i O i Algorithmus 3 zeigt eine Implementierung für das Trainingsverfahren einer Kohonen-Karte. Zur Bestimmung des Gewinnerneurons wurde nicht der Euklidische Abstand, sondern das maximale Skalarprodukt verwendet, weshalb Eingabe- und Gewichtsvektoren in normalisierter Form vorliegen müssen. Algorithm 3 SOM Seriell 1 do{ 2 for(int i=0;i<npatterns;i++){ 3 4 // propagation 5 for(int j=0;j<i->size;j++) { I->act[j]=pattern[i][j]; } 6 matrix_mult(o->wsize,o->size,o->weights, 1,I->size,I->act, O->act); 7 8 // find winner 9 id_max=0; 10 for(int j=0;j<noutput;j++){if(o->act[j] > O->act[id_max]) id_max=j;} maxx=id_max % sx; 13 maxy=id_max / sx; // adjust weights 16 for(int j=0;j<noutput;j++){ 17 dx=maxx - (j%sx); dy=maxy - (j/sx); rate=sqrt( (double)(dx*dx + dy*dy)); 20 rate=factor * exp (- ((rate*rate) / (radius*radius)) ); 21 len=0.0; 22 for(int k=0;k<ninput;k++){ 23 O->weights[j*nInput+k]+=rate*(I->act[k]-O->weights[j*nInput+k]); 24 len+=o->weights[j*ninput+k]*o->weights[j*ninput+k]; 25 } len=1.0/sqrt(len); 28 for(int k=0;k<ninput;k++){ 29 O->weights[j*nInput+k]*=len; 30 } 31 } 32 radius*=radius_factor; 33 } 34 }while(++cycle < cycles); 13.2 Parallele Selbstorganisierende Karte Die Berechnungszeit für einen Trainingszyklus einer selbstorganisierenden Karte hängt hauptsächlich von der Anzahl der Trainingsmuster sowie der Größe der Kartenschicht ab. Ein Trainingsschritt läuft dabei in 3 Stufen mit unterschiedlichem Rechenaufwand ab: 1. Propagierung des Eingabemusters: O(n 2 )

65 2. Bestimmung des Gewinnerneurons: O(n) 3. Anpassung der Gewichte: O(n 2 ) Die einzelnen Stufen sind nicht unabhängig voneinander, so dass eine Paralleliserung nicht durch Aufteilung der Trainingsmuster erfolgen kann. Stattdessen kann versucht werden, den Trainingsschritt zu parallelisieren. Die besten Kandidaten stellen die Stufen 1 und 3 dar. Im Folgenden wird die Parallelisierung unter Verwendung von OpenMP dargestellt. Der Bezug zum jeweils Abgebildeten Quelltext findet durch Angabe der Zeilennummer in Klammern statt. Ausgehend von Algorithmus 3 kann die Parallelisierung der einzelnen Stufen durch OpenMP mit wenig Aufwand durch das Hinzufügen von Compilerdirektiven erfolgen. Die parallelisierte Variante ist in Algorithmus 4 dargestellt. Da sich innerhalb der äußersten Schleife parallelisierbare (z.b. Schleifen) und nicht-parallelisierbare Abschnitte (z.b. Anpassung des Trainingsradius) abwechseln, ist es wenig sinnvoll, die Abschnitte einzeln zu parallelisieren, da so der zusätzliche Aufwand für die Erzeugung einzelner Prozesse den Geschwindigkeitsgewinn durch die parallele Berechnung schnell zunichte machen würde. Die Aufteilung in einzelne Prozesse sollte stets so weit außen wie möglich erfolgen (1). Die Initialisierung der Eingabeschicht muss für alle Prozesse zum selben Zeitpunkt stattfinden, da ansonsten die anschließende Propagierung unterschiedliche Resultate liefern würde. Dies wird durch den Prozess vorgenommen, der die Schleife zur Initialisierung als erstes Erreicht. Gleichzeitig wird implizit eine Barriere errichtet (7). Die Propagierung mittels Matrizenmultiplikation kann durch Verwendung des parallelen Multiplikationsalgorithmus wie in Abschnitt dargestellt erfolgen (10). Dieser muss jedoch leicht modifiziert werden, da zum Zeitpunkt des Funktionsaufrufs das Programm bereits parallel ausgeführt wird. Somit ist dort die Zeile durch #pragma omp parallel for schedule(static)... #pragma omp for schedule(static)... zu ersetzen. Nach der Bestimmung des Gewinnerneurons durch genau einen Prozess (12) erfolgt die Anpassung der Gewichte. Dies kann parallel für jedes Neuron der Kartenschicht erfolgen. Die jeweiligen Abstände zum Gewinnerneuron, der Lernradius sowie die Länge des Gewichtsvektors für die Normalisierung müssen als privat deklariert werden (18). Abschließend wird nach jeder Iteration über die Trainingsmuster der Lernradius angepasst, was wiederum nur einmal pro Iteration geschehen darf und daher nur von einem Prozess durchgeführt wird (24)

66 Algorithm 4 Parallele SOM mit OpenMP 1 #pragma omp parallel 2 { 3 do{ 4 for(int i=0;i<npatterns;i++) 5 { 6 // propagation 7 #pragma omp single 8 for(int j=0;j<i->size;j++){ I->act[j]=pattern[i][j]; } 9 10 matrix_mult(o->wsize,o->size,o->weights, 1,I->size,I->act, O->act); #pragma omp single 13 { 14 // find winner } #pragma omp for schedule(static) private(dx,dy,len,rate) 19 // adjust weights 20 for(int j=0;j<o->size;j++){ } 23 } 24 #pragma omp single 25 radius*=radius_factor; 26 } 27 } while(++cycle < cycles); 13.3 Performance Test In Abbildung 19 ist dargestellt, wie sich für verschiedene Problemgrößen die Steigerung der Parallelität auf die Rechenzeit auswirkt. Es ist sehr gut zu erkennen, dass eine zu starke, nicht an die Problemgröße angepasste Parallelisierung zu steigenden Rechenzeiten führt. Für größere Kohonen-Karten ist die Rechenzeit und der Speedup in Abhängigkeit von der Kartengröße in Abbildung 20 dargestellt. Es ist zu sehen, dass für p=12 der Speedup im Vergleich zu p=4 im Verhältnis nur gering ist

67 Abbildung 19: Rechenzeit SOM OpenMP für kleine Karten Quelle: Eigene Darstellung. Abbildung 20: SOM OpenMP Rechenzeiten und Speedup nach Kartengröße Quelle: Eigene Darstellung

68 14 Parallele Modelle Verschiedene Gründe können gegen den Einsatz eines parallelen Algorithmus sprechen. Dies ist beispielsweise der Fall, wenn keine passende parallele Implementierung existiert und auch keine Anpassung des Quellcodes möglich ist, weil dieser zu komplex, nicht verfügbar oder der Einsatz ein einmaliges Projekt ist, dass den Aufwand nicht rechtfertigt. Wenn es nicht möglich ist, den Algorithmus zur Erzeugung eines Modells parallel auszuführen, kann stattdessen versucht werden, das Modell selbst zu Parallelisieren. Man kann ein Modell als Klassifikator betrachtet, der eine nichtsymmetrische Abbildung des Merkmalsraumes R d auf Klassen realisiert: f : R d C, x f(x) := { y dist(x, y) δ, y C sonst Anstelle eines einzelnen Klassifikators können auch mehrere Klassifikatoren verwendet werden, die jeweils eine Abbildung auf Teilmengen vornehmen. Die letztendliche Abbildung wird durch einen zusammengesetzten Klassifikator vorgenommen, der die entgültige Abbildung durch die Kombinationsfunktion σ()bestimmt: f n : R d C n, x f n (x) := { y dist(x, y) δ, y C sonst f N : R d C, x f N (x) := σ(f 1 (x),..., f n (x)) Diese Vorgehensweise ist dann interessant, wenn dadurch die Komplexität der Berechnung jedes einzelnen Klassifikators gesenkt werden kann Hierarchische Kohonen-Karten Das Trainieren von Kohonen-Karten mit großer Eingabeschicht, großer Kohonen-Schicht und vielen Trainingsmustern ist sehr Rechen- und damit Zeitaufwändig. Eine Parallelisierung kann durch Zerlegung der Karte in kleinere Karten erfolgen, die unabhängig voneinander berechnet werden können, so dass ein paralleler Algorithmus nicht notwendig ist. Gleichzeitig sinkt der Rechenaufwand pro Karte, da weniger Neuronen und damit weniger Gewichtsvektoren vorhanden sind Konzept Diese Herangehensweise wird dadurch motiviert, dass während des Trainings einer Kohonen- Karte tatsächlich zu Beginn eine derartige grobe Aufteilung stattfindet, wie in Abbildung 21 zu sehen ist. Die Abbildung zeigt eine U-Matrix-Darstellung einer Karte in verschiedenen Stadien des Trainings. Neuronen, deren Gewichtsvektoren sich stark von denen benachbarter Neuronen unterscheiden, sind dunkel dargestellt, Cluster sind als helle Gebiete zu erkennen. Es ist deutlich zu sehen, dass sich zu Beginn mehrere sehr großflächige Bereiche herausgebildet haben. Bei diesem Ansatz sind jedoch folgende Faktoren zu berücksichtigen:

69 Abbildung 21: U-Matrix einer Kohonen-Karte (a) Initiale Karte (b) 2 Trainingszyklen (c) 5 Trainingszyklen (d) 10 Trainingszyklen Quelle: Eigene Darstellung. 1. Das Aufteilen der Trainingsmuster muss so erfolgen, dass die Teilkarten nur mit den Mustern trainiert werden, die für sie relevant sind. Es ist also eine Vorauswahl zu treffen. 2. Durch die Aufteilung der Karte könnten Nachbarschaftsbeziehungen zwischen Clustern gestört werden. Läge ein Gewinnerneuron am Rand einer Teilkarte, würde es bei entsprechend Großem Trainingsradius auch Neuronen benachbarter Karten beeinflussen müssen. Laut Punkt 1. stellt sich zunächst die Frage, wie die Datensätze auf die einzelnen Teil-Karten zu verteilen sind, da genau dies - die Gruppierung ähnlicher Datensätze - ja eigentlich durch die Karte selbst erfolgen soll. Hierfür bietet sich ein mehrstufiges Clustern an, bei dem zunächst eine grobe Aufteilung der Datensätze P durch eine sehr kleine Kohonen-Karte mit wenigen Neuronen vorgenommen wird. Anschließend werden für jeden Cluster bzw. jedes Neuron n eine neue Karte erzeugt und mit den diesem Cluster zugeordneten Trainingsmustern P n P, dist(p, W n ) min trainiert. Punkt 2. ist schwieriger zu Lösen. Ein Ansatz wäre, die Teilkarten erst dann zu erzeugen, wenn der Trainingsradius klein genug ist, dass die Distanzfunktion h cj (t) Werte nahe Null liefert und somit der zweite Summand der Lernfunktion ebenfalls gegen Null geht: W j (t + 1) = W j (t) + η(t)h cj (t)[x(t) W j (t)] Um beim späteren Zusammenfügen der Karten ein konsistentes Kartenbild zu erhalten, müssen die Teilkarten eine Gewichtung der Neuronen aufweisen, die die Nachbarschaftsbeziehung so abbildet, dass Neuronen an den Rändern benachbarter Karten ähnlich sind. Dies kann durch

Grundlagen der Parallelisierung

Grundlagen der Parallelisierung Grundlagen der Parallelisierung Philipp Kegel, Sergei Gorlatch AG Parallele und Verteilte Systeme Institut für Informatik Westfälische Wilhelms-Universität Münster 3. Juli 2009 Inhaltsverzeichnis 1 Einführung

Mehr

Übersicht. Nebenläufige Programmierung. Praxis und Semantik. Einleitung. Sequentielle und nebenläufige Programmierung. Warum ist. interessant?

Übersicht. Nebenläufige Programmierung. Praxis und Semantik. Einleitung. Sequentielle und nebenläufige Programmierung. Warum ist. interessant? Übersicht Aktuelle Themen zu Informatik der Systeme: Nebenläufige Programmierung: Praxis und Semantik Einleitung 1 2 der nebenläufigen Programmierung WS 2011/12 Stand der Folien: 18. Oktober 2011 1 TIDS

Mehr

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem Fachbericht zum Thema: Anforderungen an ein Datenbanksystem von André Franken 1 Inhaltsverzeichnis 1 Inhaltsverzeichnis 1 2 Einführung 2 2.1 Gründe für den Einsatz von DB-Systemen 2 2.2 Definition: Datenbank

Mehr

Systeme 1. Kapitel 10. Virtualisierung

Systeme 1. Kapitel 10. Virtualisierung Systeme 1 Kapitel 10 Virtualisierung Virtualisierung Virtualisierung: Definition: Der Begriff Virtualisierung beschreibt eine Abstraktion von Computerhardware hin zu einer virtuellen Maschine. Tatsächlich

Mehr

In 12 Schritten zum mobilen PC mit Paragon Drive Copy 11 und Microsoft Windows Virtual PC

In 12 Schritten zum mobilen PC mit Paragon Drive Copy 11 und Microsoft Windows Virtual PC PARAGON Technologie GmbH, Systemprogrammierung Heinrich-von-Stephan-Str. 5c 79100 Freiburg, Germany Tel. +49 (0) 761 59018201 Fax +49 (0) 761 59018130 Internet www.paragon-software.com Email sales@paragon-software.com

Mehr

Hochleistungsrechnen für Wissenschaft und Wirtschaft im internationalen Verbund

Hochleistungsrechnen für Wissenschaft und Wirtschaft im internationalen Verbund Hochleistungsrechnen für Wissenschaft und Wirtschaft im internationalen Verbund Prof. Dr. rer. nat. Christian Schröder Dipl.-Ing. Thomas Hilbig, Dipl.-Ing. Gerhard Hartmann Fachbereich Elektrotechnik und

Mehr

Lizenzierung von System Center 2012

Lizenzierung von System Center 2012 Lizenzierung von System Center 2012 Mit den Microsoft System Center-Produkten lassen sich Endgeräte wie Server, Clients und mobile Geräte mit unterschiedlichen Betriebssystemen verwalten. Verwalten im

Mehr

Ein kleiner Einblick in die Welt der Supercomputer. Christian Krohn 07.12.2010 1

Ein kleiner Einblick in die Welt der Supercomputer. Christian Krohn 07.12.2010 1 Ein kleiner Einblick in die Welt der Supercomputer Christian Krohn 07.12.2010 1 Vorschub: FLOPS Entwicklung der Supercomputer Funktionsweisen von Supercomputern Zukunftsvisionen 2 Ein Top10 Supercomputer

Mehr

Das große ElterngeldPlus 1x1. Alles über das ElterngeldPlus. Wer kann ElterngeldPlus beantragen? ElterngeldPlus verstehen ein paar einleitende Fakten

Das große ElterngeldPlus 1x1. Alles über das ElterngeldPlus. Wer kann ElterngeldPlus beantragen? ElterngeldPlus verstehen ein paar einleitende Fakten Das große x -4 Alles über das Wer kann beantragen? Generell kann jeder beantragen! Eltern (Mütter UND Väter), die schon während ihrer Elternzeit wieder in Teilzeit arbeiten möchten. Eltern, die während

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

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

Virtual Private Network. David Greber und Michael Wäger

Virtual Private Network. David Greber und Michael Wäger Virtual Private Network David Greber und Michael Wäger Inhaltsverzeichnis 1 Technische Grundlagen...3 1.1 Was ist ein Virtual Private Network?...3 1.2 Strukturarten...3 1.2.1 Client to Client...3 1.2.2

Mehr

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Dateiname: ecdl5_01_00_documentation_standard.doc Speicherdatum: 14.02.2005 ECDL 2003 Basic Modul 5 Datenbank - Grundlagen

Mehr

I N F O R M A T I O N V I R T U A L I S I E R U N G. Wir schützen Ihre Unternehmenswerte

I N F O R M A T I O N V I R T U A L I S I E R U N G. Wir schützen Ihre Unternehmenswerte I N F O R M A T I O N V I R T U A L I S I E R U N G Wir schützen Ihre Unternehmenswerte Wir schützen Ihre Unternehmenswerte Ausfallsicherheit durch Virtualisierung Die heutigen Anforderungen an IT-Infrastrukturen

Mehr

Albert HAYR Linux, IT and Open Source Expert and Solution Architect. Open Source professionell einsetzen

Albert HAYR Linux, IT and Open Source Expert and Solution Architect. Open Source professionell einsetzen Open Source professionell einsetzen 1 Mein Background Ich bin überzeugt von Open Source. Ich verwende fast nur Open Source privat und beruflich. Ich arbeite seit mehr als 10 Jahren mit Linux und Open Source.

Mehr

Wir unterscheiden folgende drei Schritte im Design paralleler Algorithmen:

Wir unterscheiden folgende drei Schritte im Design paralleler Algorithmen: 1 Parallele Algorithmen Grundlagen Parallele Algorithmen Grundlagen Wir unterscheiden folgende drei Schritte im Design paralleler Algorithmen: Dekomposition eines Problems in unabhängige Teilaufgaben.

Mehr

4D Server v12 64-bit Version BETA VERSION

4D Server v12 64-bit Version BETA VERSION 4D Server v12 64-bit Version BETA VERSION 4D Server v12 unterstützt jetzt das Windows 64-bit Betriebssystem. Hauptvorteil der 64-bit Technologie ist die rundum verbesserte Performance der Anwendungen und

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

IT-Governance und Social, Mobile und Cloud Computing: Ein Management Framework... Bachelorarbeit

IT-Governance und Social, Mobile und Cloud Computing: Ein Management Framework... Bachelorarbeit IT-Governance und Social, Mobile und Cloud Computing: Ein Management Framework... Bachelorarbeit zur Erlangung des akademischen Grades Bachelor of Science (B.Sc.) im Studiengang Wirtschaftswissenschaft

Mehr

Datensicherung. Beschreibung der Datensicherung

Datensicherung. Beschreibung der Datensicherung Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten

Mehr

Konzepte der Informatik

Konzepte der Informatik Konzepte der Informatik Vorkurs Informatik zum WS 2011/2012 26.09. - 30.09.2011 17.10. - 21.10.2011 Dr. Werner Struckmann / Christoph Peltz Stark angelehnt an Kapitel 1 aus "Abenteuer Informatik" von Jens

Mehr

Architektur Verteilter Systeme Teil 2: Prozesse und Threads

Architektur Verteilter Systeme Teil 2: Prozesse und Threads Architektur Verteilter Systeme Teil 2: Prozesse und Threads 21.10.15 1 Übersicht Prozess Thread Scheduler Time Sharing 2 Begriff Prozess und Thread I Prozess = Sequentiell ablaufendes Programm Thread =

Mehr

Einführung in. Logische Schaltungen

Einführung in. Logische Schaltungen Einführung in Logische Schaltungen 1/7 Inhaltsverzeichnis 1. Einführung 1. Was sind logische Schaltungen 2. Grundlegende Elemente 3. Weitere Elemente 4. Beispiel einer logischen Schaltung 2. Notation von

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv

schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv Roboter programmieren mit NXC für Lego Mindstorms NXT 1. Auflage Roboter programmieren mit NXC für Lego Mindstorms NXT schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv Verlag

Mehr

Lizenzierung von SharePoint Server 2013

Lizenzierung von SharePoint Server 2013 Lizenzierung von SharePoint Server 2013 Das Lizenzmodell von SharePoint Server 2013 besteht aus zwei Komponenten: Serverlizenzen zur Lizenzierung der Serversoftware und CALs zur Lizenzierung der Zugriffe

Mehr

Typisierung des Replikationsplan Wirries, Denis Datenbankspezialist

Typisierung des Replikationsplan Wirries, Denis Datenbankspezialist Typisierung des Replikationsplan Wirries, Denis Datenbankspezialist Feintypisierung - Überblick Ergebnisse Ergebnisse aus aus anderen anderen Arbeitsergebnissen Arbeitsergebnissen Replikationsplan Replikationsplan

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

Lizenzierung von Windows Server 2012

Lizenzierung von Windows Server 2012 Lizenzierung von Windows Server 2012 Das Lizenzmodell von Windows Server 2012 Datacenter und Standard besteht aus zwei Komponenten: Prozessorlizenzen zur Lizenzierung der Serversoftware und CALs zur Lizenzierung

Mehr

2 Die Terminaldienste Prüfungsanforderungen von Microsoft: Lernziele:

2 Die Terminaldienste Prüfungsanforderungen von Microsoft: Lernziele: 2 Die Terminaldienste Prüfungsanforderungen von Microsoft: Configuring Terminal Services o Configure Windows Server 2008 Terminal Services RemoteApp (TS RemoteApp) o Configure Terminal Services Gateway

Mehr

Windows 8 Lizenzierung in Szenarien

Windows 8 Lizenzierung in Szenarien Windows 8 Lizenzierung in Szenarien Windows Desktop-Betriebssysteme kommen in unterschiedlichen Szenarien im Unternehmen zum Einsatz. Die Mitarbeiter arbeiten an Unternehmensgeräten oder bringen eigene

Mehr

Lizenzierung von SharePoint Server 2013

Lizenzierung von SharePoint Server 2013 Lizenzierung von SharePoint Server 2013 Das Lizenzmodell von SharePoint Server 2013 besteht aus zwei Komponenten: Serverlizenzen zur Lizenzierung der Serversoftware und CALs zur Lizenzierung der Zugriffe

Mehr

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER Abamsoft Finos in Verbindung mit der Webshopanbindung wurde speziell auf die Shop-Software shop to date von DATA BECKER abgestimmt. Mit

Mehr

In 15 einfachen Schritten zum mobilen PC mit Paragon Drive Copy 10 und Microsoft Windows Virtual PC

In 15 einfachen Schritten zum mobilen PC mit Paragon Drive Copy 10 und Microsoft Windows Virtual PC PARAGON Technologie GmbH, Systemprogrammierung Heinrich-von-Stephan-Str. 5c 79100 Freiburg, Germany Tel. +49 (0) 761 59018201 Fax +49 (0) 761 59018130 Internet www.paragon-software.com Email sales@paragon-software.com

Mehr

SDD System Design Document

SDD System Design Document SDD Software Konstruktion WS01/02 Gruppe 4 1. Einleitung Das vorliegende Dokument richtet sich vor allem an die Entwickler, aber auch an den Kunden, der das enstehende System verwenden wird. Es soll einen

Mehr

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen Alexander Schunk Henry Trobisch Inhalt 1. Vergleich der Unit-Tests... 2 2. Vergleich der Codeabdeckungs-Tests... 2 3. Vergleich

Mehr

IBM SPSS Data Access Pack Installationsanweisung für Windows

IBM SPSS Data Access Pack Installationsanweisung für Windows IBM SPSS Data Access Pack Installationsanweisung für Windows Inhaltsverzeichnis Kapitel 1. Übersicht.......... 1 Einführung............... 1 Bereitstellen einer Datenzugriffstechnologie.... 1 ODBC-Datenquellen...........

Mehr

In 15 Schritten zum mobilen PC mit Paragon Drive Copy 14 und VMware Player

In 15 Schritten zum mobilen PC mit Paragon Drive Copy 14 und VMware Player PARAGON Technologie GmbH, Systemprogrammierung Heinrich-von-Stephan-Str. 5c 79100 Freiburg, Germany Tel. +49 (0)761 59018-201 Fax +49 (0)761 59018-130 Internet www.paragon-software.com E-Mail sales@paragon-software.com

Mehr

Zeichen bei Zahlen entschlüsseln

Zeichen bei Zahlen entschlüsseln Zeichen bei Zahlen entschlüsseln In diesem Kapitel... Verwendung des Zahlenstrahls Absolut richtige Bestimmung von absoluten Werten Operationen bei Zahlen mit Vorzeichen: Addieren, Subtrahieren, Multiplizieren

Mehr

Software Engineering. Sommersemester 2012, Dr. Andreas Metzger

Software Engineering. Sommersemester 2012, Dr. Andreas Metzger Software Engineering (Übungsblatt 2) Sommersemester 2012, Dr. Andreas Metzger Übungsblatt-Themen: Prinzip, Technik, Methode und Werkzeug; Arten von Wartung; Modularität (Kohäsion/ Kopplung); Inkrementelle

Mehr

SharePoint Demonstration

SharePoint Demonstration SharePoint Demonstration Was zeigt die Demonstration? Diese Demonstration soll den modernen Zugriff auf Daten und Informationen veranschaulichen und zeigen welche Vorteile sich dadurch in der Zusammenarbeit

Mehr

Robot Karol für Delphi

Robot Karol für Delphi Robot Karol für Delphi Reinhard Nitzsche, OSZ Handel I Version 0.1 vom 24. Januar 2003 Zusammenfassung Nach der Einführung in die (variablenfreie) Programmierung mit Robot Karol von Freiberger und Krško

Mehr

Die Lernumgebung des Projekts Informationskompetenz

Die Lernumgebung des Projekts Informationskompetenz Beitrag für Bibliothek aktuell Die Lernumgebung des Projekts Informationskompetenz Von Sandra Merten Im Rahmen des Projekts Informationskompetenz wurde ein Musterkurs entwickelt, der den Lehrenden als

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

EasyWk DAS Schwimmwettkampfprogramm

EasyWk DAS Schwimmwettkampfprogramm EasyWk DAS Schwimmwettkampfprogramm Arbeiten mit OMEGA ARES 21 EasyWk - DAS Schwimmwettkampfprogramm 1 Einleitung Diese Präsentation dient zur Darstellung der Zusammenarbeit zwischen EasyWk und der Zeitmessanlage

Mehr

Analyse zum Thema: Laufzeit von Support-Leistungen für ausgewählte Server OS

Analyse zum Thema: Laufzeit von Support-Leistungen für ausgewählte Server OS Analyse zum Thema: Laufzeit von Support-Leistungen für Axel Oppermann Advisor phone: +49 561 506975-24 mobile: +49 151 223 223 00 axel.oppermann@experton-group.com Januar 2010 Inhalt Summary und Key Findings

Mehr

Tapps mit XP-Mode unter Windows 7 64 bit (V2.0)

Tapps mit XP-Mode unter Windows 7 64 bit (V2.0) Tapps mit XP-Mode unter Windows 7 64 bit (V2.0) 1 Einleitung... 2 2 Download und Installation... 3 2.1 Installation von WindowsXPMode_de-de.exe... 4 2.2 Installation von Windows6.1-KB958559-x64.msu...

Mehr

LabView7Express Gerätesteuerung über LAN in einer Client-Serverkonfiguration. 1. Steuerung eines VI über LAN

LabView7Express Gerätesteuerung über LAN in einer Client-Serverkonfiguration. 1. Steuerung eines VI über LAN LabView7Express Gerätesteuerung über LAN in einer Client-Serverkonfiguration Arbeitsblatt und Demonstration A. Rost 1. Steuerung eines VI über LAN Eine Möglichkeit zur Steuerung virtueller Instrumente

Mehr

Verarbeitung der Eingangsmeldungen in einem Callcenter

Verarbeitung der Eingangsmeldungen in einem Callcenter Q-up ist ein Produkt der: Anwendungsbeispiele Verarbeitung der Eingangsmeldungen in einem Callcenter Der Testdatengenerator Der Testdatengenerator Verarbeitung der Eingangsmeldungen in einem Callcenter

Mehr

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten In dem Virtuellen Seminarordner werden für die Teilnehmerinnen und Teilnehmer des Seminars alle für das Seminar wichtigen Informationen,

Mehr

Übungen zur Softwaretechnik

Übungen zur Softwaretechnik Technische Universität München Fakultät für Informatik Lehrstuhl IV: Software & Systems Engineering Markus Pister, Dr. Bernhard Rumpe WS 2002/2003 Lösungsblatt 9 17. Dezember 2002 www4.in.tum.de/~rumpe/se

Mehr

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Suche schlecht beschriftete Bilder mit Eigenen Abfragen Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere

Mehr

Sie erhalten einen kurzen Überblick über die verschiedenen Domänenkonzepte.

Sie erhalten einen kurzen Überblick über die verschiedenen Domänenkonzepte. 4 Domänenkonzepte Ziele des Kapitels: Sie verstehen den Begriff Domäne. Sie erhalten einen kurzen Überblick über die verschiedenen Domänenkonzepte. Sie verstehen die Besonderheiten der Vertrauensstellungen

Mehr

Swisscom TV Medien Assistent

Swisscom TV Medien Assistent Swisscom TV Medien Assistent Mithilfe dieses Assistenten können Sie Fotos und Musik, die Sie auf Ihrem Computer freigegeben haben, auf Swisscom TV geniessen. Diese Bedienungsanleitung richtet sich an die

Mehr

Grundlagen der Theoretischen Informatik, SoSe 2008

Grundlagen der Theoretischen Informatik, SoSe 2008 1. Aufgabenblatt zur Vorlesung Grundlagen der Theoretischen Informatik, SoSe 2008 (Dr. Frank Hoffmann) Lösung von Manuel Jain und Benjamin Bortfeldt Aufgabe 2 Zustandsdiagramme (6 Punkte, wird korrigiert)

Mehr

Rechnernetzwerke. Rechnernetze sind Verbünde von einzelnen Computern, die Daten auf elektronischem Weg miteinander austauschen können.

Rechnernetzwerke. Rechnernetze sind Verbünde von einzelnen Computern, die Daten auf elektronischem Weg miteinander austauschen können. Rechnernetzwerke Rechnernetze sind Verbünde von einzelnen Computern, die Daten auf elektronischem Weg miteinander austauschen können. Im Gegensatz zu klassischen Methoden des Datenaustauschs (Diskette,

Mehr

Task: Nmap Skripte ausführen

Task: Nmap Skripte ausführen Task: Nmap Skripte ausführen Inhalt Einfache Netzwerkscans mit NSE Ausführen des Scans Anpassung der Parameter Einleitung Copyright 2009-2015 Greenbone Networks GmbH Herkunft und aktuellste Version dieses

Mehr

Eigenen WSUS Server mit dem UNI WSUS Server Synchronisieren

Eigenen WSUS Server mit dem UNI WSUS Server Synchronisieren Verwaltungsdirektion Informatikdienste Eigenen WSUS Server mit dem UNI WSUS Server Synchronisieren Inhaltsverzeichnis Einleitung... 3 Installation WSUS Server... 4 Dokumente... 4 Step by Step Installation...

Mehr

Eine Logikschaltung zur Addition zweier Zahlen

Eine Logikschaltung zur Addition zweier Zahlen Eine Logikschaltung zur Addition zweier Zahlen Grundlegender Ansatz für die Umsetzung arithmetischer Operationen als elektronische Schaltung ist die Darstellung von Zahlen im Binärsystem. Eine Logikschaltung

Mehr

SWT II Projekt. Chat - Anwendung. Pflichtenheft 2000 SWT

SWT II Projekt. Chat - Anwendung. Pflichtenheft 2000 SWT SWT II Projekt Chat - Anwendung Pflichtenheft 2000 SWT i Versionen Datum Version Beschreibung Autor 3.11.2000 1.0 erste Version Dietmar Matthes ii Inhaltsverzeichnis 1. ZWECK... 1 1.1. RAHMEN... 1 1.2.

Mehr

Konfiguration VLAN's. Konfiguration VLAN's IACBOX.COM. Version 2.0.1 Deutsch 01.07.2014

Konfiguration VLAN's. Konfiguration VLAN's IACBOX.COM. Version 2.0.1 Deutsch 01.07.2014 Konfiguration VLAN's Version 2.0.1 Deutsch 01.07.2014 In diesem HOWTO wird die Konfiguration der VLAN's für das Surf-LAN der IAC-BOX beschrieben. Konfiguration VLAN's TITEL Inhaltsverzeichnis Inhaltsverzeichnis...

Mehr

Autorisierung. Sicherheit und Zugriffskontrolle & Erstellen einer Berechtigungskomponente

Autorisierung. Sicherheit und Zugriffskontrolle & Erstellen einer Berechtigungskomponente Autorisierung Sicherheit und Zugriffskontrolle & Erstellen einer Berechtigungskomponente Dokumentation zum Referat von Matthias Warnicke und Joachim Schröder Modul: Komponenten basierte Softwareentwickelung

Mehr

Guide DynDNS und Portforwarding

Guide DynDNS und Portforwarding Guide DynDNS und Portforwarding Allgemein Um Geräte im lokalen Netzwerk von überall aus über das Internet erreichen zu können, kommt man um die Themen Dynamik DNS (kurz DynDNS) und Portweiterleitung(auch

Mehr

Agile Vorgehensmodelle in der Softwareentwicklung: Scrum

Agile Vorgehensmodelle in der Softwareentwicklung: Scrum C A R L V O N O S S I E T Z K Y Agile Vorgehensmodelle in der Softwareentwicklung: Scrum Johannes Diemke Vortrag im Rahmen der Projektgruppe Oldenburger Robot Soccer Team im Wintersemester 2009/2010 Was

Mehr

Content Management System mit INTREXX 2002.

Content Management System mit INTREXX 2002. Content Management System mit INTREXX 2002. Welche Vorteile hat ein CM-System mit INTREXX? Sie haben bereits INTREXX im Einsatz? Dann liegt es auf der Hand, dass Sie ein CM-System zur Pflege Ihrer Webseite,

Mehr

Man liest sich: POP3/IMAP

Man liest sich: POP3/IMAP Man liest sich: POP3/IMAP Gliederung 1. Einführung 1.1 Allgemeiner Nachrichtenfluss beim Versenden von E-Mails 1.2 Client und Server 1.2.1 Client 1.2.2 Server 2. POP3 2.1 Definition 2.2 Geschichte und

Mehr

Grundbegriffe der Informatik

Grundbegriffe der Informatik Grundbegriffe der Informatik Einheit 15: Reguläre Ausdrücke und rechtslineare Grammatiken Thomas Worsch Universität Karlsruhe, Fakultät für Informatik Wintersemester 2008/2009 1/25 Was kann man mit endlichen

Mehr

Proseminar Rechnerarchitekturen. Parallelcomputer: Multiprozessorsysteme

Proseminar Rechnerarchitekturen. Parallelcomputer: Multiprozessorsysteme wwwnet-texde Proseminar Rechnerarchitekturen Parallelcomputer: Multiprozessorsysteme Stefan Schumacher, , PGP Key http://wwwnet-texde/uni Id: mps-folientex,v

Mehr

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser

Seite 1 von 14. Cookie-Einstellungen verschiedener Browser Seite 1 von 14 Cookie-Einstellungen verschiedener Browser Cookie-Einstellungen verschiedener Browser, 7. Dezember 2015 Inhaltsverzeichnis 1.Aktivierung von Cookies... 3 2.Cookies... 3 2.1.Wofu r braucht

Mehr

Lineare Gleichungssysteme

Lineare Gleichungssysteme Lineare Gleichungssysteme 1 Zwei Gleichungen mit zwei Unbekannten Es kommt häufig vor, dass man nicht mit einer Variablen alleine auskommt, um ein Problem zu lösen. Das folgende Beispiel soll dies verdeutlichen

Mehr

Schritt-Schritt-Anleitung zum mobilen PC mit Paragon Drive Copy 10 und VMware Player

Schritt-Schritt-Anleitung zum mobilen PC mit Paragon Drive Copy 10 und VMware Player PARAGON Technologie GmbH, Systemprogrammierung Heinrich-von-Stephan-Str. 5c 79100 Freiburg, Germany Tel. +49 (0) 761 59018201 Fax +49 (0) 761 59018130 Internet www.paragon-software.com Email sales@paragon-software.com

Mehr

10 Erweiterung und Portierung

10 Erweiterung und Portierung 10.1 Überblick In vielen Fällen werden Compiler nicht vollständig neu geschrieben, sondern von einem Rechnersystem auf ein anderes portiert. Das spart viel Arbeit, ist aber immer noch eine sehr anspruchsvolle

Mehr

Lizenzen auschecken. Was ist zu tun?

Lizenzen auschecken. Was ist zu tun? Use case Lizenzen auschecken Ihr Unternehmen hat eine Netzwerk-Commuterlizenz mit beispielsweise 4 Lizenzen. Am Freitag wollen Sie Ihren Laptop mit nach Hause nehmen, um dort am Wochenende weiter zu arbeiten.

Mehr

Anleitung zum Extranet-Portal des BBZ Solothurn-Grenchen

Anleitung zum Extranet-Portal des BBZ Solothurn-Grenchen Anleitung zum Extranet-Portal des BBZ Solothurn-Grenchen Inhalt Anleitung zum Extranet-Portal des BBZ Solothurn-Grenchen 2.2 Installation von Office 2013 auf Ihrem privaten PC 2.3 Arbeiten mit den Microsoft

Mehr

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland OECD Programme for International Student Assessment Deutschland PISA 2000 Lösungen der Beispielaufgaben aus dem Mathematiktest Beispielaufgaben PISA-Hauptstudie 2000 Seite 3 UNIT ÄPFEL Beispielaufgaben

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

FastBill Automatic. Dokumentation Versand. FastBill GmbH. Holteyer Straße 30 45289 Essen Telefon 0201 47091505 Telefax 0201 54502360

FastBill Automatic. Dokumentation Versand. FastBill GmbH. Holteyer Straße 30 45289 Essen Telefon 0201 47091505 Telefax 0201 54502360 FastBill GmbH Holteyer Straße 30 45289 Essen Telefon 0201 47091505 Telefax 0201 54502360 FastBill Automatic Dokumentation Versand 1 Inhaltsverzeichnis: 1. Grundlegendes 2. Produkteinstellungen 2.1. Grundeinstellungen

Mehr

OUTSOURCING ADVISOR. Analyse von SW-Anwendungen und IT-Dienstleistungen auf ihre Global Sourcing Eignung. Bewertung von Dienstleistern und Standorten

OUTSOURCING ADVISOR. Analyse von SW-Anwendungen und IT-Dienstleistungen auf ihre Global Sourcing Eignung. Bewertung von Dienstleistern und Standorten Outsourcing Advisor Bewerten Sie Ihre Unternehmensanwendungen auf Global Sourcing Eignung, Wirtschaftlichkeit und wählen Sie den idealen Dienstleister aus. OUTSOURCING ADVISOR Der Outsourcing Advisor ist

Mehr

HISTORISCHES INFORMATIK-MUSEUM DER UNIVERSIDAD POLITECNICA DE MADRID

HISTORISCHES INFORMATIK-MUSEUM DER UNIVERSIDAD POLITECNICA DE MADRID HISTORISCHES INFORMATIK-MUSEUM DER UNIVERSIDAD POLITECNICA DE MADRID Die Initiative, ein historisches Informatik-Museum zu gründen, ist Pionier im Rahmen der spanischen Universitäten. Sie hat das Sammeln

Mehr

Bei der Installation folgen Sie den Anweisungen des Installations- Assistenten.

Bei der Installation folgen Sie den Anweisungen des Installations- Assistenten. Installation Bei der Installation folgen Sie den Anweisungen des Installations- Assistenten. Einzelner Arbeitsplatz Sie legen dazu die CD des TopKontor - Programms in das CD-Rom- Laufwerk Ihres Rechners.

Mehr

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI TTS - TinyTimeSystem Unterrichtsprojekt BIBI Mathias Metzler, Philipp Winder, Viktor Sohm 28.01.2008 TinyTimeSystem Inhaltsverzeichnis Problemstellung... 2 Lösungsvorschlag... 2 Punkte die unser Tool erfüllen

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

Ein mobiler Electronic Program Guide für Android

Ein mobiler Electronic Program Guide für Android Whitepaper Telekommunikation Ein mobiler Electronic Program Guide für Android Prototyp für Android Apps 2011 SYRACOM AG 1 Einleitung Apps Anwendungen für mobile Geräte sind derzeit in aller Munde. Durch

Mehr

Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am 14.08.08

Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am 14.08.08 Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements von Stephanie Wilke am 14.08.08 Überblick Einleitung Was ist ITIL? Gegenüberstellung der Prozesse Neuer

Mehr

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers Ist Excel das richtige Tool für FMEA? Einleitung Wenn in einem Unternehmen FMEA eingeführt wird, fangen die meisten sofort damit an,

Mehr

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 von Markus Mack Stand: Samstag, 17. April 2004 Inhaltsverzeichnis 1. Systemvorraussetzungen...3 2. Installation und Start...3 3. Anpassen der Tabelle...3

Mehr

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008 Konzeption und Implementierung einer automatisierten Testumgebung, 10. Dezember 2008 1 Gliederung Einleitung Softwaretests Beispiel Konzeption Zusammenfassung 2 Einleitung Komplexität von Softwaresystemen

Mehr

Einführung in die technische Informatik

Einführung in die technische Informatik Einführung in die technische Informatik Christopher Kruegel chris@auto.tuwien.ac.at http://www.auto.tuwien.ac.at/~chris Betriebssysteme Aufgaben Management von Ressourcen Präsentation einer einheitlichen

Mehr

Parallels Mac Management 3.5

Parallels Mac Management 3.5 Parallels Mac Management 3.5 Deployment-Handbuch 25. Februar 2015 Copyright 1999 2015 Parallels IP Holdings GmbH und Tochterunternehmen. Alle Rechte vorbehalten. Alle anderen hierin erwähnten Marken und

Mehr

Research Note zum Thema: Laufzeit von Support-Leistungen für Server OS

Research Note zum Thema: Laufzeit von Support-Leistungen für Server OS Research Note zum Thema: Laufzeit von Support-Leistungen für Axel Oppermann Advisor phone: +49 561 506975-24 mobile: +49 151 223 223 00 axel.oppermann@experton-group.com November 2009 Inhalt 1 EINFÜHRUNG

Mehr

Verkürzung von Entwurfszeiten

Verkürzung von Entwurfszeiten Verkürzung von Entwurfszeiten durch Matlab-basiertes HPC R. Fink, S. Pawletta Übersicht aktuelle Situation im ingenieurtechnischen Bereich Multi-SCEs als Konzept zur Verkürzung von Entwurfszeiten Realisierung

Mehr

Microsoft PowerPoint 2013 Folien gemeinsam nutzen

Microsoft PowerPoint 2013 Folien gemeinsam nutzen Hochschulrechenzentrum Justus-Liebig-Universität Gießen Microsoft PowerPoint 2013 Folien gemeinsam nutzen Folien gemeinsam nutzen in PowerPoint 2013 Seite 1 von 4 Inhaltsverzeichnis Einleitung... 2 Einzelne

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion

Mehr

Avira Management Console 2.6.1 Optimierung für großes Netzwerk. Kurzanleitung

Avira Management Console 2.6.1 Optimierung für großes Netzwerk. Kurzanleitung Avira Management Console 2.6.1 Optimierung für großes Netzwerk Kurzanleitung Inhaltsverzeichnis 1. Einleitung... 3 2. Aktivieren des Pull-Modus für den AMC Agent... 3 3. Ereignisse des AMC Agent festlegen...

Mehr

IBM Software Demos Tivoli Provisioning Manager for OS Deployment

IBM Software Demos Tivoli Provisioning Manager for OS Deployment Für viele Unternehmen steht ein Wechsel zu Microsoft Windows Vista an. Doch auch für gut vorbereitete Unternehmen ist der Übergang zu einem neuen Betriebssystem stets ein Wagnis. ist eine benutzerfreundliche,

Mehr

DSO. Abtastrate und Speichertiefe

DSO. Abtastrate und Speichertiefe DSO Abtastrate und Speichertiefe Inhalt Inhalt...- 1 - Feine Signaldetails und lange Abtastzeiträume...- 2 - Was ein großer Speicher bewirkt...- 2 - Einfluss der Oszilloskop-Architektur auf die Update-Rate...-

Mehr

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware Datenübernahme von HKO 5.9 zur Advolux Kanzleisoftware Die Datenübernahme (DÜ) von HKO 5.9 zu Advolux Kanzleisoftware ist aufgrund der von Update zu Update veränderten Datenbank (DB)-Strukturen in HKO

Mehr

Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10. Technische Informationen (White Paper)

Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10. Technische Informationen (White Paper) Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10 Technische Informationen (White Paper) Inhaltsverzeichnis 1. Über dieses Dokument... 3 2. Überblick... 3 3. Upgrade Verfahren... 4

Mehr

In 15 Schritten zum mobilen PC mit Paragon Drive Copy 11 und VMware Player

In 15 Schritten zum mobilen PC mit Paragon Drive Copy 11 und VMware Player PARAGON Technologie GmbH, Systemprogrammierung Heinrich-von-Schritthan-Str. 5c 79100 Freiburg, Germany Tel. +49 (0) 761 59018201 Fax +49 (0) 761 59018130 Internet www.paragon-software.com Email sales@paragon-software.com

Mehr