DE112012002905B4 - Technik zum Kompilieren und Ausführen von Programmen in höheren Programmiersprachen auf heterogenen Computern - Google Patents

Technik zum Kompilieren und Ausführen von Programmen in höheren Programmiersprachen auf heterogenen Computern Download PDF

Info

Publication number
DE112012002905B4
DE112012002905B4 DE112012002905.4T DE112012002905T DE112012002905B4 DE 112012002905 B4 DE112012002905 B4 DE 112012002905B4 DE 112012002905 T DE112012002905 T DE 112012002905T DE 112012002905 B4 DE112012002905 B4 DE 112012002905B4
Authority
DE
Germany
Prior art keywords
executable
logical
entities
program
executable entities
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
DE112012002905.4T
Other languages
English (en)
Other versions
DE112012002905T5 (de
Inventor
Joshua S. Auerbach
David F. Bacon
Perry S. CHENG
Rodric Rabbah
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of DE112012002905T5 publication Critical patent/DE112012002905T5/de
Application granted granted Critical
Publication of DE112012002905B4 publication Critical patent/DE112012002905B4/de
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456Parallelism detection

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

Eine Technik zum Kompilieren und Ausführen von Programmen in höheren Programmiersprachen auf heterogenen Computern kann beinhalten: Partitionieren eines Programmcodes in zwei oder mehr logische Einheiten und Kompilieren jeder der logischen Einheiten in eine oder mehrere ausführbare Entitäten. Mindestens einige der logischen Einheiten werden in zwei oder mehrere ausführbare Entitäten kompiliert, wobei es sich bei den beiden oder mehreren ausführbaren Entitäten um verschiedene Kompilierungen ein und derselben logischen Einheit handelt. Die beiden oder mehreren ausführbaren Einheiten sind mit zwei oder mehr entsprechenden Plattformen mit unterschiedlichen Architekturen kompatibel, auf denen sie ausgeführt werden.

Description

  • GEBIET
  • Die vorliegende Anmeldung betrifft allgemein Computer und Anwendungen und insbesondere eine Technik zum Kompilieren und Ausführen von Programmen auf heterogenen Computern oder Prozessoren.
  • HINTERGRUND
  • Der Mix von Datenverarbeitungselementen, aus denen ein Computer besteht, wird immer heterogener. Bereits heutzutage verknüpfen Computer einen herkömmlichen Prozessor (z.B. eine Zentraleinheit (CPU)) mit einer Grafikprozessoreinheit (GPU), und das Bestreben nimmt zu, die GPU bei bestimmten Problemen wegen ihrer außerordentlichen Datenverarbeitungsfähigkeiten nicht nur zur Grafikverarbeitung zu verwenden. In dieser Beziehung ist ein Computer mit einer CPU und einer GPU heterogen, da er ein spezialisiertes Datenverarbeitungselement (die GPU) für Datenverarbeitungs-Tasks, die seiner Architektur angemessen sind, und ein echt universelles Datenverarbeitungselement (die CPU) für alle anderen Tasks bereitstellt (darunter bei Bedarf z.B. die Datenverarbeitungs-Tasks, die für die GPU bestens geeignet sind). Die GPU stellt ein Beispiel für einen Hardwarebeschleuniger dar. Außer GPUs gewinnen weitere Formen von Hardwarebeschleunigern größere Beachtung, und es gibt bereits Beispiele von Beschleunigern in der Form von anwenderprogrammierbaren Gate-Arrays (FPGAs) und Beschleunigern mit fest vorgegebener Funktion für Kryptografie, für XML-Parsing, Vergleichen normaler Ausdrücke, physikalische Steuerprogramme und so weiter.
  • Es gibt jeweils getrennte Programmiertechnologien für CPUs, GPUs, FPGAs und verschiedene Beschleuniger. Zum Beispiel kommen für einen GPU als Programmiersprachen OpenMP, CUDA und OpenCL infrage, die sämtlich als Erweiterungen der Programmiersprache C angesehen werden können. Ein GPUspezifischer Compiler gibt ein in einer dieser Sprachen geschriebenes Programm ein und unterzieht das Programm einer Vorverarbeitung, um den (im Folgenden als Einheitencode bezeichneten) GPU-spezifischen Code vom übrigen (im Folgenden als Hostcode bezeichneten) Programmcode abzutrennen. Der Einheitencode wird üblicherweise am Vorkommen eindeutiger einheitenspezifischer Spracherweiterungen oder Compiler-Anweisungen (z.B. Pragma) oder einer Syntax (z.B. Kernelstart mit «<...»> in CUDA) erkannt. Der Einheitencode wird ferner in einen (im Folgenden als Artefakt bezeichneten) einheitenspezifischen Maschinencode übersetzt und kompiliert. Der Hostcode wird als Teil des Kompilierungsprozesses geändert, um das Einheitenartefakt aufzurufen, wenn das Programm ausgeführt wird. Das Einheitenartefakt kann entweder in den Host-Maschinencode eingebettet sein oder in einem Archiv vorliegen und durch eine eindeutige Kennung erkannt werden, die Teil des Aufrufprozesses ist.
  • Programmiersprachen und Lösungen für heterogene Computer, die ein FPGA enthalten, sind GPU-Programmierlösungen vergleichbar, obwohl FPGAs noch nicht von den Vorteilen eines weitverbreiteten C-Dialekts profitieren. Für die Programmiersprache C gibt es diverse durch die verschiedenen Anbieter von FPGA-Technologie angebotene Erweiterungen, die im Allgemeinen sämtlich den Code in einer Weise kompilieren, wie sie bei den Compilern für GPUs üblich ist: der Compiler partitioniert das Programm in Einheiten- (FPGA-) Code und Hostcode, die jeweils einzeln kompiliert werden, und der Hostcode wird geändert, um das Einheitenartefakt aufzurufen.
  • Trotz des heterogenen Mixes von Datenverarbeitungselementen in einem Computer ist der Programmierprozess bis heute im Allgemeinen ähnlich und weist die folgenden gemeinsamen Eigenschaften auf. Erstens ist es für einen einzelnen Programmierer oder ein Team von Programmierern aufgrund der verschiedenen Sprachen oder Dialekte, in denen verschiedene Architekturen programmiert werden müssen, schwer, alle Aspekte eines Projekt gleich gut herauszuarbeiten. Zweitens wird der Parallelausführung, d.h. der Steuerung einer Programmausführung unter Verwendung mehrerer verschiedener Datenverarbeitungselemente, die nahtlos zusammenarbeiten, bisher nur geringe Aufmerksamkeit gewidmet. Hierfür ist es erforderlich, ein Programm in Tasks zu partitionieren, die den Datenverarbeitungselementen zugeordnet werden können, Tasks den Datenverarbeitungselementen zuzuordnen oder zeitlich zu steuern und die Datenübertragung zwischen Datenverarbeitungselementen zu steuern, was an sich schon voraussetzt, dass Daten serialisiert und zur Übertragung vorbereitet, Daten zwischen Prozessoren weitergeleitet und Daten empfangen und deserialisiert müssen. Angesichts der mit dem Organisieren der Ausführung eines Programms auf einem heterogenen Computer verbundenen Komplexitäten muss sehr zeitig eine unverrückbare Entscheidung darüber getroffen werden, was wann ausgeführt werden soll, die im Verlauf des Projekts nur schwer und unter hohem Aufwand revidiert werden kann. Das wird zusätzlich noch dadurch erschwert, dass einige der Beschleuniger, zum Beispiel FPGAs, sich nur schwer programmieren lassen und von den Programmierern einen hohen Einfallsreichtum verlangen.
  • KURZDARSTELLUNG
  • Ein Verfahren zum Ausführen einer oder mehrerer Anwendungen kann gemäß einem Aspekt automatisches Partitionieren eines Programmcodes in zwei oder mehr logische Einheiten durch einen Programm-Compiler; und
  • Kompilieren jeder der logischen Einheiten in eine oder mehrere ausführbare Entitäten beinhalten, wobei mindestens einige der logischen Einheiten in zwei oder mehr ausführbare Entitäten kompiliert werden und es sich bei den beiden oder mehreren ausführbaren Entitäten um verschiedene maschinenspezifische Kompilierungen ein und derselben logischen Einheit handelt.
  • Gemäß einem weiteren Aspekt kann ein Verfahren zum Ausführen einer oder mehrerer Anwendungen beinhalten: Ermitteln, welche eine oder mehreren Plattformen zur Programmausführung verfügbar sind; Festlegen einer logischen Einheit zum Ausführen an jedem vorbestimmten Punkt des Programmcodes und Auswählen einer oder mehrerer ausführbarer Entitäten, die der festgelegten logischen Einheit zugehörig sind und mit der einen oder den mehreren als verfügbar ermittelten Plattformen kompatibel sind; und Verteilen der einen oder der mehreren ausgewählten ausführbaren Entitäten auf die jeweils eine oder mehreren als verfügbar ermittelten Plattformen.
  • Ein System zum Ausführen einer oder mehreren Anwendungen kann gemäß einem Aspekt ein Compiler-Modul beinhalten, das zum Partitionieren eines Programmcodes in zwei oder mehr logische Einheiten und zum Kompilieren jeder der logischen Einheiten in eine oder mehrere ausführbare Entitäten dient. Zumindest einige der logischen Einheiten können in zwei oder mehr ausführbare Entitäten kompiliert werden. Bei den beiden oder mehreren ausführbaren Entitäten kann es sich um verschiedene maschinenspezifische Kompilierungen ein und derselben logischen Einheit handeln. Ein Laufzeitmodul kann dazu dienen zu ermitteln, welche eine oder mehreren Plattformen zur Programmausführung verfügbar sind. An jedem vorbestimmten Punkt des Programmcodes kann das Laufzeitmodul ferner dazu dienen, eine logische Einheit zum Ausführen festzulegen. Das Laufzeitmodul kann ferner dazu dienen, eine oder mehrere ausführbare Entitäten auszuwählen, die der festgelegten logischen Einheit zugehörig sind und mit der einen oder den mehreren als verfügbar ermittelten Plattformen kompatibel sind.
  • Auch eine Schaltung kann bereitgestellt werden, in der auf einer Maschine auszuführende Anweisungen integriert sind, wobei die Anweisungen die hierin beschriebenen Verfahren beinhalten.
  • Weitere Merkmale sowie die Struktur und die Funktionsweise verschiedener Ausführungsformen werden im Folgenden unter Bezugnahme auf die beiliegenden Zeichnungen ausführlich beschrieben. In den Zeichnungen zeigen gleiche Bezugsnummern identische oder funktionell ähnliche Elemente an.
  • Figurenliste
    • 1 ist ein Schaubild, das die Verfahrensweise eines Compiler- und Laufzeitsystems der vorliegenden Offenbarung gemäß einer Ausführungsform veranschaulicht.
    • 2 ist ein Auflaufplan, der ein Compiler-Verfahren gemäß einer Ausführungsform der vorliegenden Offenbarung veranschaulicht.
    • 3 ist ein Ablaufplan, der ein Laufzeitverfahren gemäß einer Ausführungsform der vorliegenden Offenbarung veranschaulicht.
    • 4 ist ein beispielhafter Überblick über die Kompilier- und Laufzeitarchitektur der vorliegenden Offenbarung gemäß einer Ausführungsform.
    • 5 zeigt beispielhafte Systeme gemäß einer Ausführungsform der vorliegenden Offenbarung, auf denen die Compiler-Infrastruktur und/oder das Laufzeitsystem ausgeführt werden können.
  • DETAILLIERTE BESCHREIBUNG
  • In der vorliegenden Offenbarung werden Prozesse zum Kompilieren einer Anwendung beschrieben, die auf verschiedenen Prozessoren ausgeführt werden soll, zum Beispiel auf einem heterogenen Computer mit zwei oder mehr Prozessoren mit unterschiedlicher Ausführungsarchitektur, der auch als Hybridcomputer bezeichnet wird. Auch ein Laufzeitprozess kann bereitgestellt werden, der die kompilierten Komponenten auswählt, auf die betreffenden Prozessoren verteilt und auf diesen ausführt. Gemäß einem Aspekt kann eine Verfahrensweise der vorliegenden Offenbarung ein Kompilieren einer einzelnen Quellensprache zum gleichzeitigen Ausführen auf einem heterogenen Computer ermöglichen und bedient sich Kompilierungs- und/oder Laufzeittechniken, die die Probleme der frühzeitigen Partitionierung und der gleichzeitigen Ausführung bewältigen, wie sie bei derzeit vorhandenen Lösungen auftreten. Zum Beispiel kann ein Host-Compiler das gesamte Programm bearbeiten - das möglicherweise in einer einzelnen Quellensprache geschrieben sein kann - und maschinenspezifischen Code zum Ausführen des Programms auf der CPU eines Universalcomputers erzeugen. Außerdem kann es einer beliebigen Anzahl einheitenspezifischer Compiler gestattet sein, ebenfalls das gesamte Programm zu bearbeiten, und jeder dieser Compiler kann sich für das Erzeugen eines einheitenspezifischen Codes entscheiden, der von den durch die anderen Einheiten-Compiler getroffenen Auswahlen unabhängig ist.
  • Auf diese Weise kann die Verfahrensweise der vorliegenden Offenbarung das Problem des einmaligen Vorverarbeitens und Partitionierens eines Programms (in Host- und Einheitencodes) lösen, da sie verschiedenen Compilern gestattet, funktionell gleichwertige maschinenspezifische Implementierungen ein und desselben Quellcodes zu kompilieren und zu erzeugen. Sicher ist, dass mindestens einer der Compiler (für gewöhnlich der Host-Compiler) Code für alle Teile eines Programms erzeugt. Ein oder mehrere Compiler können Code für Teilbereiche des eingegebenen Programms erzeugen. Da Einheiten-Compiler im Allgemeinen stärkeren Einschränkungen unterliegen als Host-Compiler, können die Einheiten-Compiler zum Beispiel (auch als ausführbare Entitäten oder Artefakte bezeichnete) ausführbare Funktionen für Teilbereiche des eingegebenen Programms erzeugen. Somit können gemäß einer Ausführungsform der vorliegenden Offenbarung mehrere Compiler ausführbare Entitäten (Artefakte) für ein eingegebenes Programm erzeugen, und jeder einzelne Compiler kann mehrere ausführbare Entitäten (Artefakte) für dasselbe Programm erzeugen, die zum Beispiel verschiedenen Partitionen oder Teilbereichen des Programms entsprechen.
  • Gemäß einem anderen Aspekt wird in der vorliegenden Offenbarung auch eine Technik zum Korrelieren derselben mit verschiedenen Compilern kompilierten Programmteile unter Verwendung eines Systems eindeutiger Kennungen beschrieben, mit dem sichergestellt wird, dass dieselben mit verschiedenen Compilern kompilierten Teile eines Programms immer ein und dieselbe Kennung erzeugen. Zum Beispiel wird gemäß einer Ausführungsform einer Verfahrensweise der vorliegenden Offenbarung jedes Artefakt unter Verwendung seiner entsprechenden Kennung markiert und in einem Artefaktspeicher gespeichert, der gemäß dem gewünschten Satz von Einheiten in dem Computer organisiert ist. Der Artefaktspeicher kann als Datenablage für alle durch die verschiedenen Compiler erzeugten Artefakte handeln. Gemäß einer Ausführungsform wird ein Artefakt unter Verwendung eines Paars von Schlüsseln von dem Speicher abgerufen: ein Schlüssel kennzeichnet die gewünschte Einheit und ein zweiter Schlüssel kennzeichnet das einzigartige Artefakt. Zum Beispiel kennzeichnet der erste Schlüssel die gewünschte Einheit, und bei dem zweiten Schlüssel handelt es sich um die Kennung für das einzigartige Artefakt. Die Reihenfolge der Schlüssel ist unwichtig. Wenn das Artefakt vorhanden ist, wird es abgerufen; andernfalls wird eine Fehleranzeige zurückgegeben.
  • Gemäß einer Ausführungsform der vorliegenden Offenbarung wird der Artefaktspeicher durch eine in dieser Offenbarung im Folgenden beschriebene Laufzeitschicht verwendet, um ein Programm dynamisch zu partitionieren. Während ein Programm ausgeführt wird sowie anlässlich vorgegebener Ereignisse während der Ausführung (die für gewöhnlich, aber nicht unbedingt, durch die Semantik der Quellensprache des Programms vorgegeben sind), kann während der Laufzeit der Artefaktspeicher durchsucht werden, um den Satz von Artefakten herauszusuchen, die einen folgenden Teil der Programmausführung umsetzen. Während der Laufzeit können heuristische Methoden zum Auswählen eines neuen Artefakts angewendet werden, das anstelle des standardmäßigen Artefakts ausgeführt werden soll. Somit braucht nicht der standardmäßige Hostcode ausgeführt zu werden, sondern während der Laufzeit kann dynamisch ein anderes Einheitenartefakt geladen werden, das an dessen Stelle ausgeführt wird. Auf diese Weise können während der Laufzeit viele verschiedene Programmpartitionen bearbeitet werden, wenn ein Programm auf einem heterogenen Computer ausgeführt wird.
  • 1 veranschaulicht eine Compiler- und Laufzeitverfahrensweise gemäß einer Ausführungsform der vorliegenden Offenbarung mit einer beispielhaften Software/Hardware-Konfiguration. Eine Kompilierungstechnik gemäß einer Ausführungsform der vorliegenden Offenbarung kompiliert zum Beispiel eine einzelne Quellensprache 102, die gleichzeitig auf einem heterogenen Computer 104 ausgeführt werden soll. Ein gezeigter beispielhafter Hybridcomputer 104 enthält eine Anzahl verschiedener Prozessortypen, eine CPU 126, eine GPU 128, ein FPGA 130, ein XML 132 und eine weitere anwendungsspezifische integrierte Schaltung (ASIC) 134. Ein Host-Compiler 106 kann einen ausführbaren Code oder eine ausführbare Entität 116 erzeugen, die geeignet ist, auf einer CPU 104 ausgeführt zu werden. Außerdem kann ein GPU-Compiler 108 denselben Quellcode 102 bearbeiten und eine ausführbare Entität oder einen ausführbaren Code 118 erzeugen, der geeignet ist, auf dem GPU 128 ausgeführt zu werden; ein FPGA-Compiler 110 kann denselben Quellcode 102 bearbeiten und eine ausführbare Entität oder einen ausführbaren Code 120 erzeugen, der geeignet ist, auf dem FPGA 130 ausgeführt zu werden; ein XML-Compiler 112 kann denselben Quellcode 102 bearbeiten und eine ausführbare Entität oder einen ausführbaren Code 122 erzeugen, der geeignet ist auf dem XML-Processor 132 ausgeführt zu werden; ein weiterer Compiler 114 kann denselben Quellcode 102 bearbeiten und eine ausführbare Entität oder einen ausführbaren Code 124 erzeugen, der geeignet ist, auf einem anderen Spezialprozessor oder einer anwendungsspezifischen integrierten Schaltung (ASIC) ausgeführt zu werden.
  • Sicher ist, dass mindestens einer der Compiler (für gewöhnlich der Host-Compiler, z.B. 106) Code für alle Teile eines Programms 102 erzeugt. Ein oder mehrere Compiler können Code für Teilbereiche des eingegebenen Programms 102 erzeugen. Somit können gemäß einer Ausführungsform der vorliegenden Offenbarung mehrere Compiler 106, 108, 110, 112, 114 ausführbare Entitäten (Artefakte) 116, 118, 120, 122, 124 für ein eingegebenes Programm 102 erzeugen, und jeder Compiler kann mehrere ausführbare Entitäten (Artefakte) für dasselbe Programm erzeugen, die zum Beispiel verschiedenen Partitionen oder Teilbereichen des Programms entsprechen. Die erzeugten ausführbaren Entitäten 116, 118, 120, 122, 124 können in einem Artefaktspeicher 136 gespeichert werden, zum Beispiel als Datenbank oder in einem anderen Format, im Arbeitsspeicher und/oder in einer permanenten Speichereinheit. Während der Laufzeit (z.B. wenn das Programm auf dem Computer 104 ausgeführt wird), ermittelt ein Laufzeitprozess 138 die Typen der Prozessoren 126, 128, 130, 132, 134, die auf dem Computer zum Ausführen eines Programms verfügbar sind, wählt eine oder mehrere ausführbare Entitäten aus dem Artefaktspeicher 136 aus und führt diese auf der Grundlage der Verfügbarkeit der Prozessoren auf dem Computer 104 aus. Somit können in Abhängigkeit von der Prozessorkonfiguration des Computers verschiedene ausführbare Entitäten ausgewählt, auf die betreffenden Prozessoren verteilt und durch diese ausgeführt werden.
  • 2 ist ein Ablaufplan, der ein Kompilierverfahren gemäß einer Ausführungsform der vorliegenden Offenbarung veranschaulicht. In Schritt 202 partitioniert ein Compiler einen Programmcode in zwei oder mehrere logische Einheiten.
  • In Schritt 204 kompiliert der Compiler jede der logischen Einheiten in eine oder mehrere ausführbare Entitäten. Mindestens einige der logischen Einheiten können in zwei oder mehr ausführbare Entitäten kompiliert werden, bei denen es sich um verschiedene maschinenspezifische Kompilierungen ein und derselben logischen Einheit handelt. In Schritt 206 können den ausführbaren Entitäten entsprechende Kennungen zugewiesen werden. Einer oder mehreren ausführbaren Entitäten, die jeder logischen Einheit entsprechen, wird eine eindeutige Kennung zugewiesen. Somit wird zwei oder mehr ausführbaren Entitäten, die derselben logischen Einheit entsprechen, ein und dieselbe Kennung zugewiesen. Gemäß einer Ausführungsform kann jede ausführbare Entität mit einem Tupel, z.B. mit einer eindeutigen Kennung, die einer logischen Einheit entspricht, und einer Kennung gekennzeichnet werden, die einen bestimmten Prozessor (oder eine bestimmte Einheit) kennzeichnet, auf dem die ausführbare Entität ausgeführt werden kann. Auf diese Weise können zwei oder mehr ausführbare Entitäten, die ein und derselben logischen Einheit entsprechen und dieselbe eindeutige Kennung nutzen, durch die Einheitenkennung voneinander unterschieden werden. In Schritt 208 können die ausführbaren Entitäten zum Beispiel in einem permanenten Speicher zusammen mit den entsprechenden Kennungen gespeichert werden.
  • 3 ist ein Ablaufplan, der ein Laufzeitverfahren gemäß einer Ausführungsform der vorliegenden Offenbarung veranschaulicht. In Schritt 302 wird ermittelt, welche der einen oder mehreren Plattformen zum Ausführen des Programms auf einem Computer verfügbar sind. In Schritt 306 wird an jedem festgelegten Punkt des Programmcodes eine logische Einheit zum Ausführen festgelegt. Es werden eine oder mehrere ausführbare Entitäten ausgewählt, die der festgelegten logischen Einheit zugehörig sind und zu der einen oder den mehreren als verfügbar ermittelten Plattformen passen. In Schritt 308 können eine oder mehrere ausgewählte ausführbare Entitäten auf die als verfügbar ermittelte eine oder mehrere Plattformen verteilt werden.
  • Gemäß einer Ausführungsform der vorliegenden Offenbarung können eine umfassende Compiler-Infrastruktur und ein Laufzeitsystem bereitgestellt werden, die gemeinsam die Verwendung einer einzelnen Sprache zum Programmieren von Datenverarbeitungssystem mit heterogenen Beschleunigern oder dergleichen und das gemeinsame Ausführen der resultierenden Programme auf solchen Architekturen ermöglichen. Gemäß einem Aspekt kann ein konstruktives Merkmal der vorliegenden Offenbarung die Verwendung derselben Semantik beim Ausführen auf einem beliebigen Prozessor ermöglichen, unabhängig davon, ob die Verarbeitung sequenziell oder threadparallel (wie in einer Mehrkern-CPU), vektorparallel (wie in einem GPU) oder bitparallel (wie in einem FPGA) erfolgt.
  • Gemäß einer Ausführungsform der vorliegenden Offenbarung kann ein Compiler das Programm zuerst in eine Zwischendarstellung übersetzen, die den Datenverarbeitungsvorgang als unabhängige, aber miteinander verbundene Knoten oder logische Einheiten beschreibt. Wiederum Bezug nehmend auf 1 kann ein Quellenprogramm 102 zum Beispiel in diese Datenverarbeitungsknoten (z.B. 140) partitioniert werden, die auch als in logische Einheiten 102 bezeichnet werden.
  • Der Compiler der vorliegenden Offenbarung kann dann eine Reihe quasi unabhängiger Back-End-Compiler in die Lage versetzen, eine oder mehrere Gruppen von Datenverarbeitungsknoten für verschiedene Zielarchitekturen zu kompilieren. Die meisten Back-End-Compiler brauchen nicht alles zu kompilieren. Gemäß einer Ausführungsform ist jedoch ein Back-End-Compiler dafür vorgesehen, das gesamte Programm zu kompilieren und sicherzustellen, dass jeder Knoten mindestens eine Implementierung aufweist.
  • Bei dem Ergebnis einer Kompilierung mit einer Verfahrensweise gemäß einer Ausführungsform der vorliegenden Offenbarung handelt es sich um eine Ansammlung von Artefakten für verschiedene Architekturen, die jeweils mit dem betreffenden Datenverarbeitungsknoten markiert sind, der für sie zuständig ist. Je nachdem, welche Knoten aktiviert sind, sind dafür während der Laufzeit eine große Anzahl funktionell gleichwertiger Konfigurationen verfügbar.
  • Gemäß einer Ausführungsform der vorliegenden Offenbarung wird ein dynamisches Partitionieren zur Parallelausführung eines Programms durchgeführt, zum Beispiel unter Verwendung heuristischer Methoden. Der Compiler der vorliegenden Offenbarung kann das Problem einer vorzeitigen statischen Partitionierung einer Anwendung durch dynamisches Partitionieren des Programms auf verfügbaren Verarbeitungselementen lösen, indem z.B. auf Mehrkern-CPUs, GPUs und FPGAs zugegriffen wird. Der Vorteil der Partitionierung während der Laufzeit besteht darin, dass sie nicht unveränderlich zu sein braucht und auf Änderungen der Programmauslastung, auf den Wechsel von Programmphasen, die Verfügbarkeit von Ressourcen und weitere differenzierte dynamische Merkmale reagieren kann.
  • Die Compiler-Infrastruktur und der Laufzeitprozess, die in der vorliegenden Anwendung beschrieben werden, können unter anderem die folgenden Merkmale bereitstellen.
  • Eine Quelle/mehrere Architekturen: ein und derselbe Satz von logischen Einheiten kann unter Verwendung von architekturspezifischen Compilern getrennt in ausführbare Artefakte kompiliert werden und somit die Möglichkeit zulassen, Code zum Beispiel in einer Java™-ähnlichen Sprache zu schreiben und lokale ausführbare Funktionen für Beschleuniger oder ähnliche Prozessoren zu schaffen.
  • Automatisches Kompilieren für speziell reservierte Prozessoren wie beispielsweise GPU, FPGA und andere: die Compiler-Infrastruktur gemäß einer Ausführungsform der vorliegenden Offenbarung kann beispielsweise in der Lage sein, Java™-Bytecode, OpenCL-Code zum Ausführen auf GPUs und Verilog-Code zum Ausführen auf FPGAs zu erzeugen.
  • Verwalteter Laufzeitprozess für Stream-Computing: die Compiler-Infrastruktur gemäß einer Ausführungsform der vorliegenden Offenbarung kann einen Sprachenlaufzeitprozess bereitstellen, der komplett in einer Sprache, zum Beispiel Java™ oder dergleichen, umgesetzt wird und in der Lage ist, durch eine virtuelle Maschine wie beispielsweise eine in Java™ geschriebene virtuelle Maschine (VM) betrieben zu werden; er kann die Ausführung der logischen Einheiten unter Verwendung lokaler Parallelmechanismen zeitlich planen, um vom Parallelbetrieb zu profitieren, wenn dieser im Programm vorkommt. Logische Einheiten in dieser Offenbarung werden als Tasks bezeichnet. Ein Task-Graph in der vorliegenden Offenbarung betrifft ein Netzwerk von Tasks, die zum Beispiel durch ihre Eingänge und Ausgänge miteinander verknüpft sind. Zum Beispiel kann die Task 1 mit der Task 2 verknüpft sein, indem der Ausgang der Task 1 durch den Eingang 4 der Task 2 genutzt wird. Flexible Konfiguration zur gleichzeitigen Ausführung: Die Compiler-Infrastruktur gemäß einer Ausführungsform der vorliegenden Offenbarung kann die gleichzeitige Ausführung logischer Einheiten zwischen verschiedenen Prozessoren wie beispielsweise Java™ VM, GPU und FPGA und/oder anderen organisieren, wenn es solche Artefakte gibt, darunter die Verwaltung der Datenübertragung sowie das Serialisieren und Deserialisieren von Daten für Artefakte.
  • 4 ist eine beispielhafte Übersicht über die Kompilierungs- und Laufzeitarchitektur gemäß einer Ausführungsform der vorliegenden Offenbarung. Die Architektur kann als Front-End- (FE-) Compiler 402 und eine Reihe von architekturspezifischen Back-End- (BE-) Compilern 404 für spezielle Prozessoren wie beispielsweise GPUs und FPGAs organisiert sein. Das System (z.B. ein Benutzerschnittstellenmodul des Systems) empfängt eine Reihe von Quellendateien 408 und erzeugt Artefakte 410 zum Ausführen. Bei einem Artefakt handelt es sich um eine ausführbare Entität, die entweder dem gesamten Programm (wie dies z.B. beim Erzeugen von Bytecode der Fall ist) oder dessen Teilbereichen entspricht (wie dies bei den OpenCL/GPU- und Verilog/FPGA-Back-Ends der Fall ist). Ein Artefakt ist so konfektioniert, dass es während der Laufzeit durch ein anderes Artefakt ersetzt werden kann, das ihm semantisch gleichwertig ist.
  • Die in 4 gezeigte Architektur veranschaulicht einen Java™-Bytecode-Compiler als Universal-Compiler für Universal-CPUs und OpenCL und Verilog als Back-End-Compiler für GPUs bzw. FPGAs. Diese Komponenten sind nur als Beispiele gezeigt. Zu beachten ist, dass die Verfahrensweisen und das System der vorliegenden Offenbarung nicht allein auf die in 4 gezeigte Konfiguration beschränkt sind. Vielmehr können die in der vorliegenden Offenbarung beschriebenen Arbeitsschritte und Prozeduren auch für andere Universal- und Spezial-Prozessoren und -Compiler gelten. Darüber hinaus werden als Beispiel eine Java™-ähnliche Programmiersprache und deren Syntax und Befehle als Sprache zum Programmieren eines Programms in einer einzelnen Quellensprache beschrieben, das mit der Compiler-Infrastruktur der vorliegenden Offenbarung kompiliert werden kann. Die Verfahrensweisen der vorliegenden Offenbarung brauchen jedoch nicht auf ein Programm beschränkt zu sein, das nur diese oder eine beliebige einzelne Sprache verwendet.
  • Eine beispielhafte einzelne Quellensprache 408 kann gemäß 4 logische Einheiten in der Form von Task-Graphen 412 darstellen. Eine Task wendet eine Funktion an, solange der Task Datenobjekte als Eingabewerte vorgelegt werden. Task-Graphen ergeben sich durch Verknüpfen von Tasks miteinander in der Weise, dass der Ausgang einer Task als Eingang einer anderen Task fungiert.
  • Eine Implementierung eines Front-End-Compilers 402 kann einen Bytecode-Compiler beinhalten. Zum Beispiel kann der Front-End-Compiler 402 eine Java™-kompatible Sprache beinhalten und durch eine inkrementale Abwandlung des bestehenden robusten Java™-Compilers erstellt werden, der in Eclipse (EDJ) integriert ist. Der Eclipse-Compiler (und in diesem Fall der FE 402) kann einfache Optimierungen vornehmen. Intern kann der Eclipse-Compiler durchweg als Programmdarstellung von dem abstrakten Syntaxbaum (AST) Gebrauch machen. Der FE 402 kann die Sprachmerkmale durch Umschreiben von AST-zu-AST umsetzen und die vorhandene Erzeugungsphase von Eclipse-Bytecode wiederverwenden.
  • Gemäß einer Ausführungsform kann eine Komponente in dem FE 402 unmittelbar vor dem Erzeugen des Bytecodes auf den AST angewendet werden, um den AST in eine für die Back-Ends 404 geeignete Zwischendarstellung umzuwandeln. Die Komponente kann eine interpretierende Ausführung von Teilen des Programms 408 vornehmen, die Task-Graphen bilden, um statistisch die Struktur vieler Task-Graphen 412 aufzuklären, die das Programm während der Laufzeit erzeugt (darunter deren Topologie und der Code jedes Knotens nach dem Einbetten von Programmteilen, ständige Fortführung und weitere Optimierungen). Durch die interpretierende Ausführung können nicht alle möglichen Task-Graphen aufgeklärt werden, die das Programm bilden könnte.
  • Den verschiedenen Back-Ends 404 kann einzeln die Möglichkeit eingeräumt werden, die Tasks zu kompilieren, aus denen diese Graphen bestehen. Jeder Back-End kann eine Ausschlusskomponente aufweisen, die jede Task prüft, um zu entscheiden, ob seine Verfahren kompiliert werden können; eine Task, die Verfahren mit Sprachkonstrukten enthält, die für den Back-End nicht geeignet sind, wird von der Kompilierung durch diesen Back-End ausgeschlossen, und für diese wird kein Artefakt erzeugt. Im gegenteiligen Fall erzeugt der Back-End ein Artefakt 410 für jede durch ihn kompilierte Task. Ein Back-End kann für das, was im ursprünglichen Programm einzelne Tasks waren, Artefakte erzeugen. Alternativ kann ein Back-End Artefakte 410 für Häufungen benachbarter Tasks erzeugen, zum Beispiel eine komplette Pipeline (d.h. eine Reihe miteinander verbundener Tasks) oder zumindest den größten Teilabschnitt einer Pipeline, wobei vorausgesetzt wird, dass einige Tasks durch die Ausschlusskomponente zurückgewiesen werden können.
  • Gemäß einer Ausführungsform der vorliegenden Offenbarung arbeiten der Front-End- und der Back-End-Compiler 402, 404 zusammen und erzeugen eine Aufstellung, in der jedes erzeugte Artefakt beschrieben und mit einer eindeutigen Task-Kennung markiert wird. Die Gesamtheit der Aufstellungen und Artefakte 410 wird durch den Laufzeitprozess 414 verwendet, um zu ermitteln, welche Task-Implementierungen einander semantisch gleichwertig sind. Dieselben Task-Kennungen werden in die Endphase der Bytecode-Kompilierung einbezogen, sodass die Ausdrücke für den Task-Aufbau und den Graphaufbau in dem Programm anhand dieser Kennungen zum Laufzeitprozess 414 weitergeleitet werden können, wenn das Programm ausgeführt wird. Eine einzelne Task kann mehr als nur eine Task-Kennung aufweisen, da sie Teil von größeren Task-Ansammlungen sein kann, die durch einen oder mehrere Back-Ends 404 erzeugt wurden. Die Task-Kennungen werden jedoch so erzeugt, dass die Tasks (sowohl einzeln als auch in Gruppen) mit ein und derselben Task-Kennung funktionell gleichwertig sind.
  • Ein Beispiel für einen speziellen Prozessor, aus dem ein Hybrid-Computer bestehen kann, ist eine GPU 418. In diesem Beispiel kann der Back-End für GPUs OpenCL-Code erzeugen, der unter Verwendung von plattformspezifischen OpenCL-Laufzeit-Compilern automatisch in lokalen Objektcode kompiliert wird. Durch das Erzeugen von OpenCL-Code wird der Zusatznutzen aus dem lokalen Ausführen des Codes 408 auf eine Vielfalt an Plattformen übertragen, die OpenCL-Implementierungen bereitstellen. Beispielsweise kann das System gemäß einer Ausführungsform der vorliegenden Offenbarung OpenCL als übertragbare „Assembler“-Sprache für Einkernprozessoren, GPUs und Mehrkernprozessoren betrachten.
  • Der OpenCL-Back-End 422 kann Artefakte 410 entweder für einzelne Tasks oder für verknüpfte Task-Graphen erzeugen. Er kann jede Task für einen OpenCL-Kern kompilieren, die zeitliche Steuerung von Tasks vornehmen sowie die Datenübertragung zwischen Tasks verwalten. Die Datenübertragung zwischen den verschiedenen Kernen kann so optimiert werden, dass zwischen aufeinander folgenden Durchläufen miteinander verknüpfter Tasks Daten im Speicher der GPU-Einheit verbleiben. Dadurch können unnütze Datenübertragungen zwischen der Host-CPU und der GPU vermieden und somit die Leistung maximiert werden.
  • Parallelbetrieb kann offen in dem Task-Graphen zum Ausdruck kommen (z.B. durch einen klaren Befehl in einem Programm) oder indirekt durch den Programmierer auf eine verbindlichere Art ausgedrückt werden (z.B. als gemeinsame Operation wie Zuordnen oder Anwenden). Wenn ein Abschnitt eines parallelen Codes entnommen wird, kann er intern durch einen Back-End-Compiler 404, z.B. den OpenCL-Back-End 422, zu einer Schleife geformt werden, die direkt dem Indexbereich zugeordnet wird, der dem parallelen Ausführungsmodell von OpenCL zugehörig ist. Der erzeugte OpenCL-Code kann an jede Größe und jede Anzahl von Threads angepasst werden, die auf der Einheit ausgeführt werden. Dies steht im Gegensatz zu manuell geschriebenem Code, der oft von einer fest vorgegebenen Anzahl von Threads oder einer fest vorgegebenen Eingabegröße ausgeht. Somit ist der erzeugte Code universeller und flexibler als manuell geschriebener Code.
  • Zum Erzielen einer hohen Leistung auf der GPU 148 kann die Compiler-Infrastruktur der vorliegenden Offenbarung Daten gezielt verschiedenen Speichern zuordnen. Im Allgemeinen stehen für das Programmierungsmodell von OpenCL vier Speichertypen zur Verfügung: globaler, konstanter, lokaler und privater Speicher. Diese Speicher sind in der Reihenfolge vom langsamsten und größten (globaler Speicher) bis zum schnellsten und kleinsten Speicher (privater Speicher) geordnet und befinden sich auf der Leiterplatte der GPU-Einheit. Auf den globalen Speicher können alle Threads für Lese/Schreib-Prozesse zugreifen, die auf der Einheit ausgeführt werden. Dieser Speicher ist mit dem Hauptspeicher (RAM) der CPU vergleichbar. Der konstante Speicher kann als kleiner globaler Nur-Lese-Speicher angesehen werden, der vorwiegend zum Speichern von Programmkonstanten verwendet wird. Bei dem lokalen Speicher handelt es sich um einen Lese/Schreib-Speicher, der (ähnlich einem gemeinsam genutzten L2-Cachespeicher in einem Mehrkernprozessor) gemeinsam von allen auf derselben Datenverarbeitungseinheit ausgeführten Threads genutzt wird. Der private Speicher schließlich ist für jeden Thread reserviert und kann nicht für den Datenaustausch zwischen Threads genutzt werden. Der Back-End 404 (z.B. 422) kann automatisch das Verteilen der Daten auf die verschiedenen Speicher optimieren und geeignete Programmtransformationen vornehmen, um die höchste Leistungsfähigkeit zu gewährleisten. Zum Beispiel können parallele Schleifen aufgeteilt und der lokale Speicher als Arbeitspufferspeicher zum Verringern des Datenverkehrs zum globalen Speicher verwendet werden. Durch eine weitere Optimierung können redundante Arbeitslasten des globalen Speichers erkannt und durch Speichern des Wertes in dem schnellen privaten Speicher beseitigt werden. Weitere Optimierungen können für eine GUP 418 durchgeführt werden.
  • Als weiteres Beispiel für einen Prozess, der einen Hybridcomputer bilden kann, wird ein FPGA 420 beschrieben. Bei diesem Beispiel kann der FPGA-Back-End 424 in Task-Graphen wirksam werden und einen Verilog-Code für Pipelines und andere klar definierte Programmbefehle für Parallelbetrieb erzeugen. Verilog ist kurz gesagt eine Hardwarebeschreibungssprache. Der Back-End-Compiler 404 gemäß einer Ausführungsform der vorliegenden Offenbarung weist das FPGA 424 auf und kann Tasks unterstützen, die Primitive-Datentypen verarbeiten und schließt Tasks mit uneingeschränkten Array-Zuordnungen aus, obwohl eingeschränkte Array-Zuordnungen zulässig sind. Gemäß einem Aspekt handelt es sich bei dem Vorgehen zur Codeerzeugung um einen zweigleisigen Ansatz, einen allgemeinen Pipeline-Parallelbetrieb, wie er in dem Task-Graphen zum Ausdruck kommt, und einen differenzierten Parallelbetrieb auf Befehlsebene, der in dem Task-Verfahren verfügbar ist. Der Back-End-Compiler 424 führt eine statische Abschätzung der Arbeitslast unter Verwendung eines Modells zum Ermitteln von Engpass-Tasks durch und versucht dann sein Verarbeitungsverfahren aggressiv in sehr fein differenzierte Blöcke zu partitionieren; bis hinab zu einer Einzeloperation. Der Back-End-Compiler für das FPGA 424 kann Optimierungen beinhalten. Der Back-End-Compiler 424 kann eine Bibliothek von vorgefertigten Hardwareblöcken verwenden, darunter Datenübertragungs-Firmware zum Befördern von Daten zwischen der CPU 416 und dem FPGA 420. Der Back-End-Compiler 424 kann automatisch eine logische Synthese des erzeugten Verilog-Codes vornehmen, um eine Bitdatei zu erzeugen (die zum Konfigurieren des FPGA vor dem Ausführen des Programms verwendet wird). Bei diesem Schritt sind keinerlei Eingriffe seitens des Benutzers erforderlich, und es können anwenderspezifische EDA- (electronic design automation, Automatisierung des elektronischen Designs) Tools verwendet werden. Beispielsweise können Xilinx-FPGAs auf der Grundlage von PCI unterstützt werden. Auch andere FPGAs können unterstützt werden.
  • Eine Laufzeitkomponente gemäß der vorliegenden Offenbarung ermöglicht ein Ausführen kompilierter Codes (ausführbare Entitäten oder Artefakte) auf geeigneter Hardware oder geeigneten Prozessoren. Beispielsweise kann ein Laufzeitmodul 414 in Java™ realisiert werden und durch eine beliebige JVM (Java Virtual Machine) abgewickelt werden. Gemäß einer Ausführungsform der vorliegenden Offenbarung kann ein Laufzeitmodul 414 eine oder mehrere virtuelle Maschinen oder dergleichen zum Ausführen einer oder mehrerer ausführbarer Entitäten beinhalten. Es kann während der Laufzeit Tast-Graphen erstellen, aus den verfügbaren Artefakten 410 auswählen, welche Implementierungen einer Task verwendet werden sollen, und bei Bedarf oder wenn gewünscht, das Ordnen von und die Datenübertragung zu lokalen Artefakten steuern. Gemäß einer Ausführungsform der vorliegenden Offenbarung kann das Laufzeitmodul 414 Ausführungsphasen zum Ausführen dieser Tasks beinhalten, z.B. Verdinglichen von Task-Graphen, zeitliches Planen und Ausführen eines Task-Graphen, Task-Ersetzungen und lokale Verbindungen und Ordnen.
  • Gemäß einer Ausführungsform der Implementierung des Laufzeitmoduls 414 kann das Laufzeitmodul 414 eine Klasse für jede einzelne Art von Tasks enthalten, wie sie zum Beispiel in einer Programmiersprache vorkommen, die zum Programmieren eines Programms 408 in einer einzelnen Programmsprache verwendet wird. Wenn ein Bytecode-Compiler den Code für eine Task erzeugt, erzeugt er eine Objektzuordnung direkt für eine dieser Laufzeitklassen oder erzeugt eine Klasse, die Unterklassen für die betreffende Laufzeitklasse bildet, dadurch ein maßgeschneidertes Verhalten einbringt und dann eine Objektzuordnung für die erzeugte Klasse erzeugt.
  • Durch eine Verknüpfungsoperation, die den Ausgang einer Task mit dem Eingang einer anderen Task verbindet, wird ein Verfahrensaufruf für Laufzeitverfahren erzeugt, der das Bilden der Verknüpfung bewirkt. Das Ergebnis dieser Verdinglichungsstrategie besteht darin, dass sich die Operatoren zum Erzeugen und Verknüpfen von Tasks während der Programmausführung in einem echten Graphen von Laufzeitobjekten widerspiegeln. Der erzeugte Bytecode, durch den eine Instanz einer Task erzeugt wird, stellt die Laufzeitumgebung auch mit den eindeutigen Kennungen bereit, die durch die Back-End-Compiler 404 erzeugt wurden, um den Vorrat an verfügbaren Artefakten von Tasks anzuzeigen.
  • Gemäß einer Ausführungsform kann das zeitliche Planen und Ausführen einer ausführbaren Entität wie folgt ablaufen. Wenn auf einem beliebigen Task-Graphen ein Verfahren „Start“ aufgerufen wird, aktiviert dieses den Zeitplanungsteil der Laufzeitumgebung. Der verdinglichte Graph wird untersucht, um die den Graphen bildenden Tasks zu ermitteln und die Raten jeder Task zu berechnen. Unter „Rate“ ist die Anzahl der für jede Eingabe erzeugten Ausgaben zu verstehen. Durch Benutzerverfahren erzeugte Tasks können eine Rate von 1:1 aufweisen, während integrierte Tasks andere Raten aufweisen können, die statisch bekannt sein (jedoch nicht unbedingt gleich 1:1) oder dynamisch veränderlich sein können.
  • Sobald die Raten aller Tasks bekannt sind, wird der Graph durch den Zeitplaner so in synchrone Bereiche eingeteilt, dass entweder (1) alle Tasks in einem synchronen Bereich bekannte statische Raten aufweisen oder (2) der synchrone Bereich eine einzige Task mit dynamisch veränderlicher Rate aufweist. Für jeden synchronen Bereich der ersten Art wird ein statischer Zeitplan berechnet, dem zufolge jede Task genau so oft ausgeführt wird, dass die Raten der Tasks untereinander ausgewogen sind. Die Verknüpfungen zwischen Tasks in einem synchronen Bereich bedürfen daher keiner elastischen Puffer; Verknüpfungen zwischen synchronen Bereichen hingegen weisen solche Puffer auf, um die veränderlichen Raten auszugleichen.
  • Unter der Annahme, dass die Tasks in dem Graphen nur Bytecode-Artefakte aufweisen, erzeugt der Laufzeitprozess für jeden synchronen Bereich einen Thread. Diese Threads sperren die ankommenden Verknüpfungen des Bereichs, bis ausreichend Daten für einen Durchlauf im Zeitplan des Bereichs verfügbar sind und Daten an seinen abgehenden Verknüpfungen erzeugen. Mit dem Erzeugen und Starten dieser Threads ist die Laufzeitimplementierung der Start()operation abgeschlossen.
  • Gemäß einer Ausführungsform kann eine Taskersetzung (d.h. eine dynamische Programmpartitionierung zwischen Prozessoren in dem Computer) wie folgt durchgeführt werden. Wenn Tasks in dem Graphen Artefakte aufweisen, die nicht auf Bytecode beruhen, nimmt die Laufzeitumgebung dies während der Prüfung des verdinglichten Task-Graphen zur Kenntnis, da in dem durch die Back-Ends 404 belegten Artefaktspeicher (siehe z.B. 1, 136) unkompliziert nach den eindeutigen Kennungen von Tasks gesucht werden kann, die dort gespeichert sind. Für jede Task oder jede zusammenhängende Folge von Tasks, die eine andere Implementierung aufweist (wenn z.B. mehr als eine ausführbare Entität verfügbar ist), ist es der Laufzeitumgebung möglich, eine Ersetzung vorzunehmen. Gemäß einer Ausführungsform kann ein Laufzeitalgorithmus eine oder mehrere Regeln anwenden, um eine Ersetzung automatisch vorzunehmen. Zum Beispiel kann eine Regel vorschreiben, eine größere Ersetzung (unter Zusammenfassung einer größeren Anzahl angrenzender Tasks) gegenüber einer kleineren Ersetzung zu bevorzugen. Eine andere Regel kann vorschreiben, GPU- und FPGA-Artefakte gegenüber Bytecodes zu bevorzugen. Die Auswahl kann ebenso auch manuell vorgenommen werden. Auch ein noch komplexerer Algorithmus, der die Datenübertragungskosten berücksichtigt, eine dynamische Umsetzung, eine Laufzeitanpassung oder Ähnliches vornimmt, kann in Betracht kommen. Das Ausführen der Ersetzung selbst beinhaltet wie oben beschrieben lokale Verknüpfungen und Neuordnungen. Ersetzungen können dem Erzeugen und Starten von Threads vorangehen, beeinflussen aber ansonsten im Allgemeinen nicht die restliche Laufzeit.
  • Gemäß einer Ausführungsform können lokale Verknüpfungen und Neuordnungen wie folgt durchgeführt werden. Kennzeichnend für alle Artefakte, die nicht auf Bytecode beruhen, kann sein, dass zwischen der Domäne der JVM und der Hardware-Domäne des Back-End eine bestimmte eindeutige Verknüpfung besteht. Zum Beispiel ist es zum Ausführen der GPU parallel zur JVM erforderlich, zuerst die lokale Binärfunktion (einmalig) zu laden, aktuell in der Form oder einer dynamisch verknüpften Bibliothek, und JNI- (Java™ Native Interface) Aufrufe zu tätigen, um Daten von der JVM an die GPU zu übertragen. Desgleichen ist im Fall der FPGA die Einheit selbst unter Verwendung einer Bitdatei programmiert und lädt ebenfalls eine Bibliothek, um die lokale Datenübertragung mit dem Treiber der FPGA-Einheit abzuwickeln. In allen Fällen kann es zur Serialisierung und Deserialisierung von Daten kommen. In technischer Hinsicht unterstützt JNI das Weiterleiten von Java™ Datenstrukturen durch Verweis und greift mittels Rückrufen auf einzelne Felder und abhängige Objekte zu. In der Praxis kann die Serialisierung von Daten genutzt werden, um eine zu große Anzahl von JNI-Überschneidungen zu vermeiden. Kurz gesagt, JNI ermöglicht das Ausführen von Java™ in einer JVM, um lokale Programme, die auf eine Hardware oder ein Betriebssystem zugeschnitten sind, aufzurufen und durch diese aufgerufen zu werden.
  • Um die Latenz der meisten lokalen Verknüpfungen zu verringern, kann auf der Verknüpfung eine Puffermöglichkeit geschaffen und genutzt werden. Somit kann durch die Anwesenheit einer lokalen Task innerhalb von Tasks, die Java™-Bytecodes ausführen, der synchrone Bereich unterbrochen werden, indem die lokale Task in einen lokalen Bereich überführt wird, der auch in Bezug auf die Zeitplanung des Thread abgetrennt ist. Während synchrone Bereiche in der JVM durch einfache Datenwarteschlangen abgetrennt werden können, kann das Bilden von Warteschlangen zwischen lokalen Bereichen zumindest teilweise in lokalem Code verborgen werden, und die Details können je nach Back-End-Typ variieren.
  • Als Beispiel soll eine Sprache ähnlich Java™ als einzelne Sprache betrachtet werden, die durch die Compiler-Infrastruktur und den Laufzeitprozess der vorliegenden Offenbarung unterstützt wird. Eine solche Sprache kann so gestaltet sein, dass sie über die erforderliche Semantik verfügt, damit sie eine präzise Programmierung von ganz verschiedenen Architekturen und deren unkomplizierte Kompilierung ermöglicht. Die Sprache kann ein Programmierungsmodell des Datenflusses auf der Grundlage der Task bereitstellen, das eine Programmpartitionierung auf Taskebene ermöglicht. Eine Task kann so strikt isoliert werden, dass sie möglicherweise nicht auf veränderliche globale Programmstatus zugreifen kann und es keine externen Verweise auf die Task gibt, sodass deren Status, wenn überhaupt, nur von ihr selbst verändert werden kann. Task-Graphen ergeben sich daraus, dass Tasks miteinander verknüpft werden, sodass der Ausgang einer Task den Eingang einer anderen Task bildet. Über die Verknüpfungen zwischen Tasks dürfen möglicherweise nur Wertetypen fließen. Wertetypen stellen unveränderliche Objekte dar, sodass die Isolation einer Task nicht verletzt werden kann. Die Sprache kann die Isolation und Unveränderlichkeit gewährleisten, um die dynamische Programmpartitionierung und das Zuordnen von Task-Graphen zu heterogenen Architekturen zur gleichzeitigen Verarbeitung bestmöglich auszuführen. Eine solche Programmiersprache gemäß einer Ausführungsform kann Java™ durch eine Anzahl von Merkmalen ergänzen, die für den Parallelbetrieb geeignet sind. Eine beispielhafte einzelne Programmiersprache mit diesen Merkmalen, die zum Programmieren diverser unterschiedlicher Prozessortypen verwendet werden kann, ist zu finden bei Joshua Auerbach, David F. Bacon, Perry Cheng und Rodric Rabbah, LIME: A Java-compatible and synthesizable language for heterogeneous architectures in OOPSLA, 2010; sowie in Joshua Auerbach, David F. Bacon, Perry Cheng und Rodric Rabbah: LIME: The Liquid Metal Programming Language - Language Reference Manual, Technischer Bericht, RC25004, IBM Research, 2010. Siehe http : // domino. research.ibm.com/library/cyberdig.nsf. Nähere Einzelheiten zu Streamlt sind zu finden in Thies, William: Language and compiler support for stream programs. Promotionsarbeit, Massachusetts Institute of Technology, 2009; und in William Thies, Michal Karczmarek und Saman P. Amarasinghe: Streamlt: A Language for Streaming Applications. CC, 2002.
  • Zu beachten ist, dass die Compiler- und Laufzeitverfahrensweisen und das entsprechende System der vorliegenden Offenbarung nicht auf die Verwendung einer bestimmten Sprache beschränkt sind. Die obige Beschreibung der Sprache wird vielmehr nur als Beispiel bereitgestellt.
  • 5 zeigt beispielhafte Systeme, auf denen die Compiler-Infrastruktur und/oder der Laufzeitprozess gemäß einer Ausführungsform der vorliegenden Offenbarung ausgeführt werden können. Ein solches System kann einen oder mehrere Prozessoren 502 und Speicher 504 beinhalten und Verknüpfungen zu einem Netzwerk, einem Speicher und anderen Einheiten aufweisen. Eine Compiler-Infrastruktur und ein Laufzeitsystem 506 der vorliegenden Offenbarung kann in einem Computerspeicher 504 untergebracht sein und durch einen oder mehrere Prozessoren 502 ausgeführt werden. Zum Beispiel können die Compiler-Infrastruktur und das Laufzeitsystem 506 von einer permanenten Speichereinheit und/oder von einem Netzwerk geladen werden. Ein Programm kann in der oben beschriebenen Weise durch den Compiler der vorliegenden Offenbarung kompiliert werden. Die erzeugten ausführbaren Entitäten können gespeichert und/oder in der oben beschriebenen Weise durch das Laufzeitsystem 506 der vorliegenden Offenbarung ausgeführt werden. Zu beachten ist, dass ein Programm nicht unbedingt auf ein und derselben Maschine kompiliert und ausgeführt werden muss. Das heißt, dass ein Programm zum Beispiel unter Verwendung des Compiler-Systems der vorliegenden Offenbarung auf einer Maschine kompiliert werden kann und die gespeicherten ausführbaren Entitäten an eine andere Maschine übertragen werden können, um auf dieser Maschine durch das Laufzeitsystem der vorliegenden Offenbarung ausgeführt zu werden. 5 zeigt als Beispiel eine Maschine A und eine Maschine B, die unterschiedliche Prozessorkonfigurationen aufweisen können. Ein Programm kann in der Maschine B unter Verwendung des Prozessors 510 und des Speichers 508 der Maschine B kompiliert und dann auf der Maschine A ausgeführt werden und umgekehrt. Die Konfigurationen der Computer in 5 sind nur als Beispiele dargestellt; die Verfahrensweisen der vorliegenden Offenbarung können auch auf andere Konfigurationen angewendet werden.
  • In dieser Offenbarung wurden oben eine Compiler-Infrastruktur und ein Laufzeitsystem beschrieben, die gemeinsam die Verwendung einer einzelnen Sprache zum Programmieren von Datenverarbeitungssystemen mit heterogenen Beschleunigern (z.B. mit einer Mischung herkömmlicher CPU-Kerne, GPUs und GPGAs) und die parallele Ausführung der erstellten Programme auf solchen Architekturen ermöglichen. Beispielsweise wurde eine Java™-kompatible Sprache beschrieben, wobei die Infrastruktur einen vorhandenen Java™-Compiler aufwertet und verschiedene anwendbare Kompilierungstechniken ermöglicht, darunter, ohne darauf beschränkt zu sein, (1) interpretierende Ausführung von dynamischen Ausdrücken der Graphenstruktur, um die Struktur und den Code des erstellten Graphen statisch zu ermitteln, und (2) eine Mehrversionenstrategie, die auf redundante Weise Kompilierungen für mehrere Back-Ends vornimmt und Code ausschließt, der für einen bestimmten Back-End nicht einfach kompiliert werden kann. Das Laufzeitmodul wird aktiviert, um eine Partitionierung auszuwählen, die für die Datenverarbeitungselemente optimiert wurde.
  • Zwar gibt es unabhängig voneinander Programmierungstechnologien für CPUs, GPUs, FPGAs und verschiedene Beschleuniger, diese sind jedoch in verschiedenen Sprachen oder Dialekten geschrieben, in denen unterschiedliche Architekturen programmiert werden müssen. Die Verfahrensweisen der vorliegenden Offenbarung hingegen ermöglichen es, unterschiedliche Prozessoren mit einem einzigen Programm zu programmieren. Außerdem ermöglichen die Verfahrensweisen der vorliegenden Offenbarung eine parallele Ausführung, darunter ein Steuern eines Programms für unterschiedliche Datenverarbeitungselemente, die auf verschiedenen Architekturen ausgeführt werden und nahtlos zusammenarbeiten. Darüber hinaus ermöglichen die Verfahrensweisen der vorliegenden Offenbarung, dynamische und automatische Entscheidungen zu fällen, um festzulegen, was wo ausgeführt wird.
  • Gemäß einer Ausführungsform können die Verfahrensweisen und/oder eine oder mehrere Komponenten der vorliegenden Offenbarung auf einem anwenderprogrammierbaren Gatter-Array (FPGA), einer grafischen Verarbeitungseinheit (GPU) oder einem anderen Spezialprozessor oder einer entsprechenden Schaltung oder einer Zentraleinheit (CPU) oder deren Kombinationen umgesetzt und ausgeführt werden. Zum Programmieren einer solchen Hardware oder einer integrierten Schaltung kann eine Sprache wie beispielsweise eine Hardwarebeschreibungssprache (HDL) verwendet werden. Gemäß einer Ausführungsform der vorliegenden Offenbarung kann zum Beispiel die Hauptlogik des Programms auf einem FPGA, die Hilfslogik des Programms hingegen auf einer CPU ausgeführt werden.
  • Dem Fachmann ist einsichtig, dass die vorliegende Erfindung als System, Verfahren oder Computerprogrammprodukt umgesetzt werden kann. Demgemäß können Aspekte der vorliegenden Erfindung die Form einer kompletten Hardwareausführungsform, einer kompletten Softwareausführungsform (darunter Firmware, residente Software, Mikrocode usw.) oder einer Ausführungsform annehmen, die Software- und Hardwareaspekte in sich vereint, die hierin im Allgemeinen sämtlich als „Schaltung“, „Modul“ oder „System“ bezeichnet werden können. Darüber hinaus können Aspekte der vorliegenden Erfindung die Form eines Computerprogrammprodukts annehmen, das in einem oder mehreren computerlesbaren Medien verkörpert ist, auf denen ein computerlesbarer Programmcode gespeichert ist.
  • Es kann eine beliebige Kombination von einem oder mehreren computerlesbaren Medien verwendet werden. Bei dem computerlesbaren Medium kann es sich um ein computerlesbares Signalmedium oder um ein computerlesbares Speichermedium handeln. Bei einem computerlesbaren Speichermedium kann es sich zum Beispiel, ohne darauf beschränkt zu sein, um ein elektronisches, magnetisches, optisches, elektromagnetisches, Infrarot- oder Halbleitersystem, eine entsprechendes Vorrichtung oder Einheit oder eine beliebige geeignete Kombination derselben handeln. Zu spezielleren Beispielen (eine nicht erschöpfende Aufzählung) des computerlesbaren Speichermedium zählen folgende: eine elektrische Verbindung mit einer oder mehreren Leitungen, eine tragbare Computerdiskette, eine Festplatte, ein Direktzugriffsspeicher (RAM), ein Nur-Lese-Speicher (ROM), ein löschbarer programmierbarer Nur-Lese-Speicher (EPROM oder Flash-Speicher), ein Lichtwellenleiter, ein tragbarer Compact Disc-Nur-Lese-Speicher (CD-ROM), eine optische Speichereinheit, eine magnetische Speichereinheit oder eine beliebige geeignete Kombination derselben. In Verbindung mit diesem Dokument kann es sich bei einem computerlesbaren Speichermedium um ein beliebiges materielles Medium handeln, das ein Programm zur Verwendung durch oder in Verbindung mit einem System, einer Vorrichtung oder Einheit zum Ausführen von Anweisungen enthalten oder speichern kann.
  • Ein computerlesbares Signalmedium kann ein weitergeleitetes Datensignal mit einem darin verkörperten computerlesbaren Programmcode beinhalten, zum Beispiel im Basisband oder als Teil einer Trägerwelle. Ein solches weitergeleitetes Signal kann eine beliebige Vielfalt von Formen annehmen, darunter, ohne darauf beschränkt zu sein, elektromagnetisch, optisch oder eine beliebige geeignete Kombination derselben. Bei einem computerlesbaren Signalmedium kann es sich um ein beliebiges computerlesbares Medium handeln, das kein computerlesbares Speichermedium ist und ein Programm zur Verwendung durch oder in Verbindung mit einem System, einer Vorrichtung oder Einheit zum Ausführen von Anweisungen übertragen, weiterleiten oder transportieren kann.
  • Ein auf einem computerlesbaren Medium verkörperter Programmcode kann unter Verwendung eines beliebigen geeigneten Mediums übertragen werden, darunter, ohne darauf beschränkt zu sein, drahtlos, leitungsgebunden, Lichtwellenleiter, HF usw. oder eine beliebige geeignete Kombination derselben.
  • Ein Computerprogrammcode zum Ausführen von Operationen für Aspekte der vorliegenden Erfindung kann in einer beliebigen Kombination einer oder mehrerer Programmiersprachen geschrieben wein, darunter eine objektorientierte Programmiersprache wie beispielsweise Java, Smalltalk, C++ oder dergleichen und herkömmliche prozedurale Programmiersprachen wie beispielsweise die Programmiersprache „C“ oder ähnliche Programmiersprachen, eine Skriptsprache wie beispielsweise Perl, VBS oder ähnliche Sprachen und/oder funktionale Sprachen wie beispielsweise Lisp und ML und logikorientierte Sprachen wie beispielsweise Prolog. Der Programmcode kann komplett auf dem Computer eines Benutzers, teilweise auf dem Computer des Benutzers, als eigenständiges Softwarepaket, teilweise auf dem Computer des Benutzers und teilweise auf einem fernen Computer oder komplett auf dem fernen Computer oder Server ausgeführt werden. Im letzteren Fall kann der ferne Computer mit dem Computer des Benutzers durch einen beliebigen Netzwerktyp verbunden sein, darunter ein lokales Netzwerk (LAN) oder ein Weitverkehrsnetzwerk (WANI, oder die Verbindung kann zu einem externen Computer hergestellt werden (zum Beispiel durch das Internet unter Verwendung eines Internet-Dienstleisters).
  • Aspekte der vorliegenden Erfindung werden unter Bezugnahme auf Ablaufpläne und/oder Blockschaubilder von Verfahren, Vorrichtungen (Systemen) und Computerprogrammprodukten gemäß Ausführungsformen der Erfindung beschrieben. Es ist klar, dass jeder Block der Ablaufpläne und/oder Blockschaubilder und Kombinationen von Blöcken in den Ablaufplänen und/oder Blockschaubildern durch Anweisungen eines Computerprogramms umgesetzt werden können. Diese Computerprogrammanweisungen können einem Prozessor eines Universalcomputers, eines Spezialcomputers oder einer anderen programmierbaren Datenverarbeitungsvorrichtung zugeführt werden, um eine Maschine derart zu erzeugen, dass die durch den Prozessor des Computers oder einer anderen programmierbaren Datenverarbeitungsvorrichtung ausgeführten Anweisungen ein Mittel zum Umsetzen der in dem Block oder den Blöcken des Ablaufplans und/oder Blockschaubildes angegebenen Funktionen/Aktionen erzeugen.
  • Diese Computerprogrammanweisungen können auch in einem computerlesbaren Medium gespeichert sein, das einen Computer, eine andere programmierbare Datenverarbeitungsvorrichtung oder andere Einheiten veranlasst, in einer bestimmten Weise wirksam zu werden, sodass die in dem computerlesbaren Medium gespeicherten Anweisungen ein Herstellungsprodukt erzeugen, das Anweisungen enthält, die die in dem Block oder den Blöcken des Ablaufplans und/oder Blockschaubildes angegebenen Funktionen/Aktionen umsetzen.
  • Die Computerprogrammanweisungen können auch auf einen Computer, eine andere programmierbare Datenverarbeitungsvorrichtung oder andere Einheiten geladen werden, um eine Folge auf dem Computer, einer anderen programmierbaren Vorrichtung oder anderen Einheiten auszuführender Arbeitsschritte auszulösen, um einen computergestützten Prozess derart zu erzeugen, dass die auf dem Computer oder einer anderen programmierbaren Vorrichtung ausgeführten Anweisungen Prozesse zum Umsetzen der in dem Block oder den Blöcken des Ablaufplans und/oder der Blockschaubildes angegebenen Funktionen/Aktionen erzeugen.
  • Der Ablaufplan und die Blockschaubilder in den Figuren veranschaulichen die Architektur, die Funktionalität und die Arbeitsweise möglicher Implementierungen von Systemen, Verfahren und Computerprogrammprodukten gemäß verschiedenen Ausführungsformen der vorliegenden Erfindung. Diesbezüglich kann jeder Block in dem Ablaufplan oder den Blockschaubildern ein Modul, ein Segment oder einen Abschnitt eines Codes darstellen, der eine oder mehrere ausführbare Anweisungen zum Umsetzen der angegebenen logischen Funktion(en) aufweist. Zu beachten ist auch, dass bei bestimmten alternativen Implementierungen die in dem Block angegebenen Funktionen in einer von den Figuren abweichenden Reihenfolge vorkommen können. Zum Beispiel können zwei nacheinander gezeigte Blöcke in Wirklichkeit je nach vorgesehener Funktionalität im Wesentlichen gleichzeitig ausgeführt werden, oder die Blöcke können mitunter in der umgekehrten Reihenfolge ausgeführt werden. Ferner wird darauf hingewiesen, dass jeder Block der Blockschaubilder und/oder Ablaufpläne und Kombinationen von Blöcken in den Blockschaubildern und/oder Ablaufplänen durch spezielle Hardwaresysteme, die die angegebenen Funktionen oder Aktionen ausführen, oder durch Kombinationen spezieller Hardware und Computeranweisungen umgesetzt werden können.
  • Die Systeme und Verfahrensweisen der vorliegenden Offenbarung können in einem Computersystem realisiert oder ausgeführt werden, das eine Verarbeitungseinheit enthält, in der ein oder mehrere Prozessoren und/oder Kerne, ein Speicher und weitere (in den Zeichnungen nicht ausdrücklich gezeigte) Systemkomponenten untergebracht sind, die ein Computer-Verarbeitungssystem oder einen Computer realisieren, der ein Computerprogrammprodukt ausführen kann. Das Computerprogrammprodukt kann Medien aufweisen, zum Beispiel eine Festplatte, ein kompaktes Speichermedium wie beispielsweise eine Compact Disc oder andere Speichereinheiten, die durch die Verarbeitungseinheit mittels beliebiger Techniken gelesen werden können oder dem Fachmann bekannt sind, um das Computerprogrammprodukt zum Ausführen durch das Verarbeitungssystem bereitzustellen.
  • Das Computerprogrammprodukt kann alle die einschlägigen Merkmale aufweisen, die die Umsetzung der hierin beschriebenen Verfahrensweisen ermöglichen, und in der Lage sein - wenn es in ein Computersystem geladen wird - die Verfahren auszuführen. Unter den Begriffen Computerprogramm, Softwareprogramm, Programm oder Software ist im vorliegenden Zusammenhang jeder Ausdruck eines Satzes von Anweisungen in einer beliebigen Sprache, einem beliebigen Code oder einer beliebigen Schreibweise zu verstehen, der ein System, das über eine Datenverarbeitungsfähigkeit verfügt, veranlasst, eine bestimmte Funktion entweder direkt oder nach einer oder beiden folgenden Operationen auszuführen: (a) Konvertierung in eine andere Sprache, einen anderen Code oder eine andere Bezeichnungsweise; und/oder (b) Darstellung in einer anderen materiellen Form.
  • Das Computerverarbeitungssystem, welches das System und das Verfahren der vorliegenden Offenbarung ausführt, kann auch eine Anzeigeeinheit wie beispielsweise einen Monitor oder einen Bildschirm zum Darstellen ausgegebener Anzeigen enthalten und eine Anzeige bereitstellen, durch die der Benutzer Daten in das Verarbeitungssystem eingeben und mit diesem interagieren kann, zum Beispiel zusammen mit Eingabeeinheiten wie beispielsweise der Tastatur und einer Mauseinheit oder einer Zeigereinheit. Das Computerverarbeitungssystem kann direkt oder über Fernverbindungen auch mit einer oder mehreren Peripherieeinheiten wie beispielsweise dem Drucker, dem Scanner, dem Lautsprecher und anderen Einheiten verbunden oder gekoppelt sein. Das Computerverarbeitungssystem kann über ein lokales Ethernet, eine WAN-Verbindung, das Internet usw. und/oder über beliebige andere Netzwerkverfahrensweisen, die verschiedene Datenverarbeitungssysteme miteinander verbinden und den Datenaustausch zwischen ihnen ermöglichen, mit einem oder mehreren weiteren Datenverarbeitungssystemen wie beispielsweise einem Server, einem anderen fernen Computerverarbeitungssystem, Netzwerkspeichereinheiten verbunden oder gekoppelt sein. Die verschiedenen Funktionalitäten und Module des Systems und der Verfahren der vorliegenden Offenbarung können verteilt auf verschiedenen Datenverarbeitungssystemen oder auf einer einzelnen beliebigen Plattform umgesetzt oder ausgeführt werden, indem zum Beispiel auf Daten zugegriffen wird, die lokal oder über das Netzwerk verteilt gespeichert sind.
  • Die hierin gebrauchten Begriffe dienen lediglich zum Beschreiben bestimmter Ausführungsformen und sind nicht als Einschränkung der Erfindung zu verstehen. Die hierin gebrauchten Einzahlformen „ein“, „eine“ und „der, die, das“ sollen gleichermaßen die Mehrzahlformen beinhalten, sofern nicht aus dem Zusammenhang anderes hervorgeht. Ferner ist klar, dass die Begriffe „weist auf“ und/oder „aufweisend“ das Vorhandensein angegebener Merkmale, Ganzzahlen, Schritte, Operationen, Elemente und/oder Komponenten bezeichnen, jedoch nicht das Vorhandensein oder Hinzukommen eines oder mehrerer anderer Merkmale, Ganzzahlen, Schritte, Operationen, Elemente, Komponenten und/oder deren Gruppen ausschließen.
  • Die entsprechenden Strukturen, Materialien, Aktionen und Entsprechungen aller Mittel oder Schritte zuzüglich Funktionselemente, sofern vorhanden, in den folgenden Ansprüchen sollen jede Struktur, jedes Material oder jede Aktion zum Ausführen der Funktion in Verbindung mit anderen ausdrücklich beanspruchten Elementen beinhalten. Die Beschreibung der vorliegenden Erfindung ist zur Veranschaulichung und Beschreibung dargelegt worden, erhebt jedoch nicht den Anspruch auf Vollständigkeit oder auf Beschränkung auf die Erfindung in der offenbarten Form. Dem Fachmann sind viele Änderungen und Varianten offensichtlich, ohne vom Schutzumfang und vom Wesensgehalt der Erfindung abzuweichen. Die Ausführungsform wurde gewählt und beschrieben, um die Grundgedanken der Erfindung und der praktischen Anwendung bestmöglich zu erläutern und anderen Fachleuten das Verständnis für verschiedene Ausführungsformen mit verschiedenen Änderungen zu ermöglichen, die für die jeweils vorgesehene Verwendung geeignet sind.
  • Verschiede Aspekte der vorliegenden Offenbarung können als Programm, Software oder Computeranweisungen realisiert werden, die in einem durch Computer oder Maschinen nutzbaren oder lesbaren Medium verkörpert sind, das den Computer oder die Maschine veranlasst, die Schritte des Verfahrens auszuführen, wenn dieses auf dem Computer, dem Prozessor und/oder der Maschine ausgeführt wird. Auch eine Programmspeichereinheit wird bereitgestellt, die durch eine Maschine lesbar ist und ein Programm von Anweisungen verkörpert, die durch die Maschine ausführbar sind, um verschiedene in der vorliegenden Offenbarung beschriebene Funktionalitäten und Verfahren auszuführen.
  • Das System und das Verfahren der vorliegenden Offenbarung können auf einem Universal- oder Spezialcomputersystem umgesetzt und ausgeführt werden. Bei dem Computersystem kann es sich um einen beliebigen Typ bekannter oder in Zukunft bekannt werdender Systeme handeln, die üblicherweise einen Prozessor, eine Speichereinheit, eine Massenspeichereinheit, Eingabe/Ausgabeeinheiten, interne Busse und/oder eine Datenübertragungsschnittstelle zum Austauschen von Daten mit anderen Computersystemen in Verbindung mit Datenübertragungshardware und -software usw. enthalten.
  • Die Begriffe „Computersystem“ und „Computernetzwerk“, wie sie möglicherweise in der vorliegenden Anmeldung verwendet werden, können eine Vielfalt an Kombinationen von fest installierter und/oder tragbarer Computerhardware, -software, Peripherieeinheiten und Speichereinheiten beinhalten. Das Computersystem kann eine Vielzahl einzelner Komponenten, die miteinander vernetzt oder anderweitig miteinander verbunden sind, um zusammenzuarbeiten, oder eine oder mehrere eigenständige Komponenten enthalten. Die Hardware- und Softwarekomponenten des Computersystems der vorliegenden Anmeldung können fest installierte und tragbare Einheiten wie beispielsweise Desktop-, Laptoprechner und/oder Server enthalten und in diesen enthalten sein. Bei einem Modul kann es sich um eine Komponente einer Einheit, einer Software, eines Programms oder Systems handeln, das eine bestimmte „Funktionalität“ ausführt, die in Form von Software, Hardware, Firmware, einer elektronischen Schaltlogik und dergleichen verkörpert sein kann.
  • Die oben beschriebenen Ausführungsformen stellen lediglich anschauliche Beispiele dar und sind nicht so auszulegen, dass die vorliegende Erfindung auf diese speziellen Ausführungsformen beschränkt ist. Somit können durch einen Fachmann verschiedene Änderungen und Modifikationen vorgenommen werden, ohne vom Wesensgehalt oder vom Schutzumfang der Erfindung abzuweichen, die in den beiliegenden Ansprüchen definiert sind.

Claims (16)

  1. Verfahren zum Ausführen einer oder mehrerer Anwendungen, wobei das Verfahren aufweist: automatisches Partitionieren (202) eines Programmcodes in zwei oder mehr logische Einheiten durch einen Programm-Compiler (106; 402); und Kompilieren (204) jeder der logischen Einheiten in eine oder mehrere ausführbare Entitäten (116, 118, 120, 122, 124; 410), wobei mindestens einige der logischen Einheiten in zwei oder mehr ausführbare Entitäten kompiliert werden und es sich bei den beiden oder mehr ausführbaren Entitäten um verschiedene maschinenspezifische Kompilierungen ein und derselben logischen Einheit handelt, wobei das Kompilieren ferner ein Eingeben von logischen Einheiten in verschiedene maschinenspezifische Compiler (106, 108, 110, 112, 114; 402, 422) umfasst, um die zwei oder mehr ausführbaren Einheiten zu erzeugen; Zuweisen (206) ein und derselben Kennung zu allen von derselben logischen Einheit kompilierten ausführbaren Entitäten, Speichern (208) der einen oder der mehreren ausführbaren Entitäten mit mindestens zwei Schlüsseln, wobei ein Schlüssel zum Kennzeichnen einer logischen Einheit, von der die eine oder die mehreren ausführbaren Funktionen kompiliert sind, und ein anderer Schlüssel zum Kennzeichnen einer Plattform (126, 128, 130, 132, 134; 416, 418, 420) dient, mit der die eine oder die mehreren ausführbaren Entitäten kompatibel sind; Ermitteln (302), welche eine oder mehreren Plattformen zur Programmausführung verfügbar sind; und an jedem festgelegten Punkt des Programmcodes, Festlegen (304) einer logischen Einheit zum Ausführen und Auswählen einer oder mehrerer ausführbarer Entitäten, die der festgelegten logischen Einheit zugehörig und mit der einen oder den mehreren als verfügbar ermittelten Plattformen kompatibel sind.
  2. Verfahren nach Anspruch 1, wobei die eine oder die mehreren ausgewählten ausführbaren Entitäten auf die entsprechende eine oder die mehreren als verfügbar ermittelten Plattformen verteilt werden.
  3. Verfahren nach Anspruch 1, wobei das Partitionieren bei einem Datenflussgrenzwert in dem Programmcode erfolgt.
  4. Verfahren nach Anspruch 1, wobei eine ausführbare Entität für alle Teile des Programms für mindestens eine bestimmte Maschine erzeugt wird.
  5. Verfahren nach Anspruch 1, wobei zu den verschiedenen maschinenspezifischen Kompilierungen solche Kompilierungen gehören, die auf zwei oder mehr Kombinationen einer Universal-Datenverarbeitungsplattform, einer Spezial-Datenverarbeitungsplattform oder einer umkonfigurierbaren Datenverarbeitungsplattform ausführbar sind.
  6. Verfahren zum Ausführen einer oder mehrerer Anweisungen, wobei das Verfahren aufweist: Ermitteln (302), welche eine oder welche mehreren Plattformen (126, 128, 130, 132, 134; 416, 418, 420) zur Programmausführung verfügbar sind; an jedem festgelegten Punkt des Programmcodes, Festlegen (304) einer logischen Einheit zum Ausführen aus einer Vielzahl von logischen Einheiten und Auswählen einer oder mehrerer ausführbarer Entitäten (116, 118, 120, 122, 124; 410), die der festgelegten logischen Einheit zugehörig und mit der einen oder den mehreren als verfügbar ermittelten Plattformen kompatibel sind, wobei mindestens einige der logischen Einheiten in zwei oder mehr ausführbare Entitäten kompiliert werden und es sich bei den beiden oder mehr ausführbaren Entitäten um verschiedene maschinenspezifische Kompilierungen ein und derselben logischen Einheit handelt; und Verteilen (306) der einen oder der mehreren ausgewählten ausführbaren Entitäten auf die entsprechende eine oder die mehreren als verfügbar ermittelten Plattformen, wobei die zwei oder mehr ausführbaren Einheiten, die erzeugt werden, auf ein Kompilieren des Programmcodes basieren, der die Vielzahl von logischen Einheiten umfasst, wobei die eine oder die mehreren ausführbaren Entitäten mindestens zwei Schlüssel enthalten, wobei ein Schlüssel zum Kennzeichnen der logischen Einheit, von der die eine oder die mehreren ausführbaren Funktionen kompiliert sind, und ein anderer Schlüssel zum Kennzeichnen einer Plattform dient, mit der die eine oder die mehreren ausführbaren Entitäten kompatibel sind.
  7. Verfahren nach Anspruch 6, wobei die logischen Entitäten für zwei oder mehr Kombinationen einer Universal-Datenverarbeitungsplattform, einer Spezial-Datenverarbeitungsplattform oder einer umkonfigurierbaren Datenverarbeitungsplattform kompiliert werden.
  8. Nichtflüchtige Schaltung, die Maschinenanweisungen zum Durchführen eines Verfahrens zum Ausführen einer oder mehrerer Anwendungen aufweist, wobei das Verfahren aufweist: Partitionieren (202) eines Programmcodes in zwei oder mehr logische Einheiten; und Kompilieren (204) jeder der logischen Einheiten in eine oder mehrere ausführbare Entitäten (116, 118, 120, 122, 124; 410), wobei mindestens einige der logischen Einheiten in zwei oder mehr ausführbare Entitäten kompiliert werden und es sich bei den beiden oder mehr ausführbaren Entitäten um verschiedene maschinenspezifische Kompilierungen ein und derselben logischen Einheit handelt, wobei das Kompilieren ferner ein Eingeben von logischen Einheiten in verschiedene maschinenspezifische Compiler (106, 108, 110, 112, 114; 402, 422) umfasst, um die zwei oder mehr ausführbaren Einheiten zu erzeugen; Zuweisen (206) ein und derselben Kennung zu allen ausführbaren Entitäten, die von derselben logischen Einheit kompiliert wurden, Speichern (208) der einen oder der mehreren ausführbaren Entitäten mit mindestens zwei Schlüsseln, wobei ein Schlüssel zum Kennzeichnen einer logischen Einheit, von der die eine oder die mehreren ausführbaren Funktionen kompiliert sind, und ein anderer Schlüssel zum Kennzeichnen einer Plattform (126, 128, 130, 132, 134; 416, 418, 420) dient, mit der die eine oder die mehreren ausführbaren Entitäten kompatibel sind; Ermitteln (302), welche eine oder mehreren Plattformen zur Programmausführung verfügbar sind; und an jedem festgelegten Punkt des Programmcodes, Festlegen (304) einer logischen Einheit zum Ausführen und Auswählen einer oder mehrerer ausführbarer Entitäten, die der festgelegten logischen Einheit zugehörig und mit der einen oder den mehreren als verfügbar ermittelten Plattformen kompatibel sind.
  9. Nichtflüchtige Schaltung nach Anspruch 8, wobei die logischen Einheiten für zwei oder mehr Kombinationen einer Universal-Datenverarbeitungsplattform, einer Spezial-Datenverarbeitungsplattform oder einer umkonfigurierbaren Datenverarbeitungsplattform kompiliert werden.
  10. Nichtflüchtige Schaltung nach Anspruch 9, wobei ein Hauptprogramm der logischen Einheiten auf einem anwenderprogrammierbaren Gate-Array und ein Hilfsprogramm der logischen Einheiten auf einer Zentraleinheit ausgeführt wird.
  11. Nichtflüchtige Schaltung nach Anspruch 8, wobei das Verfahren ferner ein Verteilen der einen oder der mehreren ausgewählten ausführbaren Entitäten auf die entsprechende eine oder die mehreren als verfügbar ermittelten Plattformen beinhaltet.
  12. System zum Ausführen einer oder mehrerer Anweisungen, wobei das System aufweist: einen Hardware-Prozessor (502; 510); ein Compiler-Modul (508), das zum Ausführen auf dem Hardwareprozessor (510) und ferner zum Partitionieren eines Programmcodes in zwei oder mehr logische Einheiten und zum Kompilieren jeder der logischen Einheiten in eine oder mehrere ausführbare Entitäten (116, 118, 120, 122, 124; 410) dient, wobei mindestens einige der logischen Einheiten in zwei oder mehr ausführbare Entitäten kompiliert werden und es sich bei den beiden oder mehr ausführbaren Entitäten um verschiedene maschinenspezifische Kompilierungen ein und derselben logischen Einheit handelt; und ein Laufzeitmodul (506), das zum Ausführen auf dem Hardwareprozessor (502) dient und ferner dazu dient zu ermitteln, welche eine oder welche mehreren Plattformen (126, 128, 130, 132, 134; 416, 418, 420) zur Programmausführung verfügbar sind, und an jedem festgelegten Punkt des Programmcodes dazu dient, eine logische Einheit zum Ausführen festzulegen und eine oder mehrere ausführbare Entitäten auszuwählen, die der ermittelten logischen Einheit zugehörig sind und mit der einen oder den mehreren als verfügbar ermittelten Plattformen kompatibel sind; wobei die zwei oder mehr ausführbaren Einheiten, die erzeugt werden, auf ein Kompilieren des Programmcodes basieren, der die besagten logischen Einheiten umfasst, wobei die besagte eine oder die mehreren ausführbaren Entitäten mindestens zwei Schlüsseln aufweisen, wobei ein Schlüssel zum Kennzeichnen der logischen Einheit, von der die eine oder die mehreren ausführbaren Funktionen kompiliert sind, und ein anderer Schlüssel zum Kennzeichnen einer Plattform dient, mit der die eine oder die mehreren ausführbaren Entitäten kompatibel sind.
  13. System nach Anspruch 12, wobei das Compiler-Modul ferner dazu dient, allen von derselben logischen Einheit kompilierten ausführbaren Entitäten ein und dieselbe Kennung zuzuweisen.
  14. System nach Anspruch 12, wobei das Laufzeitmodul ferner geeignet ist, die eine oder die mehreren ausgewählten ausführbaren Entitäten auf die jeweils eine oder die mehreren als verfügbar ermittelten Plattformen zu verteilen.
  15. System nach Anspruch 12, wobei die logischen Einheiten als ausführbare Funktionen auf zwei oder mehr Kombinationen einer Universal-Datenverarbeitungsplattform, einer Spezial-Datenverarbeitungsplattform oder einer umkonfigurierbaren Datenverarbeitungsplattform kompiliert werden.
  16. System nach Anspruch 12, wobei eine ausführbare Entität für alle Teile des Programms für mindestens eine spezielle Maschine erzeugt wird.
DE112012002905.4T 2011-08-02 2012-07-27 Technik zum Kompilieren und Ausführen von Programmen in höheren Programmiersprachen auf heterogenen Computern Active DE112012002905B4 (de)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/196,300 US8789026B2 (en) 2011-08-02 2011-08-02 Technique for compiling and running high-level programs on heterogeneous computers
US13/196,300 2011-08-02
PCT/US2012/048440 WO2013019575A2 (en) 2011-08-02 2012-07-27 Technique for compiling and running high-level programs on heterogeneous computers

Publications (2)

Publication Number Publication Date
DE112012002905T5 DE112012002905T5 (de) 2014-03-27
DE112012002905B4 true DE112012002905B4 (de) 2022-08-25

Family

ID=47627786

Family Applications (1)

Application Number Title Priority Date Filing Date
DE112012002905.4T Active DE112012002905B4 (de) 2011-08-02 2012-07-27 Technik zum Kompilieren und Ausführen von Programmen in höheren Programmiersprachen auf heterogenen Computern

Country Status (6)

Country Link
US (2) US8789026B2 (de)
JP (1) JP5984158B2 (de)
CN (1) CN103858099B (de)
DE (1) DE112012002905B4 (de)
GB (1) GB2508545B (de)
WO (1) WO2013019575A2 (de)

Families Citing this family (64)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8671401B2 (en) * 2007-04-09 2014-03-11 Microsoft Corporation Tiling across loop nests with possible recomputation
US8813048B2 (en) 2009-05-11 2014-08-19 Accenture Global Services Limited Single code set applications executing in a multiple platform system
US8832699B2 (en) 2009-05-11 2014-09-09 Accenture Global Services Limited Migrating processes operating on one platform to another platform in a multi-platform system
US8789026B2 (en) * 2011-08-02 2014-07-22 International Business Machines Corporation Technique for compiling and running high-level programs on heterogeneous computers
KR101894752B1 (ko) 2011-10-27 2018-09-05 삼성전자주식회사 가상 아키텍쳐 생성 장치, 런타임 시스템, 멀티 코어 시스템 및 그 동작 방법
US9262166B2 (en) * 2011-11-30 2016-02-16 Intel Corporation Efficient implementation of RSA using GPU/CPU architecture
US10261807B2 (en) 2012-05-09 2019-04-16 Nvidia Corporation Method and system for multiple embedded device links in a host executable
US9483235B2 (en) 2012-05-09 2016-11-01 Nvidia Corporation Method and system for separate compilation of device code embedded in host code
US10025643B2 (en) * 2012-05-10 2018-07-17 Nvidia Corporation System and method for compiler support for kernel launches in device code
US20140068581A1 (en) * 2012-08-30 2014-03-06 International Business Machines Corporation Optimized division of work among processors in a heterogeneous processing system
US9332083B2 (en) * 2012-11-21 2016-05-03 International Business Machines Corporation High performance, distributed, shared, data grid for distributed Java virtual machine runtime artifacts
US9378179B2 (en) 2012-11-21 2016-06-28 International Business Machines Corporation RDMA-optimized high-performance distributed cache
US9569400B2 (en) 2012-11-21 2017-02-14 International Business Machines Corporation RDMA-optimized high-performance distributed cache
US9766910B1 (en) 2013-03-07 2017-09-19 Amazon Technologies, Inc. Providing field-programmable devices in a distributed execution environment
US9619364B2 (en) 2013-03-14 2017-04-11 Nvidia Corporation Grouping and analysis of data access hazard reports
US9367291B2 (en) 2013-03-29 2016-06-14 Samsung Electronics Co., Ltd. Apparatus and method for generating vector code
US9348560B2 (en) * 2013-06-04 2016-05-24 Qualcomm Incorporated Efficient execution of graph-based programs
WO2015012711A1 (en) * 2013-07-23 2015-01-29 Huawei Technologies Co., Ltd Method for constructing a graph-based intermediate representation in a compiler
DE102013216409A1 (de) * 2013-08-19 2015-02-19 Carl Zeiss Microscopy Gmbh Mikroskop
US9229698B2 (en) 2013-11-25 2016-01-05 Nvidia Corporation Method and apparatus for compiler processing for a function marked with multiple execution spaces
US10086566B2 (en) * 2014-01-02 2018-10-02 Old World Labs Apparatus for production of three-dimensional objects by stereolithography
US9632761B2 (en) * 2014-01-13 2017-04-25 Red Hat, Inc. Distribute workload of an application to a graphics processing unit
EP2909720A1 (de) * 2014-01-13 2015-08-26 Huawei Technologies Co., Ltd. Verfahren zur musterverarbeitung
US9886736B2 (en) 2014-01-20 2018-02-06 Nvidia Corporation Selectively killing trapped multi-process service clients sharing the same hardware context
US10152312B2 (en) 2014-01-21 2018-12-11 Nvidia Corporation Dynamic compiler parallelism techniques
GB2524346B (en) * 2014-09-19 2016-12-21 Imagination Tech Ltd Separating Cores
CN104317754B (zh) * 2014-10-15 2017-03-15 中国人民解放军国防科学技术大学 面向异构计算系统的跨步数据传输优化方法
DE102014118042A1 (de) * 2014-12-05 2016-06-09 Schneider Electric Automation Gmbh Verfahren zur nachverfolgbaren Programmierung und Konfigurierung eines Geräts
US10241761B2 (en) * 2014-12-29 2019-03-26 Nvidia Corporation System and method for compiler support for compile time customization of code
WO2016114532A1 (ko) * 2015-01-16 2016-07-21 서울대학교 산학협력단 프로그램 컴파일 장치 및 프로그램 컴파일 방법
US9400685B1 (en) * 2015-01-30 2016-07-26 Huawei Technologies Co., Ltd. Dividing, scheduling, and parallel processing compiled sub-tasks on an asynchronous multi-core processor
WO2016134784A1 (en) * 2015-02-27 2016-09-01 Huawei Technologies Co., Ltd. Systems and methods for heterogeneous computing application programming interfaces (api)
US11379262B2 (en) 2015-05-26 2022-07-05 Blaize, Inc. Cascading of graph streaming processors
US11150961B2 (en) 2015-05-26 2021-10-19 Blaize, Inc. Accelerated operation of a graph streaming processor
US10437637B1 (en) 2015-05-26 2019-10-08 Thin CI, Inc. Configurable scheduler for graph processing on multi-processor computing systems
US11416282B2 (en) 2015-05-26 2022-08-16 Blaize, Inc. Configurable scheduler in a graph streaming processing system
US11436045B2 (en) 2015-05-26 2022-09-06 Blaize, Inc. Reduction of a number of stages of a graph streaming processor
US20170052799A1 (en) * 2015-08-21 2017-02-23 Microchip Technology Incorporated Integrated Circuit Device With Selectable Processor Core
US10108448B2 (en) * 2015-10-27 2018-10-23 International Business Machines Corporation Dynamic SMT
US10409560B1 (en) * 2015-11-18 2019-09-10 Amazon Technologies, Inc. Acceleration techniques for graph analysis programs
KR101906823B1 (ko) * 2016-03-07 2018-12-05 주식회사 럭스로보 멀티 모듈 컴파일 시스템 및 멀티 모듈 컴파일 방법, 그리고 컴파일러 프로그램을 갖는 컴퓨터 판독가능 저장매체
US10157440B2 (en) * 2016-09-20 2018-12-18 Intel Corporation Static data sharing mechanism for a heterogeneous processing environment
CN106843045A (zh) * 2017-01-23 2017-06-13 张军 一种基于多核异构cpu‑gpu‑fpga系统架构的嵌入式操作系统原型
CN106708777A (zh) * 2017-01-23 2017-05-24 张军 一种多核异构cpu‑gpu‑fpga系统架构
JP2018132981A (ja) * 2017-02-16 2018-08-23 日本電気株式会社 アクセラレータを有する情報処理装置および情報処理方法
CN109388428B (zh) * 2017-08-11 2021-05-04 华为技术有限公司 图层遍历方法、控制装置及数据处理系统
JP7278716B2 (ja) * 2018-05-18 2023-05-22 ヤフー株式会社 調整装置、調整方法および調整プログラム
CN112352219B (zh) * 2018-06-20 2022-07-26 华为技术有限公司 自动化编译的系统和方法
WO2020056176A1 (en) * 2018-09-13 2020-03-19 The University Of Chicago System and method of optimizing instructions for quantum computers
CA3055859A1 (en) * 2018-09-24 2020-03-24 Quadient Group Ag Method and system for operating a software application on a processor of a mobile device
CN110968320A (zh) * 2018-09-30 2020-04-07 上海登临科技有限公司 针对异构硬件架构的联合编译方法和编译系统
CN111124656B (zh) * 2018-10-31 2023-09-15 伊姆西Ip控股有限责任公司 用于向专用计算资源分配任务的方法、设备和计算机可读存储介质
US11468881B2 (en) * 2019-03-29 2022-10-11 Samsung Electronics Co., Ltd. Method and system for semantic intelligent task learning and adaptive execution
US11567555B2 (en) * 2019-08-30 2023-01-31 Intel Corporation Software assisted power management
US10996960B1 (en) 2019-11-22 2021-05-04 Blaize, Inc. Iterating single instruction, multiple-data (SIMD) instructions
US11307860B1 (en) 2019-11-22 2022-04-19 Blaize, Inc. Iterating group sum of multiple accumulate operations
US11366664B1 (en) 2019-12-08 2022-06-21 Blaize, Inc. Single instruction multiple data (simd) execution with variable width registers
CN113031954A (zh) * 2019-12-24 2021-06-25 阿里巴巴集团控股有限公司 代码编译方法、装置、电子设备、存储介质及异构系统
US11347486B2 (en) 2020-03-27 2022-05-31 Advanced Micro Devices, Inc. Compiler-initiated tile replacement to enable hardware acceleration resources
US11474798B2 (en) * 2020-08-24 2022-10-18 Huawei Technologies Co., Ltd. Method and system for optimizing access to constant memory
US11126436B1 (en) * 2020-10-05 2021-09-21 Unisys Corporation Compilation and execution of parallel code fragments
US11513845B2 (en) 2020-11-06 2022-11-29 Blaize, Inc. Configurable scheduler with pre-fetch and invalidate threads in a graph stream processing system
CN112685605A (zh) * 2020-12-24 2021-04-20 深圳科安达电子科技股份有限公司 一种报警分析方法及系统
CN113553061B (zh) * 2021-09-22 2021-12-17 西安芯瞳半导体技术有限公司 一种提升源程序执行性能的方法、装置及计算机存储介质

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2011053303A1 (en) 2009-10-30 2011-05-05 Intel Corporation Two way communication support for heterogenous processors of a computer platform

Family Cites Families (31)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3602857B2 (ja) * 1991-04-23 2004-12-15 株式会社日立製作所 多機種対応型情報処理システム、および、方法
US6738967B1 (en) * 2000-03-14 2004-05-18 Microsoft Corporation Compiling for multiple virtual machines targeting different processor architectures
US20030028864A1 (en) 2001-01-29 2003-02-06 Matt Bowen System, method and article of manufacture for successive compilations using incomplete parameters
US20030033588A1 (en) 2001-01-29 2003-02-13 John Alexander System, method and article of manufacture for using a library map to create and maintain IP cores effectively
US7103881B2 (en) * 2002-12-10 2006-09-05 Intel Corporation Virtual machine to provide compiled code to processing elements embodied on a processor device
US7603663B2 (en) * 2003-05-20 2009-10-13 Intel Corporation Apparatus and methods for restoring synchronization to object-oriented software applications in managed runtime environments
US7165162B2 (en) * 2004-01-13 2007-01-16 Hewlett-Packard Development Company, L.P. Partitioning modules for cross-module optimization
US7073159B2 (en) * 2004-03-31 2006-07-04 Intel Corporation Constraints-directed compilation for heterogeneous reconfigurable architectures
US7278122B2 (en) 2004-06-24 2007-10-02 Ftl Systems, Inc. Hardware/software design tool and language specification mechanism enabling efficient technology retargeting and optimization
US7721069B2 (en) * 2004-07-13 2010-05-18 3Plus1 Technology, Inc Low power, high performance, heterogeneous, scalable processor architecture
US7769974B2 (en) * 2004-09-10 2010-08-03 Microsoft Corporation Increasing data locality of recently accessed resources
US20060123401A1 (en) * 2004-12-02 2006-06-08 International Business Machines Corporation Method and system for exploiting parallelism on a heterogeneous multiprocessor computer system
US7478376B2 (en) * 2004-12-02 2009-01-13 International Business Machines Corporation Computer program code size partitioning method for multiple memory multi-processing systems
US7793255B1 (en) * 2005-03-01 2010-09-07 Oracle America, Inc. System and method for maintaining alternate object views
US20070283324A1 (en) * 2005-08-30 2007-12-06 Geisinger Nile J System and method for creating programs that comprise several execution layers
US7689980B2 (en) * 2005-09-30 2010-03-30 Intel Corporation Splitting the computation space to optimize parallel code
US7757222B2 (en) * 2005-09-30 2010-07-13 Intel Corporation Generating efficient parallel code using partitioning, coalescing, and degenerative loop and guard removal
US7793278B2 (en) * 2005-09-30 2010-09-07 Intel Corporation Systems and methods for affine-partitioning programs onto multiple processing units
JP4936517B2 (ja) * 2006-06-06 2012-05-23 学校法人早稲田大学 ヘテロジニアス・マルチプロセッサシステムの制御方法及びマルチグレイン並列化コンパイラ
US8453132B2 (en) * 2006-07-28 2013-05-28 Hewlett-Packard Development Company, L.P. System and method for recompiling code based on locality domain and thread affinity in NUMA computer systems
US20080189690A1 (en) 2007-02-01 2008-08-07 International Business Machines Corporation Method for persisting or transferring an xcodes execution plan in a self-contained, platform independent format
US8286196B2 (en) * 2007-05-03 2012-10-09 Apple Inc. Parallel runtime execution on multiple processors
US8296743B2 (en) * 2007-12-17 2012-10-23 Intel Corporation Compiler and runtime for heterogeneous multiprocessor systems
US8386664B2 (en) * 2008-05-22 2013-02-26 International Business Machines Corporation Reducing runtime coherency checking with global data flow analysis
US8281295B2 (en) * 2008-05-23 2012-10-02 International Business Machines Corporation Computer analysis and runtime coherency checking
US8286198B2 (en) * 2008-06-06 2012-10-09 Apple Inc. Application programming interfaces for data parallel computing on multiple processors
US8527962B2 (en) * 2009-03-10 2013-09-03 International Business Machines Corporation Promotion of a child procedure in heterogeneous architecture software
US8799879B2 (en) * 2009-06-30 2014-08-05 Oracle America, Inc. Method and apparatus for protecting translated code in a virtual machine
US8495604B2 (en) * 2009-12-30 2013-07-23 International Business Machines Corporation Dynamically distribute a multi-dimensional work set across a multi-core system
US8407322B1 (en) * 2010-08-24 2013-03-26 Adobe Systems Incorporated Runtime negotiation of execution blocks between computers
US8789026B2 (en) * 2011-08-02 2014-07-22 International Business Machines Corporation Technique for compiling and running high-level programs on heterogeneous computers

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2011053303A1 (en) 2009-10-30 2011-05-05 Intel Corporation Two way communication support for heterogenous processors of a computer platform

Also Published As

Publication number Publication date
GB2508545B (en) 2020-05-20
DE112012002905T5 (de) 2014-03-27
GB201403456D0 (en) 2014-04-16
CN103858099B (zh) 2017-03-01
JP2014524607A (ja) 2014-09-22
JP5984158B2 (ja) 2016-09-06
WO2013019575A3 (en) 2014-05-08
GB2508545A (en) 2014-06-04
CN103858099A (zh) 2014-06-11
US8938725B2 (en) 2015-01-20
US20130036408A1 (en) 2013-02-07
WO2013019575A2 (en) 2013-02-07
US20130036409A1 (en) 2013-02-07
US8789026B2 (en) 2014-07-22

Similar Documents

Publication Publication Date Title
DE112012002905B4 (de) Technik zum Kompilieren und Ausführen von Programmen in höheren Programmiersprachen auf heterogenen Computern
Gao et al. Estimating gpu memory consumption of deep learning models
DE112010005705T5 (de) Umplanen von Workload in einer hybriden Datenverarbeitungsumgebung
DE202011110864U1 (de) Parallele Verarbeitung von Daten
DE112011101469T5 (de) Kompilieren von Software für ein hierarchisches verteiltes Verarbeitungssystem
Asaadi et al. A comparative survey of the HPC and big data paradigms: Analysis and experiments
DE102021102589A1 (de) Berechnungsgraph-optimierung
DE102019119956A1 (de) Architektur und verfahren zur datenparallelen einzelprogramm- mehrfachdaten(spmd)-ausführung
DE102017213160B4 (de) Kompilierung für knotenvorrichtungs-GPU-basierte Parallelverarbeitung
DE102020110655A1 (de) Verfahren und vorrichtung zum verbessern der verwendung eines heterogenen systems, das software ausführt
Sourouri et al. Panda: A compiler framework for concurrent cpu+ gpu execution of 3d stencil computations on gpu-accelerated supercomputers
DE102021104970A1 (de) Kooperative parallele speicherzuteilung
DE102013019333A1 (de) Registerzuweisung für als cluster vorliegende mehrebenen-registerdaten
DE112022001140T5 (de) Durchführung einer matrixwertangabe
DE102021103492A1 (de) Anwendungsprogrammierschnittstelle zum beschleunigen von matrixoperationen
DE102016110195A1 (de) Erzeugen von Code in statisch typisierten Programmiersprachen für eine dynamisch typisierte array-basierte Sprache
Totoni et al. HPAT: high performance analytics with scripting ease-of-use
Martineau et al. The productivity, portability and performance of OpenMP 4.5 for scientific applications targeting Intel CPUs, IBM CPUs, and NVIDIA GPUs
DE102022129946A1 (de) Verfahren und vorrichtungen zum bestimmen eines verfeinerten kontexts für softwarefehlererkennung und - korrektur
DE102018208267A1 (de) Technologie zum verwenden von steuerabhängigkeitsgraphen für das konvertieren von steuerflussprogrammen in datenflussprogramme
Ahmed et al. Design considerations for workflow management systems use in production genomics research and the clinic
DE112022003222T5 (de) Multi-architektur-ausführungsgraphen
Kumar et al. An integrated framework for performance-based optimization of scientific workflows
DE112022002953T5 (de) Parallele verarbeitung von thread-gruppen
DE102022114509A1 (de) Speicherzuweisung unter verwendung von graphen

Legal Events

Date Code Title Description
R012 Request for examination validly filed
R079 Amendment of ipc main class

Free format text: PREVIOUS MAIN CLASS: G06F0009450000

Ipc: G06F0009440000

R016 Response to examination communication
R079 Amendment of ipc main class

Free format text: PREVIOUS MAIN CLASS: G06F0009440000

Ipc: G06F0015160000

R018 Grant decision by examination section/examining division
R084 Declaration of willingness to licence
R020 Patent grant now final