Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Parallele Matrixmultiplikation » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Parallele Matrixmultiplikation
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Liquid
Grünschnabel


Dabei seit: 09.02.2017
Beiträge: 6

Parallele Matrixmultiplikation Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Wir sollen gerade eine parallele Matrixmultiplikation implementieren und wir haben dafür auch Pseudo-Code gekriegt aber leider komme ich damit nicht ganz klar. Wir sollen nämlich die Matrizen zunächst in Submatrizen aufteilen, dann parallel multiplizieren und dann wieder die Ergebnissubmatrizen aus der gesplitteten Matrix bilden. Leider ist der Pseudo-Code aber absolut nicht vollständig und unser Prof. hat da auch nicht großartig mehr zu gesagt, außer das am Anfang die Matrizen A und B gesplittet werden solllen und am Ende soll die Ergebnismatrix aus der gesplitteten Matrix C, die berechnet wrude gebildet werden und das nur die Berechnung parallel sein soll.

Da ich leider aber mit der Unterteilung in die Submatrizen klar komme, komme ich leider auch mit dem gesamten nicht weiter. Den Pseudo-Code habe ich als Anhang hochgeladen und hier ist das, was ich bis jetzt habe:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
public static Matrix multParallel(final Matrix matA, final Matrix matB) {	
    Matrix[][] matASplit = split(matA);
    Matrix[][] matBSplit = split(matB);
    
    final int matASplitRows = matASplit.length;
    final int matBSplitCols = matBSplit[0].length;
    final int cpuCount = Runtime.getRuntime().availableProcessors();
    Matrix[][] matCSplit = new Matrix[matASplitRows][matBSplitCols];
    
    TimeUnit tUnit = TimeUnit.MINUTES;
    BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(matASplitRows * matBSplitCols + 1);
    ThreadPoolExecutor threadpool = new ThreadPoolExecutor(cpuCount, cpuCount + 2, 10, tUnit, workQueue);
	    
    for(int i = 0; i < matASplit.length; i++) {
    	final int iF = i;
    	for(int l = 0; l < matBSplit[0].length; l++) {
    	    final int lF = l;
	    threadpool.execute(new Runnable() {    	
                int j, k;
	        @Override
	        public void run() {
	            for(j = 0, k = 0; j < 1; j++, k++) { 
	                matCSplit[iF][lF].data[j][k] += matASplit[iF][lF].data[j][1] * matBSplit[iF][lF].data[1][k] + matASplit[iF][lF].data[j][2] * matBSplit[iF][lF].data[2][k]; 
	            }
	        }
	    });
    	}
    }
    
    try {
	threadpool.shutdown();
	if(!threadpool.awaitTermination(500, TimeUnit.MILLISECONDS)) {
            threadpool.shutdownNow();
	    threadpool.awaitTermination(500, TimeUnit.MILLISECONDS);
        }
    } catch(InterruptedException e) {
        e.printStackTrace();
    }
	
    return Matrix.merge(matCSplit);
}


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
private static Matrix[][] split(Matrix mat) {
	int currentRowIndex = 0;
	int currentColIndex = 0;
	int currentNewMatRow = 0;
	int currentNewColRow = 0;
	final int rowsOfMat = mat.getNumberOfRows();
	final int colsOfMat = mat.getNumberOfColumns();
	Matrix[][] splittedMatrix = new Matrix[rowsOfMat * 100][colsOfMat * 100];
	
	while(currentRowIndex < (rowsOfMat - 1)) {
		while(currentColIndex < (colsOfMat - 1)) {
			double[][] newMatData = new double[2][2];
			for(int j = 0; j < 2; j++) {
				for(int k = 0; k < 2; k++) {
					newMatData[j][k] = mat.data[currentRowIndex + j][currentColIndex + k];
				}
			}
			currentColIndex += 2;
			splittedMatrix[currentNewMatRow][currentNewColRow++] = new Matrix(newMatData);
		}
		currentNewMatRow++;
		currentColIndex = 0;
		currentRowIndex += 2;
	}
	return splittedMatrix;	
}


Ich bin mir ehrlich gesagt aber absolut nicht sicher, ob ich so richtig die Untermatrizen in der split Methode gebildet habe und ich weiß auch nicht, wie ich da die Anzahl an Zeilen und Spalten berechnen soll, die für die gesplittete Matrix gebraucht werden. Die Rechnung ist natürlich so noch nicht korrekt, aber ich wollte einfach erst einmal ein weng diskutieren, ob ich das bis dahin so richtig habe und ein wenig Hilfe einholen.

Man brauch doch auch dieses 2D-Array aus Matrizen, denn eine Dimension würde ja noch nicht reichen oder würde eine auch reichen? Ich bin gerade total verwirrt, deswegen frage ich hier mal lieber nach.

Liquid hat dieses Bild (verkleinerte Version) angehängt:
parMatMult.jpg

Dieser Beitrag wurde 10 mal editiert, zum letzten Mal von Liquid: 27.11.2017 05:23.

27.11.2017 05:13 Liquid ist offline Beiträge von Liquid suchen Nehmen Sie Liquid in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Parallele Matrixmultiplikation