4872

Multithreading in GAUSS

Was ist Threading?

Mit GAUSS kann die Leistungsstärke und Geschwindigkeit von Multikern-, Multiprozessor- und Hyperthreading-Systemen genutzt werden.

GAUSS umfasst Funktionen für das Multithreading von Programme sowie Array-Unterstützung in Operatoren. Mit den Threading-Funktionen können unabhängige Abschnitte im Programm definiert werden, die gleichzeitig laufen. Diese Threads teilen den gleichen Arbeitsbereich und können alle auf die gleichen Symbole, Prozeduren und Schlüsselwörter zugreifen. Es können so viele Threads erstellt werden, wie benötigt, indem alle verfügbaren Prozessoren genutzt werden.

Alle Threads in einer Definition laufen gleichzeitig und können überall im Programm definiert werden, auch innerhalb von Prozeduren. Threads können innerhalb von anderen Threads erstellt werden, d.h., alle Programmteile von Programmen oder Bibliotheken können mit Multithreading bearbeitet werden.

Einzelheiten

Die Verwendung von Threads im Code ermöglicht es, die verfügbaren Prozessoren des Systems besser zu nutzen. Das Teilen des Codes in mehrere gleichzeitig laufende Threads kann die Gesamtverarbeitungszeit des Programms verringern.

In der Abbildung rechts ist eine Definition zu sehen, die vier Threads erstellt. Jeder Thread arbeitet zur gleichen Zeit wie die anderen. Das Programm wartet beim Befehl ThreadJoin, dass alle Threads beendet sind. Wenn die Threads abgeschlossen sind, läuft Ihr Programm weiter, wobei es die Ergebnisse verwendet. In dem vorliegenden Beispiel könnte dieser Code-Block auf einem Computersystem mit vier CPU-Kernen möglicherweise viermal schneller laufen.

Thread-Funktionen

  • ThreadStat
  • ThreadBegin
  • ThreadEnd
  • ThreadJoin

Threads können überall erstellt werden - im Hauptcode, in Prozeduren oder in Schlüsselwörtern. Threads können auch innerhalb von anderen Threads erstellt werden. Das bedeutet, dass so gut wie alles mit Multithreading bearbeitet und von überall im Programm aufgerufen werden kann.

ThreadStat

Der Befehl ThreadStat ermöglicht es, eine einzelne Anweisung als einen individuellen Thread zu definieren. Üblicherweise ist dies eine Zeile, die einige Laufzeit in Anspruch nimmt und gleichzeitig mit anderen Threads laufen kann.

Beispiel

ThreadStat n = m’m;

ThreadBegin, ThreadEnd

Die Befehle ThreadBegin und ThreadEnd werden verwendet, um einen mehrzeiligen Code-Block zu definieren, der als ein Thread ausgeführt wird. ThreadBegin markiert den Beginn des Blocks, ThreadEnd markiert das Ende.

Beispiel

ThreadBegin;
y = x’x;
z = a’a;
ThreadEnd;

ThreadJoin

ThreadJoin folgt dem abschließenden Befehl ThreadEnd oder ThreadStat, um eine Thread-Definition abzuschließen. Das Programm wartet beim Befehl ThreadJoin, dass alle Threads im vorherigen Satz beendet sind und fährt dann fort.

Beispiel

ThreadBegin; // Thread 1
y = x’x;
z = a’a;
ThreadEnd;
ThreadBegin; // Thread 2
q = r’r;
r = s’s;
ThreadEnd;
ThreadStat n = m’m; // Thread 3
ThreadStat
p = o’o; // Thread 4
ThreadJoin;
// Program waits for all
// threads to complete
b = z + r
+ nn’p;