Gauß-Elimination

Gauß-Elimination soll ein System linearer Gleichungen in eine obere Dreiecksmatrix zu transformieren, um die Unbekannten zu lösen und eine Lösung abzuleiten. Eine Schwenksäule wird verwendet, um die Reihen, bevor sie zu verringern; dann nach der Transformation Rücksubstitution angewandt wird.

Gaußsche Eliminations ist ein Verfahren für die Matrixgleichungen der Form zu lösen

(1) Um Gaußschen Eliminationsvorgang mit dem System von Gleichungen Ausgang

(4) Lösen der Gleichung der -ten Zeile für. dann ersetzt wieder in die Gleichung der (k-1) -te Zeile zu
erhalten, die eine Lösung für Xk-1, usw. nach der Formel

nbspnbspfor (int i = 0; i

MPI parallel Ergebnisse unter Verwendung von 2-Prozessoren

Da die ammount der Zeit auszuführen, um der Rückwärtssubstitutionsschritt minimal ist, wenn auf die Vorwärts Eliminierung verglichen es am besten sequentiell durchgeführt wird.

Die obigen Tabellen zeigen die Zeit verbringen Berechnungen vs Netzwerk-Kommunikation für die Vorwärtseliminationsphase zu tun.

Der wichtigste Aspekt der Gauß-Elimination ist Kommunikationszeiten. Da der Algorithmus auf so viele Daten Arbeit im Zusammenhang beruht (im Gegensatz zur Aufgabe betreffenden) die Kommunikationszeit des MPI nicht gemeinsam genutzten Speicher implimentation den Schatten in beträchtlichem Ausmaß die Arbeitsbelastung der Zeit. Deshalb ist diese MPI-Lösung ist kleiner als ein Shared-Memory-implimentation auf der gleichen Maschine.

Dieses Gaußschen Eliminations Beispiel durch Farhan Ahmad verwendet den Standard-Algorithmus mit Rücksubstitution ein lineares System zu lösen. Es ist in C ++ unter Verwendung von Standard CUDA C-Erweiterungen implementiert. Die Daten werden aus einer Textdatei lesen, um die Matrizen zu laden. Sie können hier Ahmad Quellcode einsehen und herunterladen.

DeviceFunc.cu

#ifndef __Common_H #define __Common_H #endif Leere getvalue (float ** int. *); nichtig DeviceFunc (float * int float *..);

Der Code ist relativ einfach. Weil es in C ++, die Hauptfunktion kompiliert getrennt vom CUDA Code erfolgt. Dieser Teil des Programms wird auf der Host-Standardprozessor wie ein normales C ++ Programm. Es liest die Daten aus einer externen Datei. dann überträgt die Steuerung an die Vorrichtung in DeviceFunc.cu. Hier Speicher zugeordnet sind und von dem Hauptprozessor in die Grafikverarbeitungseinheit übertragen. Er bereitet eine Ausführungskonfiguration und startet dann den Kernel, die der tatsächliche Gaußsche Eliminations Code parallel von der GPU ausgeführt werden soll.

Obwohl die „typische“ Gauß-Elimination in CUDA getan werden kann, haben mehrere Studien festgestellt, dass es effizientere Wege gibt, um den Algorithmus zu parallelisieren, indem sie einige Anpassungen. In einer Studie von Xinggao Xia und Jong Chul Lee, anstatt nur die Zeilen vor dem Dreh löschen, alle anderen Reihen auf Null reduziert werden. Sobald jede Spalte abgeschlossen ist, wird keine Rücksubstitution erforderlich. Teilpivotisierung wird auch, um die Richtigkeit der Antwort verwendet.

In einer anderen Studie von Aydin Buluc, John Gilbert, und Ceren Budak, stellten sie fest, dass während der Rekursion auf einer CUDA GPU nicht möglich ist, es auf dem Host-CPU ist. Wenn Rekursion auf dem Host verwendet wird, trennt es die Rekursion Stapel aus dem Gleitkommaoperationen durch die GPU getan, so dass man sich nicht mit der anderen nicht stört. Sie nutzen diesen so genannten „rekursive optimierte“ -Technik, zusammen mit anderen Verbesserungen wie Speicher Koaleszier- und optimierten primitive Variablen, um einen maximale Beschleunigung zu erreichen.

Xia und Lee Präsentation finden Sie hier.
Buluc et. al. ‚S Papier auf verschiedenen Gaussian-Elimination Stil Algorithmen für GPGPU ist hier zu finden.

In Verbindung stehende Artikel