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;