Inhaltsverzeichnis 1 Einleitung ............................................................................................................................ 2 2 Die Plazierungsinstanz als Dienstgeber................................................................................. 3 2.1 Dienste der Plazierungsinstanz ...................................................................................... 3 2.2 Einbettung in das System .............................................................................................. 4 2.3 Beauftragung des Dienstgebers ..................................................................................... 5 2.3.1 Auftragsentgegennahme ......................................................................................... 5 2.3.2 Auftragswarteschlange ........................................................................................... 6 3 Systeminformationen ........................................................................................................... 8 3.1 Lokale dynamische Systeminformationen ...................................................................... 8 3.2 Dynamische Systeminformationen vom Lastmonitor...................................................... 9 4 Plazierung.......................................................................................................................... 10 4.1 Plazierungsstrategien................................................................................................... 10 4.2 Plazierungsstrategien mit Partitionen........................................................................... 11 5 Implementierung................................................................................................................ 12 5.1 Dienstgeber................................................................................................................. 12 5.1.1 Auftragswarteschlange ......................................................................................... 14 5.1.2 Unterstützung mehrerer Plazierungsstrategien ...................................................... 16 5.2 Verwaltung der Systeminformationen.......................................................................... 17 5.2.1 Speicherung von Auslastungen ............................................................................. 17 5.3 Departitionierungsstrategie ......................................................................................... 17 5.3.1 Kommunikationsgraph ......................................................................................... 18 5.3.2 Struktur der Partitionen........................................................................................ 19 5.3.3 Partitionen-Baum ................................................................................................. 20 5.3.4 Behandlung von fest plazierten Knoten................................................................. 21 5.3.5 Departitionierung ................................................................................................. 23 5.4 Meßergebnisse ............................................................................................................ 24 6 Zusammenfassung.............................................................................................................. 25 6.1 Ausblick...................................................................................................................... 26 1 Einleitung Am Institut für Betriebs- und Dialogsysteme der Universität Karlsruhe wird ein Betriebssystem namens COSY (Concurrent Operating SYstem) entwickelt, das speziell auf die Bedürfnisse einer Multiprozessorarchitektur zugeschnitten ist. Es unterstützt unter anderem den Austausch von Nachrichten zwischen verteilten Anwendungen und die gemeinsame Nutzung von Betriebsmitteln durch parallel arbeitende Prozesse. Verteilte Anwendungen werden vom Programmierer in parallel arbeitende Prozesse zerlegt, die untereinander lediglich Nachrichten austauschen können. Diese werden beim Programmstart auf verschiedene Prozessoren geladen und ausgeführt. Die Plazierung der Module ist dabei vom Programmierer in einer Beschreibungsdatei festgelegt. Eine genauere Beschreibung von COSY befindet sich in [8] und [9]. Ein Entwurfsziel von COSY ist die Möglichkeit des Mehrbenutzer- bzw. Mehrprogrammbetriebs. Um eine möglichst optimale Leistung des Multiprozessorsystems zu erreichen, müssen die Module einer verteilten Anwendung, in Abhängigkeit von der momentanen Belegungssituation und der vom Programm erzeugten Last, plaziert werden. Eine statische, einmal festgelegte und dann für alle Ausführungen gleichbleibende Plazierung ist demnach nicht für den Einsatz in einem Parallelrechner, in dem Programme dynamisch eintreffen und sich den Prozessor räumlich und zeitlich teilen, geeignet, da bei jeder Ausführung eine andere Lastsituation vorliegt. Es sollte in der Verantwortung einer speziellen Instanz liegen, bei jeder Ausführung eine sinnvolle Plazierung für eine verteilte Anwendung zu finden. Aufgabe dieser Studienarbeit ist die Entwicklung einer Instanz zur Plazierung paralleler Programme. Die Instanz erhält die momentane Belegungssituation des Systems und einen Kommunikationsgraphen, der die Interaktionsbeziehungen innerhalb des auszuführenden Programms beschreibt. Daraus soll eine möglichst gute Plazierung berechnet werden. Die Aufgabe dieser Studienarbeit besteht nicht aus der Entwicklung einer optimalen Plazierungsstrategie, sondern aus dem Aufbau eines möglichst allgemeinen Grundgerüsts für eine Plazierungsinstanz. Die realisierte Plazierungsstrategie ist nur eine von vielen möglichen. Zukünftige Entwicklungen von Plazierungsstrategien sollen in die Instanz integriert werden können. Beim Entwurf der Plazierungsinstanz sind mehrere Ziele zu verfolgen: • Der Durchsatz des gesamten Systems soll aufgrund von guten Plazierungen möglichst hoch sein. • Die Bestimmung einer Plazierung soll keinen hohen Rechenaufwand benötigen und mit einer möglichst geringen Menge an Arbeitsspeicher auskommen. • Fest vorgegebene Plazierungen müssen berücksichtigt werden, da dies z. B. für die Nutzung an Prozessoren gebundener Dienste (z. B. Festplatte) wichtig ist. • Neue Plazierungsalgorithmen müssen auf einfache Weise in die Instanz integriert werden können. • Der Anwender soll die Möglichkeit besitzen, zur Laufzeit einen Plazierungsalgorithmus auszuwählen. 2 • Programme mit hohen Anforderungen an die Betriebsmittel dürfen nicht auf ewig zurückgestellt werden. • Die Instanz soll für den Anwender transparent arbeiten. Im nachfolgenden soll zuerst eine theoretische Beschreibung der Bestandteile der Plazierungsinstanz gegeben werden. Daraufhin wird die Implementierung der Instanz betrachtet. Den Schluß bildet eine kurze Zusammenfassung der Arbeit. 2 Die Plazierungsinstanz als Dienstgeber Die Plazierungsinstanz muß als systemweit angebotener Dienst von allen Prozessen in Anspruch genommen werden können. Entstehende Aufträge müssen vom Dienstgeber empfangen, bearbeitet und die Ergebnisse an die beauftragenden Prozesse zurückgesendet werden. Prozeß 1 senden Auftrag 1 Prozeß 2 Dienstgeber empfangen Auftrag 1 bearbeiten Auftrag 1 empfangen Ergebnis 1 senden Ergebnis 1 empfangen Auftrag 2 senden Auftrag 2 bearbeiten Auftrag 2 senden Ergebnis 2 empfangen Ergebnis 2 Abbildung 1: Dienstgeber und Dienstnehmer im Mehrprozeßbetrieb Eine Instanz zur Plazierung von parallelen Programmen muß ihre Dienste jedem Prozeß im System zur Verfügung stellen können. Deshalb wird die Plazierungsinstanz als Dienstgeber realisiert. Diese Entscheidung erfordert nicht die Existenz einer zentralen Plazierungsinstanz, sondern läßt prinzipiell eine verteilte Realisierung zu. Im Rahmen dieser Arbeit wurde allerdings ausschließlich der Fall einer zentralen Plazierungsinstanz betrachtet. 2.1 Dienste der Plazierungsinstanz In einem Mehrprozessorsystem mit mehreren parallel arbeitenden Prozessen ist eine spezielle Instanz zur Plazierung von Prozessen hilfreich. Sie ist für eine sinnvolle Zuteilung der Prozessoren zuständig. Die Plazierungsinstanz sollte verteilte Anwendungen in Abhängigkeit der 3 momentanen Auslastungen und der Topologie des Systems plazieren. Unter Auslastung eines Systems werden in diesem Fall folgende Faktoren verstanden: • Rechenlast auf jedem Prozessor • Speicherbelegung auf jedem Prozessor • Kommunikationslast auf jeder Verbindung im System Die Plazierungsinstanz stellt dem System einen Dienst zur Plazierung verteilter, paralleler Programme zur Verfügung. Genauer betrachtet ermittelt die Instanz aus der Beschreibung des Programms und der Auslastungsinformation des Systems die Plazierung für die parallelen Prozesse der Anwendung. Die Plazierungsinstanz wird immer benötigt, wenn ein paralleles verteiltes Programm gestartet wird. Weitere Einzelheiten zum Zusammenspiel der Plazierungsinstanz mit anderen Bestandteilen des Systems werden im Kapitel 2.2 beschrieben. 2.2 Einbettung in das System Die Plazierungsinstanz kooperiert mit dem Abwickler und dem Lastmonitor. Der Abwickler ist für die Einrichtung der Prozesse auf den Prozessoren verantwortlich. In diesem Zusammenhang beauftragt er die Plazierungsinstanz mit der Ermittlung einer sinnvollen Plazierung und richtet danach die Prozesse auf den ermittelten Prozessoren ein. Zur Berechnung der Plazierungsinformation erfragt die Plazierungsinstanz die momentanen Auslastungen im System. Belegungsänderung bzw. plaziere Kommunikationsgaph Kommunikationsgraph Abwickler Plazierungsinstanz Auftragskanal KommunikationsgraphDatenkanal Auftragskanal Datenkanal AuslastungenDatenkanal empfange Plazierungsinformation Plazierunginformation Abbildung 2: Interaktion mit anderen Instanzen 4 sende Auslastungen Auslastungen Lastmonitor Auftragskanal Der Dienstgeber besitzt eine Auftragswarteschlange, in der momentan nicht erfüllbare Aufträge gespeichert werden, bis sich die Belegungssituation des Parallelrechners ändert. Tritt eine Belegungsänderung ein, so erzeugt der Abwickler eine entsprechende Nachricht für die Plazierungsinstanz. Diese versucht nun Aufträge aus der Warteschlange, die aufgrund der Belegungsänderung erfüllbar geworden sein können, zu plazieren. Es ist zu beachten, daß der Abwickler, die Plazierungsinstanz und der Lastmonitor auf verschiedenen Prozessoren laufen können. Jeder Datenaustausch erzeugt Kommunikationslasten, die für eine effiziente Realisierung des Plazierungsdienstes, ebenso wie die Rechenzeit der Plazierungsinstanz selbst, möglichst gering gehalten werden sollten. 2.3 Beauftragung des Dienstgebers In diesem Kapitel werden Aspekte beschrieben, die für die Beauftragung des Dienstgebers relevant sind. Hierzu gehören der Algorithmus zur Auftragsentgegennahme, die Auftragswarteschlange und die Strategie, mit der Aufträge aus der Warteschlange ausgewählt werden. 2.3.1 Auftragsentgegennahme Die vom Dienstnehmer erzeugten Aufträge treten aus der Sicht des Dienstgebers zu unbestimmten Zeitpunkten auf. Aufträge mit einem für das System zu großen Ressourcenbedarf kann die Plazierungsinstanz niemals bearbeiten und müssen deshalb sofort abgelehnt werden. Aufträge, die unter der momentanen Auslastung des Systems nicht bearbeitet werden können, stellt die Plazierungsinstanz zunächst zurück. Zu diesem Zweck besitzt die Plazierungsinstanz eine Auftragswarteschlange, welche die momentan nicht erfüllbaren Aufträge enthält. Abbildung 3 verdeutlicht die beschriebene Arbeitsweise. empfangen Auftrag Auftrag jemals erfüllbar? Nein Ja Auftrag momentan erfüllbar? Nein Ja Auftrag bearbeiten Auftrag in Warteschlange einreihen senden Ablehnung Abbildung 3: Programmablauf bei der Auftragsentgegennahme 5 2.3.2 Auftragswarteschlange Die Auftragswarteschlange enthält alle Aufträge, die momentan nicht erfüllt werden können. Ein Belegungsversuch der in der Warteschlange stehenden Aufträge findet bei Änderung der Belegungssituation statt. Die dabei verwendete Strategie bei der Auswahl aus den Aufträgen der Warteschlange ist maßgeblich für eine faire Abwicklung und einen möglichst hohen Durchsatz des Systems. In dieser Arbeit wird eine Abwicklung als fair bezeichnet, wenn Aufträge bei einer Änderung der Belegungssituation im Parallelrechner in der Reihenfolge ihres Auftretens auf Erfüllbarkeit getestet werden. Neu ankommende Aufträge werden am Ende der Warteschlange angehängt. Bei einem Belegungsversuch werden die Elemente der Warteschlange ausgehend vom ersten Element der Reihe nach überprüft. So ist sichergestellt, daß die am längsten in der Warteschlange stehenden Aufträge zuerst geprüft werden. Zu einer fairen Abwicklung gehört allerdings auch, daß kein Auftrag in der Warteschlange „verhungert“, das heißt niemals zur Ausführung ausgewählt wird. Dieser Fall tritt zum Beispiel ein, wenn kleinere Aufträge die freigegebenen Ressourcen immer neu belegen und so niemals genügend freie Ressourcen vorhanden sind, um einen größeren Auftrag zu bearbeiten. Die Strategie zur Auswahl aus der Warteschlange muß solche Situationen berücksichtigen. Bei Einsatz der Strategie FCFS (first-come-first-serve) ist kein hoher Durchsatz des Systems zu erwarten, obwohl in diesem Fall das zuvor geschilderte Problem des „Verhungerns“ nicht auftritt. Größere Aufträge verhindern stets die Bearbeitung erfüllbarer kleinerer Aufträge, bis sie selbst erfüllt worden sind. Im Rahmen dieser Studienarbeit sollte, aufgrund eines möglichst geringen Rechen- und Speicherplatzbedarfs, auf eine einfache Warteschlangenstrategie zurückgegriffen werden. Deshalb wurden in dieser Arbeit lediglich zwei einfache Strategien berücksichtigt, die im folgenden vorgestellt werden. 2.3.2.1 Fenster-Strategie Bildlich gesprochen wird bei dieser Strategie ein Fenster über den Anfang der Warteschlange gelegt. Nur Aufträge innerhalb des Fensters werden bei einem Belegungsversuch auf ihre Erfüllbarkeit geprüft. Dabei gibt die Fenstergröße an, wie viele Aufträge vom Anfang der Warteschlange bei einem Belegungsversuch geprüft werden. Konnte der erste Auftrag innerhalb des Fensters nicht zugeordnet werden, wird das Fenster verkleinert, bis es im Extremfall die Größe eins besitzt wodurch bei jedem Belegungsversuch lediglich der erste Auftrag getestet wird. Es ist also sichergestellt, daß jeder erfüllbare Auftrag zugeordnet wird. Konnte der erste Auftrag erfüllt werden, wird das Fenster vergrößert, sofern es nicht bereits seine maximale Größe besitzt. Diese Vergrößerung des Fensters ist notwendig, um einen Zustand, in dem die Warteschlange nur wenige Aufträge bei einem Belegungsversuch testet, wieder zu verlassen. Folgende Faktoren könnten bei einer Realisierung frei gewählt werden: • Maximalgröße des Fensters • Dekrement der Fenstergröße • Inkrement der Fenstergröße 6 Wählt man eine maximale Fenstergröße von eins, dann entspricht die Fenster-Strategie dem Verfahren FCFS. momentanes Fenster Größe 3 Auftrag 1 maximales Fenster Größe 6 Auftrag 2 Auftrag 3 Auftrag 4 Auftrag 5 Auftrag 6 Auftrag 7 Auftrag 8 Abbildung 4: Auftragswarteschlange mit Fenster-Strategie 2.3.2.2 Zähler-Strategie Dieses Verfahren ist der zuvor beschriebenen Strategie ähnlich. Allerdings wird das Fenster durch einen Zähler pro wartenden Auftrag ersetzt. Der Zähler eines neu ankommenden Auftrags wird mit Null initialisiert. Analog zur Fenster-Strategie werden die Aufträge in der Reihenfolge ihres Auftretens berücksichtigt. Der Zähler eines Auftrages wird nach jedem erfolglosen Belegungsversuch erhöht. Erreicht der Zähler des ersten Auftrags eine zuvor festgelegte Grenze, so wird nur noch dieser Auftrag geprüft. Die Grenze kann als Toleranzgrenze angesehen werden. Das „Verhungern“ eines Auftrags ist demnach nicht möglich. Als variabler Faktor bei einer Realisierung kann lediglich der Toleranzgrenze frei gewählt werden. Als Vorteil gegenüber der Fenster-Strategie erscheint mir die Berücksichtigung aller in der Warteschlange stehenden Aufträge, falls die Toleranzgrenze des ersten Auftrags noch nicht erreicht wurde. Die Fenster-Strategie muß ankommende erfüllbare Aufträge in die Warteschlange einreihen, falls das Fenster bereits voll ist, obwohl kein Auftrag zu „verhungern“ droht. Es ist also im Normalfall mit einem höheren Durchsatz des Systems zu rechnen, als bei der Fenster-Strategie. Wird die Toleranzgrenze auf Null gesetzt, so entspricht dieses Verfahren dem Verfahren FCFS. 7 3 Systeminformationen Informationen über die Konfiguration und die Auslastung des Parallelrechners werden als Systeminformationen bezeichnet. Im Rahmen dieser Studienarbeit existieren zwei verschiedene Arten von Systeminformationen, statische und dynamische Informationen. Statische Systeminformationen betreffen im wesentlichen die Konfiguration des Parallelrechners. Als statische Informationen müssen in dieser Arbeit folgende Informationen berücksichtigt werden: • Anzahl der Prozessoren im Parallelrechner • Maximale Rechenlast pro Prozessor • Arbeitsspeicher pro Prozessor • Physikalische Verbindungen zwischen den Prozessoren • Maximale Kommunikationslast pro physikalischer Verbindung Dynamische Systeminformationen beschreiben die momentane, sich mit der Zeit ändernde Auslastung des Systems. Als dynamische Systeminformationen treten in dieser Arbeit folgende Informationen auf: • Rechenlast pro Prozessor • verfügbarer Arbeitsspeicher pro Prozessor • Kommunikationslast pro physikalischer Verbindung Um die von der Plazierungsinstanz erzeugte Rechenlast gering zu halten, muß die Beschaffung der Systeminformationen möglichst effizient erfolgen. Statische Informationen werden bereits bei Initialisierung der Plazierungsinstanz aufgebaut. Dynamische Systeminformationen werden bei jeder Änderung der Belegungssituation aufgefrischt. Das Auffrischen der dynamischen Systeminformationen sollte daher eine geringe Rechenlast und Kommunikationslast erzeugen. Maßgeblich für die Leistungsfähigkeit der gesamten Plazierungsinstanz ist die gute Zusammenarbeit zwischen der Verwaltung der Systeminformationen und der eigentlichen Plazierung. Das heißt, der Entwickler des Verwaltungsmoduls sollte bereits Kenntnisse über die später verwendeten Einplanungsstrategien besitzen, um die Zusammenarbeit mit der Plazierungsstrategie zu vereinfachen. In den nachfolgenden Kapiteln wird auf diese Zusammenarbeit noch ausführlicher eingegangen. 3.1 Lokale dynamische Systeminformationen Informationen über die Auslastung der Systemressourcen können von der Plazierungsinstanz lokal berechnet werden. In diesem Fall muß die Instanz die gesamte Plazierungsinformation aller laufenden Anwendungen protokollieren und daraus die momentanen Auslastungen berechnen. Die Tatsache, daß ein Programm beendet ist, wird der Plazierungsinstanz über den 8 Abwickler mitgeteilt. Daraufhin kann diese, mit Hilfe der protokollierten Plazierungen, die neuen Auslastungen ermitteln. Der Vorteil dieses Verfahrens ist die geringe Kommunikationslast zwischen dem Lastmonitor und der Plazierungsinstanz. Der größte Nachteil der Strategie ist die Ungenauigkeit der vorhandenen Lastdaten, die nur Schätzwerte darstellen oder eventuell überhaupt nicht vorhanden sind. Ebenfalls nachteilig erscheint die Tatsache, daß jede aktuelle Plazierung protokolliert werden muß, was zu einem beträchtlichen Speicherplatzbedarf führt. Hinzu kommt der erhöhte Aufwand bei der Suche innerhalb der Protokollstrukturen. Ein weiterer Nachteil liegt darin, daß jede Anwendung über die Plazierungsinstanz eingerichtet werden muß, um korrekte Auslastungsinformationen zu erhalten. 3.2 Dynamische Systeminformationen vom Lastmonitor Ein einfaches Verfahren empfängt bei jedem Belegungsversuch die Lastinformationen vom Lastmonitor. Vorteilhaft ist der geringere Speicherbedarf der Plazierungsinstanz, aufgrund der fehlenden Speicherung von Lastinformationen. Der hohe Kommunikationsaufwand mit dem Lastmonitor ist allerdings nicht akzeptabel, weshalb von einer genaueren Betrachtung dieses Verfahrens abgesehen wird. Eine weitere Strategie soll die Vorteile beider zuvor beschriebenen Verfahren vereinigen. Die ermittelten dynamischen Systeminformationen werden von der Plazierungsinstanz gespeichert und nur zu bestimmten Zeitpunkten beim Lastmonitor erfragt. Zu folgenden Ereignissen könnten solche Abfragen stattfinden: • eine bestimmte Zeitspanne ist seit der letzten Abfrage abgelaufen • eine Nachricht vom Abwickler über die Beendigung einer Anwendung wird empfangen • eine bestimmte Anzahl von Programmbeendigungen ist aufgetreten • eine bestimmte Anzahl von Plazierungen wurde durchgeführt • die Inaktivität des Systems wurde festgestellt Bei jeder Form der Abfrage der dynamischen Systeminformationen beim Lastmonitor wird eine gewisse Ungenauigkeit der Auslastungsinformationen toleriert. In diesem Punkt liegt meiner Meinung nach der größte Vorteil dieses Verfahrens. Die Systeminformationen werden nur erfragt, falls sie mit hoher Wahrscheinlichkeit entscheidende Ungenauigkeiten aufweisen. Dadurch werden die von der Instanz erzeugten Kommunikationslasten möglichst gering gehalten. 9 4 Plazierung In der Einleitung wurde bereits darauf eingegangen, daß auf die Entwicklung komplexer bzw. optimaler Plazierungsstrategien zugunsten einer flexiblen Dienstgeberinstanz verzichtet wurde. Die folgenden Abschnitte betrachten deshalb lediglich eine einfache Plazierungsstrategie. Tiefergehende Einblicke finden sich in [1]. 4.1 Plazierungsstrategien Bei der Plazierung paralleler Programme handelt es sich um ein NP-hartes Problem, das heißt nur mit Hilfe einer vollständigen Suche kann definitiv eine optimale Lösung gefunden werden. Eine vollständige Suche ist im allgemeinen mit einem sehr hohen Aufwand verbunden. Deshalb werden sogenannte heuristische Verfahren eingesetzt. Dabei wird die Ermittlung der Lösung durch eine gezielte Suche ersetzt, die jedoch auch in einem lokalen statt einem globalen Extremum hängen bleiben kann. Lösung := Anfangslösung Ja Ist die Suche beendet? Nein neue Lösung := modifizieren(Lösung) Ist die neue Lösung besser? Nein Ja Lösung := neue Lösung Abbildung 5: Programmablauf der heuristischen Suche Am dargestellten schematischen Algorithmus sind bereits die Probleme bei der Realisierung einer heuristischen Suche zu erkennen. Nachfolgend werden die offenen Fragen mit möglichen Antworten aufgelistet: − Welches Kriterium soll zur Terminierung der Hauptschleife gewählt werden? • Anzahl der Iterationen • Laufzeit des Algorithmus • Verschlechterungen der Lösung 10 − Wie sieht die Modifikation der Lösung aus? • Verschiebung von Prozessen auf andere Prozessoren − Nach welchen Kriterien werden die neue und die alte Lösung verglichen? • Gesamtlaufzeit des verteilten Programms • ausgeglichene Last auf allen Prozessoren • geringer Kommunikationsaufwand auf den Verbindungen 4.2 Plazierungsstrategien mit Partitionen Eine Familie von Plazierungsstrategien benutzt Partitionen zur Strukturierung der Prozeßmenge einer verteilten Anwendung. Initial bildet jeder Prozeß eine eigene Partition. Mehrere Partitionen können im Prozeß der Partitionierung zu einer größeren Partition zusammengefaßt werden. Jede Partition besitzt als Kommunikations- bzw. Rechenlast die Summe der Lasten seiner Elemente. Dabei werden Kommunikationen innerhalb einer Partition entweder gelöscht oder durch eine Erhöhung der Rechenlast der Partition berücksichtigt. Die Partitionierung ist beendet, wenn nur noch eine Partition vorhanden ist, die alle Prozesse enthält. Diese Partition wird auf einen Prozessor plaziert. Die Abbildung 6 stellt die nach der Partitionierung entstandene Struktur dar. Abbildung 7 veranschaulicht die Hierarchie von Partitionen, wobei an der vertikalen Anordnung der Partitionen die Reihenfolge ihrer Entstehung zu erkennen ist. Durch die Hierarchie ist eine strukturierte Bearbeitung der Plazierung möglich. Die Partitionen werden in umgekehrter Reihenfolge ihres Entstehens wieder aufgespalten. Dabei überprüft der Algorithmus, ob eine Verschiebung der Teilpartitionen der gerade gespaltenen Partition auf einen anderen Prozessor einen Gewinn bringt. Auf diese Weise werden die Prozesse auf die Prozessoren des Parallelrechners verteilt. Der Prozeß der Departitionierung ist beendet, falls alle zuvor erstellten Partitionen aufgespalten sind. Partition 3 Prozeß 5 Partition 2 Partition 1 Prozeß 2 Prozeß 4 Prozeß 6 Prozeß 3 Prozeß 1 Abbildung 6: Struktur von Partitionen 11 Partition 3 Prozeß 5 Partition 2 Prozeß 1 Prozeß 2 Partition 1 Prozeß 3 Prozeß 4 Prozeß 6 Abbildung 7: Hierarchie von Partitionen 5 Implementierung Die Plazierungsinstanz wurde unter dem Betriebssystem COSY in der Programmiersprache C implementiert. Am Institut für Betriebs- und Dialogsysteme der Universität Karlsruhe existiert für den Betrieb von COSY ein Transputersystem mit 32 Prozessoren. Der Arbeitsspeicher pro Prozessor beträgt 4 Megabyte. Jeder Prozessor besitzt 4 bidirektionale Verbindungen, mit deren Hilfe er mit seinen Nachbarn kommunizieren kann. Das Prozessornetzwerk ist momentan ausschließlich als Gitterstruktur aufgebaut, weshalb die Plazierungsinstanz unter anderen Topologien nicht getestet werden konnte. Ein Lastmonitor ist bereits implementiert, aber noch nicht für die Zusammenarbeit mit der Plazierungsinstanz modifiziert. Obwohl die Plazierungsinstanz schon für die Kooperation vorbereitet ist, mußten die Test ohne eine Anbindung an den Lastmonitor ausgeführt werden. Dies bedeutet, daß die Auslastungsinformation lediglich auf der Basis eigener Berechnungen verwaltet werden kann. Die Abwicklerinstanz wurde für die Zusammenarbeit mit der Plazierungsinstanz geändert. Vor dem Start eines parallelen Programms wird nun die Plazierungsinstanz mit der Plazierung der Prozesse beauftragt. Der Abwickler nimmt nach erfolgreicher Bearbeitung die Plazierungsinformation entgegen und erzeugt die Prozesse auf den ermittelten Prozessoren. Eine weitere Aufgabe des Abwicklers ist die Benachrichtigung der Plazierungsinstanz nach einer Änderung der Belegungssituation. 5.1 Dienstgeber Die Plazierungsinstanz empfängt Nachrichten von der Abwicklerinstanz und dem Lastmonitor. Zu jedem Auftrag für die Plazierungsinstanz gehört ein Kommunikationsgraph, der das zu plazierende Programm beschreibt. Der Kommunikationsgraph wird, ebenso wie die Lastinforma12 tionen, mit Hilfe von Nachrichten empfangen. Dabei könnte es aufgrund der begrenzten Paketgröße zu der Situation kommen, daß die Daten in mehrere Einzelnachrichten aufgeteilt werden müssen. Um die verschiedenen Arten von Nachrichten differenzieren zu können, sind ein Auftrags- und zwei Datenkanäle vorgesehen. Abbildung 8 zeigt die verschiedenen Nachrichten an die Plazierungsinstanz. Plazierungsinstanz Aufträge Auftragskanal AuslastungenDatenkanal Kommunikationsgraph Auslastungen KommunikationsgraphDatenkanal Abbildung 8: Nachrichten an den Dienstgeber Die Plazierungsinstanz bietet folgende Dienste an: • INSPECT_QUEUE: veranlaßt einen erneuten Belegungsversuch • PLACE_COMM_GRAPH: fordert die Plazierung eines Kommunikationsgraphen an • SET_STRATEGY: bestimmt den Plazierungsalgorithmus • SHUTDOWN: beendet die Plazierungsinstanz Es ist zu beachten, daß ein neuer Auftrag erst nach dem Bearbeiten des vorhergehenden Auftrags empfangen werden kann. Den Empfang des Kommunikationsgraphen bzw. der Auslastungsinformation an dem entsprechenden Datenkanal wird innerhalb der Bearbeitung des entsprechenden Auftrags abgewickelt. Im System können mehrere Abwickler vorhanden sein, die gleichzeitig einen Kommunikationsgraphen an die Plazierungsinstanz senden wollen. In diesem Fall ist die Plazierungsinstanz nicht mehr in der Lage die Datenpakete dem korrekten Kommunikationsgraphen zuzuordnen. Deshalb muß sichergestellt sein, daß ein Kommunikationsgraph an die Plazierungsinstanz erst gesendet wird, wenn keine anderen Abwickler Daten an den Datenkanal senden. Aus diesem Grund muß jeder Abwickler einen Auftrag zum Plazieren eines Programmes synchron an die Plazierungsinstanz senden. Durch den Empfang des Auftrags bestätigt die Plazierungsinstanz implizit die Verfügbarkeit des Datenkanals. Die Benachrichtigung zur Änderung der Bele13 gungssituation kann asynchron erfolgen, da keine weitere Kommunikation stattfinden muß. In den folgenden Abbildungen sind die Kommunikationsabläufe zwischen Plazierungsinstanz und Abwickler bzw. Plazierungsinstanz und Lastmonitor dargestellt. Abwickler Plazierungsinstanz send_syn(PLACE_COMM_GRAPH) receive_syn(PLACE_COMM_GRAPH) send_asyn(CommGraph) receive_syn(CommGraph) send_syn(NOTIFY_CONTROLLER) receive_syn(NOTIFY_CONTROLLER) send_asyn(PlaceInfo) receive_syn(PlaceInfo) Abbildung 9: Kommunikation zwischen Plazierungsinstanz und Abwickler Plazierungsinstanz Lastmonitor send_asyn(GET_SYS_LOADS) receive_syn(GET_SYS_LOADS) send_asyn(SystemLoads) receive_syn(SystemLoads) Abbildung 10: Kommunikation zwischen Plazierungsinstanz und Lastmonitor 5.1.1 Auftragswarteschlange Die Vor- bzw. Nachteile der Warteschlangenstrategien wurden bereits in Kapitel 2.3.2 diskutiert. Aufgrund des zu erwartenden höheren Durchsatzes wurde die Zähler-Strategie implementiert. Diese Wahl war nicht durch Tests begründet, sondern beruht lediglich auf der persönlichen Meinung des Autors. Die Warteschlange wurde als doppelt verkettete Liste implementiert. Dadurch ist das Entfernen eines Elements aus der Warteschlange effizienter zu realisieren. Ein Element der Warteschlange enthält außer den Zeigern zum Aufbau der Liste auch einen Zähler für die Anzahl der erfolglosen Plazierungsversuche und einen Zeiger auf den zugehörigen Kommunikationsgraphen. 14 Auftrag 1 Auftrag 2 Auftrag 3 . Zähler Kommunikationsgraph 1 Zähler Kommunikationsgraph 2 Zähler Kommunikationsgraph 3 Abbildung 11: Struktur der Warteschlange Die Toleranzgrenze ist als Konstante definiert. Es wäre möglich, im Sinne einer flexiblen Anpassung an die Systemverhältnisse, die Einstellung dieses Wertes während der Laufzeit vorzunehmen. In Abbildung 12 ist der Programmablauf beim Empfang eines neuen Auftrags dargestellt. Nachdem die Plazierungsinstanz den Kommunikationsgraphen empfangen hat, wird zuerst geprüft, ob der Zähler des ersten Elements die Toleranzgrenze überschritten hat. Ist dies nicht der Fall, dann folgt eine Prüfung auf Erfüllbarkeit der Anforderung. Kann der Auftrag plaziert werden, dann erhöht die Instanz die Zähler aller Aufträge in der Warteschlange. Andernfalls wird der Auftrag an die Warteschlange angefügt. receive_syn(PLACE_COMM_GRAPH) receive_syn(CommGraph) Toleranz des Ersten überschritten? Ja Nein paßt der CommGraph in das System? add_to_queue(CommGraph) Nein Ja place(CommGraph) add_to_queue(CommGraph) send_syn(NOTIFY_CONTROLLER) send_asyn(PlaceInfo) erhöhe Zähler aller Elemente in der Warteschlange Abbildung 12: Empfang eines neuen Auftrags 15 Abbildung 13 beschreibt den Programmablauf bei Änderung der Belegungssituation. Die Warteschlange muß nach Erhalten dieser Nachricht auf erfüllbare Aufträge durchsucht werden. Ist die Toleranzgrenze des ersten Auftrags überschritten, so wird nur dieser auf Erfüllbarkeit geprüft. Andernfalls prüft die Plazierungsinstanz alle Aufträge in der Warteschlange. Kann ein Auftrag plaziert werden, dann wird er aus der Warteschlange entfernt und die Plazierungsinformation an den Abwickler gesendet. receive_syn(INSPECT_QUEUE) send_asyn(GET_LOAD) receive_syn(SystemLoad) hole nächsten CommGraph aus der Warteschlange paßt der CommGraph in das System? Nein Ja remove_from_queue (CommGraph) erhöhe Zähler des Auftrags place(CommGraph) send_syn( NOTIFY_CONTROLLER) send_asyn(PlaceInfo) weiterer CommGraph in der Warteschlange und Toleranzwert nicht überschritten? Ja Nein Abbildung 13: Programmablauf bei Änderung der Belegungssituation 5.1.2 Unterstützung mehrerer Plazierungsstrategien Ein Entwurfsziel der Plazierungsinstanz ist die Unterstützung mehrerer Plazierungsstrategien. Aus diesen Strategien soll der Anwender zur Laufzeit auswählen können. Die zur Verfügung stehenden Strategien müssen zur Plazierungsinstanz gebunden werden. Ein Zeiger verweist auf die aktuell eingestellte Plazierungsfunktion. Dadurch wird ein Wechsel der Plazierungsfunktion 16 zur Laufzeit ermöglicht. Die Auswahl der Plazierungsstrategie zur Laufzeit geschieht mit Hilfe der Nachricht SET_STRATEGY. Diese Nachricht enthält einen zusätzlichen Parameter, mit dem die gewünschte Plazierungsfunktion angegeben wird. 5.2 Verwaltung der Systeminformationen Die Plazierungsinstanz erhält statische Systeminformationen entweder durch Konstanten innerhalb von Header-Dateien oder mit Hilfe von Systemaufrufen. Mit Hilfe von Systemaufrufen werden beim Initialisieren des Systems folgende Informationen ermittelt: • Anzahl der Prozessoren • Arbeitsspeicher pro Prozessor • Verbindungsstruktur des Prozessornetzwerks Die Lastinformationen werden als abstrakte Größen betrachtet. Der Abwickler und der Lastmonitor müssen lediglich für eine einheitliche Interpretation der Lastinformationen sorgen. Insbesondere müssen die Rechenlast und die Kommunikationslast vergleichbar sein. Maximal sind 65536 verschiedene Abstufungen möglich, da die Informationen in 16-Bit Variablen abgelegt sind. Die Anzahl der Prozessoren ist ebenfalls auf 65536 beschränkt. 5.2.1 Speicherung von Auslastungen Um die Kommunikation mit dem Lastmonitor so gering wie möglich zu halten, ist eine Speicherung der Lastinformationen innerhalb der Plazierungsinstanz vorgesehen, da diese Informationen zu noch unbestimmten Zeitpunkten beim Lastmonitor abgefragt werden. Die Datenstrukturen wurden als eindimensionale Felder implementiert. In Abbildung 14 sind diese Datenstrukturen dargestellt. Informationen, die den Arbeitsspeicher betreffen sind als 32-Bit Zahl ausgelegt und begrenzen damit den Arbeitsspeicher auf etwa 4 Gigabytes. Rechenlast Prozessor 1 Rechenlast Prozessor n freier Speicher Prozessor 1 freier Speicher Prozessor n Abbildung 14: Datenstrukturen zur Speicherung von Auslastungen 5.3 Departitionierungsstrategie Wie bereits einleitend erwähnt, sollte in dieser Arbeit lediglich eine einfache Plazierungsstrategie entworfen werden, die allerdings als Basis für zukünftige Entwicklungen dienen kann. Die 17 Wahl fiel auf eine Partitionierungsstrategie. Die Datenstrukturen zur Darstellung der Partitionshierarchie können als Basis komplexerer Partitionierungsstrategien verwendet werden. In den nächsten Abschnitten sollen die Implementierungen der benötigten Datenstrukturen und der Departitionierungsstrategie beschrieben werden. 5.3.1 Kommunikationsgraph Ein paralleles Programm ist in mehrere parallel arbeitende Prozesse aufgeteilt. Diese Prozesse bilden die Knoten des Kommunikationsgraphen. Das Gewicht der Knoten beinhaltet die Rechenlast und den Speicherbedarf des Prozesses. Es ist möglich, daß der Ausführungsort eines Prozesses bereits vor der Plazierung festliegt, z.B. weil er explizit durch den Programmierer festgelegt wurde. Eine solche fest vorgegebene Plazierung ist ebenfalls zusammen mit dem Knoten im Kommunikationsgraph gespeichert. Kommunikationen zwischen Prozessen werden als Kanten zwischen den Knoten dargestellt. Diese Kanten berücksichtigen die Kommunikationsrichtung und sind somit gerichtet. Das Gewicht der Kanten repräsentiert die erzeugte Kommunikationslast. Abbildung 15 zeigt schematisch die Darstellung eines Kommunikationsgraphen. Eine detaillierte Beschreibung ist in [7] zu finden. Knoten 1 Rechenlast: 212 Speicherbedarf: 10 KB Plazierung: Prozessor 7 Kommunikationslast: 170 Kommunikationslast: 1 Kommunikationslast: 25 Knoten 2 Rechenlast: 18 Speicherbedarf: 9 KB Plazierung: Prozessor 15 Kommunikationslast: 34 Knoten 3 Rechenlast: 124 Speicherbedarf: 145 KB Plazierung: Prozessor 3 Abbildung 15: Schematische Struktur des Kommunikationsgraphen Die Datenstrukturen zum Aufbau eines Kommunikationsgraphen in der Plazierungsinstanz wurden mit Blick auf einen geringen Speicherbedarf entworfen. Ein Kommunikationsgraph besteht aus einer Datenstruktur mit allgemeinen Informationen, einer Liste der Plazierungen, einer Liste zur Speicherung der Knoteninformationen und einer Liste zur Darstellung der Kanten. Die Plazierungs- und Knoteninformationen könnten zu einer Liste vereinigt werden. Die Aufteilung in zwei Listen bietet jedoch folgende Vorteile: • Das Versenden der Plazierungsinformation an den Abwickler ist einfacher. • Das Löschen der nicht weiter gebrauchten Informationen vor dem Versenden an den Abwickler ist einfacher. Es werden lediglich die allgemeinen und die Plazierungsinformationen benötigt. 18 Die Kanten zwischen Prozessen werden innerhalb der Kantenlisten gespeichert. Mit jedem Knoten ist eine Liste der Kanten, über die er selbst Nachrichten verschickt, verbunden. Das bedeutet im Falle einer bidirektionalen Kommunikation, daß beide beteiligte Prozesse eine Kante zu dem jeweilig anderen Prozeß besitzen. Die gerichtete Verbindungsstruktur zwischen den Knoten erfordert einen größeren Speicherplatz als eine ungerichtete Kommunikationsstruktur, könnte allerdings zu einer eventuell besseren Plazierung benötigt werden. Für die hier implementierte Plazierungsstrategie ist diese Information aber nicht notwendig. Abbildung 16 zeigt die Anordnung eines Kommunikationsgraphen im Arbeitsspeicher. Kennung des Ergebniskanals Plazierung Prozess 1 Anzahl der Knoten Plazierung Prozess 2 Summe der Rechenlasten gesamter Speicherbedarf Knoteninformation Knoten 1 Kennung des Auftragskanals des Abwicklers Rechenlast Plazierungsinformation Speicherbedarf Knoteninformation Anzahl Kanten Knoteninformation Knoten 2 Kantenliste Knoten 1 Kantenliste Knoten 2 Kantenlisten Knotennummer Kommunikationslast Knotennummer Kommunikationslast Knotennummer Kommunikationslast Knotennummer Kommunikationslast Abbildung 16: Datenstruktur des Kommunkationsgraphen 5.3.2 Struktur der Partitionen Zu Beginn bildet jeder Knoten im Kommunikationsgraph eine eigene einelementige Partition. Die hierarchische Partitionierung vereinigt jeweils zwei Partitionen zu einer neuen Partition. Zur Speicherung der Partitionen wird die Datenstruktur des Kommunikationsgraphen erweitert, um eine Partition genau wie ein Knoten behandeln zu können. Die Darstellung einer Partition erfordert allerdings zusätzliche Informationen, die innerhalb einer separaten Datenstruktur abgelegt sind. Neben den Partitionsnummern der beiden Vorfahren, wird ebenfalls die ungerichtete Kommunikationslast zwischen den zwei Vorfahren gespeichert. Abbildung 17 zeigt die 19 entsprechende Datenstruktur. Aus Speicherplatzgründen werden alle Datenstrukturen zur Speicherung der Partitionen nach jedem Plazierungsversuch gelöscht. ungerichtete Kommunikationslast zwischen den beiden Vorfahren hierarchische Partition 1 Partitionsnummer von Vorfahre 1 Partitionsnummer von Vorfahre 2 ungerichtete Kommunikationslast zwischen den beiden Vorfahren hierarchische Partition 2 Partitionsnummer von Vorfahre 1 Partitionsnummer von Vorfahre 2 Abbildung 17: Datenstruktur zur Speicherung der hierarchischen Partitionen 5.3.3 Partitionen-Baum Teil des Departitionierungsalgorithmus ist die Strukturierung der Knoten mit Hilfe von Partitionen. Danach wird eine Partitionenmenge erstellt, die alle noch nicht vorplazierten elementaren Partitionen enthält. Daraufhin werden jeweils zwei geeignete Partitionen zu einer neuen hierarchischen Partition vereinigt, bis nur noch eine Partition existiert. Diese enthält alle ursprünglichen Knoten des Kommunikationsgraphen. Beim Zusammenfassen zweier Partitionen ergeben sich folgende Merkmale für die Aktualisierung der Verbindungsstruktur: • Kanten zwischen den beiden zusammengefaßten Partitionen werden gelöscht • Kanten von anderen Partitionen zu den beiden Vorfahren werden auf die neue Partition gerichtet Den kompletten Algorithmus zur Erstellung des Partitionen-Baums zeigt Abbildung 18. In Abbildung 19 wird sein Verhalten an einem einfachen Beispielgraph aus vier Prozessen verdeutlicht. Die Partition mit der kleinsten Rechenlast und die von ihr ausgehende Kante mit der größten Kommunikationslast, die die Partition bestimmt, mit der eine Verschmelzung stattfindet, sind hervorgehoben dargestellt. 20 fülle Partitionenmenge mit allen nicht vorplazierten Partitionen P1 := Partition mit kleinster Rechenlast in der Partitionenmenge P2 := Partition in der Partitionenmenge mit größter Kommunikationslast mit P1 vereinige P1 und P2 zu P3 lösche P1 und P2 aus der Partitionenmenge und füge P3 ein aktualisiere Kantenlisten aller Partitionen in der Partitionenmenge mehr als eine Partition in der Partitionenmenge? Ja Nein Abbildung 18: Algorithmus zur Erstellung eines Partitionen-Baums 5.3.4 Behandlung von fest plazierten Knoten Ein Kommunikationsgraph kann fest plazierte Knoten enthalten, die von der Plazierungsinstanz nicht plaziert werden dürfen. Aus diesem Grund werden fest plazierte Knoten nicht in die Partitionenmenge aufgenommen. Vorplazierte Knoten werden nur bei der Suche nach dem geeigneten Startprozessor berücksichtigt. Der in Abschnitt 5.3.5 beschriebene Departitionierungsalgorithmus bestimmt den Startprozessor unter den Prozessoren, auf denen Prozesse gestartet werden müssen, als den Prozessor mit der geringsten Rechenlast. 21 Schritt 1: Partitionsnummer: 1 Rechenlast: 150 Speicherbedarf: 20 KB 400 200 300 Partitionsnummer: 2 Rechenlast: 200 Speicherbedarf: 9 KB Schritt 2: 400 Partitionsnummer: 5 Rechenlast: 1050 Speicherbedarf: 70 KB Vorfahre 1: 4 Vorfahre 2: 1 K- Last: 400 200 Schritt 4: 200 Partitionsnummer: 3 Rechenlast: 250 Speicherbedarf: 7 KB Partitionsnummer: 3 Rechenlast: 250 Speicherbedarf: 7 KB 400 500 Schritt 3: Partitionsnummer: 4 Rechenlast: 900 Speicherbedarf: 50 KB Partitionsnummer: 6 Rechenlast: 1250 Speicherbedarf: 79 KB Vorfahre 1: 5 Vorfahre 2: 2 K- Last: 500 600 Partitionsnummer: 2 Rechenlast: 200 Speicherbedarf: 9 KB Partitionsnummer: 3 Rechenlast: 250 Speicherbedarf: 7 KB Partitionsnummer: 7 Rechenlast: 1500 Speicherbedarf: 86 KB Vorfahre 1: 6 Vorfahre 2: 3 K- Last: 600 Abbildung 19: Ablauf für einen Beispielgraph aus vier Prozessen 22 5.3.5 Departitionierung Die Departitionierung spaltet die zuvor erstellten Partitionen auf und versucht, die Teilpartitionen auf geeignete Nachbarprozessoren zu verschieben. Durch diesen Vorgang werden die Partitionen auf den Prozessoren des Systems verteilt. Im ersten Schritt versucht der Algorithmus einen geeigneten Startprozessor für die Plazierung der Wurzelpartition zu finden. Der Startprozessor ist entweder der Prozessor im System mit der geringsten Rechenlast oder der Prozessor einer Vorplazierung mit der geringsten Rechenlast. Ist der Startprozessor gefunden, so wird die erste, alle Prozesse umfassende Partition darauf plaziert. Im nächsten Schritt spaltet der Algorithmus die Partition entsprechend der Partitionierungshierarchie und prüft zunächst die Verschiebung der größeren, danach die der kleineren Teilpartition auf einen geeigneten Nachbarprozessor. Der Nachbarprozessor mit der geringsten Rechenlast ist der geeignete Prozessor für die Verschiebung. Der Effekt der Verschiebung wird anhand einer Gütefunktion beurteilt. Diese Form einer Gütefunktion ist nur möglich, wenn eine Vergleichbarkeit der Werte für die Kommunikationslast und die Rechenlast sichergestellt ist. 1 P = zu verschiebende Partition 2 Proz1 = Prozessor, auf dem die Partition momentan plaziert ist 3 Proz2 = Nachbarprozessor 4 RL(x) = Rechenlast auf Prozessor x 5 P_KL(x) = Kommunikationslast zwischen den Vorfahren der Partition x 6 7 G(P, Proz1, Proz2) := ( RL(Proz1) - RL(Proz2) ) - P_KL(P) Liefert die Gütefunktion einen Wert größer als Null, so entscheidet sich der Algorithmus für eine Verschiebung. Ansonsten bleibt die Partition auf dem momentanen Prozessor. Der Algorithmus ist beendet, sobald nur noch einelementige Partitionen existieren. Danach folgt eine Überprüfung der ermittelten Plazierung. Diese ist notwendig, da der Algorithmus an keiner Stelle prüft, ob genügend Ressourcen auf den gewählten Prozessoren zur Verfügung stehen. Liefert diese Prüfung ein negatives Ergebnis, dann wird die gesamte Plazierung verworfen und der Auftrag in die Warteschlange des Dienstgebers zurückgestellt. Der folgende schematische Programmablauf soll die Arbeitsweise des Algorithmus verdeutlichen. 1 bestimme Startprozessor 2 plaziere erste Partition auf den Startprozessor 3 While (Partitionshierarchie nicht komplett abgearbeitet) do 4 P = nächste Partition entsprechend der Partitionshierarchie 5 spalte Partition P 6 P1 := Teilpartition von P mit größerer Rechenlast 7 P2 := Teilpartition von P mit kleinerer Rechenlast 8 Proz1 := momentane Plazierung von P 9 Proz2 := Nachbarprozessor von Proz1 mit kleinster Rechenlast 10 If G(P1, Proz2, Proz1) > 0 11 plaziere P1 auf Proz2 23 then 12 Proz2 := Nachbarprozessor von Proz1 mit kleinster Rechenlast 13 endIf 14 If G(P2, Proz2, Proz1) > 0 then 15 plaziere P2 auf Proz2 16 endIf 17 endDo 18 überprüfe ermittelte Plazierung 5.4 Meßergebnisse Die Plazierung eines Programms erfordert einen hohen Rechenaufwand. Um den Aufwand der einzelnen Schritte des Algorithmus zu erkennen, wurden Messungen durchgeführt. Die Laufzeiten des Algorithmus wurden ermittelt, indem das Modul mit geeignet plazierten Zeitabfragen versehen wurde. Die Systemaufrufe zur Abfrage der aktuellen Zeit benötigen ebenfalls Rechenzeit, die in Relation zur Laufzeit des Algorithmus aber vernachlässigt werden kann. Die Messungen wurden nur in Abhängigkeit der Knotenanzahl im Kommunikationsgraph durchgeführt. Der dabei verwendete Kommunikationsgraph mit n Knoten besteht aus einem Senderprozeß, einem Gruppenrufkanal und n-1 Empfängerprozessen. Der Verlauf der gemessenen Zeiten ist in Abbildung 20 graphisch dargestellt. 90 Departitionierung Berechnung des PartitionenBaums 80 70 Sekunden 60 50 40 30 20 10 0 0 100 200 300 400 500 600 700 Knoten im Kommunikationsgraph 24 800 900 1000 90 80 erstelle Kantenliste 70 auffrischen der Kantenlisten ermittle Kommunikationspartner finde kleinste Partition Sekunden 60 50 40 30 20 10 0 0 100 200 300 400 500 600 700 800 900 1000 Knoten im Kommunikationsgraph Abbildung 20: Algorithmuslaufzeiten Aus den Grafiken läßt sich erkennen, daß der Plazierungsalgorithmus einen Aufwand besitzt, der mit steigender Knotenanzahl quadratisch wächst. Der Aufwand des Plazierungsalgorithmus ist hauptsächlich von der Funktion ermittle Kommunikationspartner abhängig. Diese Funktion wird für jede Partition ausgeführt und durchsucht bei jedem Aufruf die Kantenlisten aller Knoten im Kommunikationsgraph. Der Aufwand der Funktion ermittle Kommunikationspartner beträgt: O[ (Anzahl Knoten) * (Anzahl Kanten) ] Eine Laufzeit im Bereich weniger Sekunden läßt sich tolerieren. Allerdings tritt beim Start eines Programmes mit 500 Knoten bereits eine Verzögerung von etwa 17 Sekunden auf. Es besteht also die begründete Notwendigkeit, nach schnelleren und besseren Plazierungsstrategien zu suchen. 6 Zusammenfassung Diese Studienarbeit befaßt sich mit der Plazierung paralleler Programme unter COSY. Im Verlauf dieser Arbeit wurde ein Rahmenwerk für Plazierungsstrategien entwickelt. Die Plazierungsinstanz ist als Dienstgeber realisiert. Der Auftrag zur Plazierung einer verteilten parallelen Anwendung enthält eine Beschreibung des Programms in Form eines Kommunikationsgraphen. Die Plazierungsinstanz ermittelt mit Hilfe des Kommunikationsgraphen die Plazierungsinformation. Der Abwickler erhält die Plazierungsinformation und richtet die Programme auf den entsprechenden Prozessoren ein. Der Dienstgeber kann mehrere Plazierungsstrategien verwalten und stellt dem Anwender die Möglichkeit zur Verfügung, eine Strategie zur Laufzeit auszuwählen. Die Einbindung in das 25 System konnte im Rahmen dieser Studienarbeit nicht vollends realisiert werden, da sich die kooperierenden Instanzen entweder im Entwicklungsstadium befinden oder noch nicht entsprechend modifiziert wurden. Die realisierte Plazierungsstrategie gehört zu den sogenannten Partitionierungsverfahren. Die Plazierungsstrategie berücksichtigt auf einfache Weise vorplazierte Knoten im Kommunikationsgraph. Sie ist keinesfalls optimal, sondern lediglich als Grundlage zukünftiger Algorithmen gedacht. 6.1 Ausblick Aufbauend auf der vorliegenden Arbeit sollten neue Plazierungsstrategien entworfen werden, die eine möglichst optimale Plazierung berechnen. Diese werden zusammen mit den bisherigen Strategien in den Dienstgeber integriert. Die Möglichkeit zur Umschaltung der Plazierungsstrategie kann zum Vergleich der Plazierungsgüte verwendet werden. In Zukunft bleibt zu überprüfen, ob eine zentrale Plazierungsinstanz den Anforderungen in einem Parallelrechner gewachsen ist oder ob die Plazierung verteilt realisiert werden sollte. 26 Literatur [1] H.-U. Heiss, Prozessorzuteilung in Parallelrechnern, Band 98, BI Wissenschaftsverlag, 1994. [2] T. Ottmann, P. Widmayer, Algorithmen und Datenstrukturen, Band 70, BI Wissenschaftsverlag, 1993. [3] G. Sagar, A. K. Sarje, Task allocation model for distributed systems, Int. J. Systems Science., Vol. 22, No. 9, 1991. [4] V. A. Dixit-Radiya, D. K. Panda, Clustering and Intra-Processor Scheduling for Explicitly-Parallel Programs on Distributed-Memory Systems, Int. Prallel Processing Symposium, 1994. [5] G. C. Sih, E. A. Lee, Declustering: A New Multiprocessor Scheduling Technique, Transactions on Parallel and Distributed Systems, Vol. 4, No. 6, June 1993. [6] H. Wettstein, Systemarchitektur, Hanser Verlag, 1993. [7] M. Wagner, Interpretation paralleler Programme in Cosy, Studienarbeit am Institut für Betriebs- und Dialogsysteme, 1995. [8] R. Buthenuth, The COSY-Kernel as an Example for Efficient Kernel Call Mechanisms on Transputers, Transputer/Occam Japan 6, IOS Press, S. 89-101, Juli 1994. [9] R. Buthenuth, S. Gilles, COSY - ein Betriebssystem für hochparallele Computer, TAT ‘94, Aachen, S. 119-128, 1994. 27