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

Informatiker Board » Themengebiete » Praktische Informatik » Parallele Matrixmultiplikation » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Der letzte Beitrag
Liquid Parallele Matrixmultiplikation

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