Nebenläufigkeit / parallele Programmierung
Einstieg
Spiel
Die folgenden Reiter stellen einen spielerischen Einsteig in Nebenläufigkeit und Matrizenmultiplikation dar.
Quelle: https://www.flickr.com/photos/intel_de/9665496564, Lizenz: Attribution-ShareAlike 2.0 Generic
Prozess startet ... Herzlich willkommen hier im Mehrkernprozessor! Ihr seid heute Prozessorkerne (auch Rechenkerne, engl. core) im Mehrkernprozessor.
Matrixmultiplikationen spielen in vielen Bereichen eine bedeutende Rolle, z. B. bei neuronalen Netzen oder der Computergrafik in der Informatik oder Übergangsmatrizen in der Wirtschaftsmathematik.
🌱 Aufgabe
Ihr erhaltet gleich als Kurs zwei 5x5-Matrizen und , die ihr ohne Hilfsmittel möglichst schnell multiplizieren und das Ergebnis in der Tafel notieren sollt. Überlegt euch eine sinnvolle Strategie! Runde 1 startet in 5 Minuten ...
💁 Hilfestellungen
In der Abbildung unten siehst du die Multiplikation der Matrizen und auszugsweise dargetellt.
Zum Üben: 🔗 Matrixmultiplikation mit matrixmultiplication.xyz
Platz | Gruppe | Jahr | Zeit | Anzahl der Prozessoren | Zeit pro Prozessor |
---|---|---|---|---|---|
1 | Studienfach Informatik am Oberstufen-Kolleg | 2025 | – | – |
Extra
Wie viele Prozoessoren und Kerne hat mein (Linux-)Rechner?
Befehle für die Linux-Shell
lscpu
lscpu | egrep 'Model name|Socket|Thread|NUMA|CPU\(s\)'
lscpu -p
cat /proc/cpuinfo
Übersicht über die logischen Prozessoren:
grep '^processor' /proc/cpuinfo
Übersicht über die physischen Prozossoren:
awk '/^physical id/ && s[$NF]++==0' /proc/cpuinfo
Übersicht über die Prozessorkerne:
awk -F: '/^physical id/ {ph=$NF} /^core id/ && a[ph,$NF]++==0' /proc/cpuinfo
Thema
Scratch ...
Programmierung
Wiederholungsübungen zu zweidimensionalen Arrays
Übung zu zweidimensionalen Arrays (Runestone Academy)
Programmieraufgaben
-
👤 Lege ein neues Java-Projekt
MatrixMultiplication
inIntelliJ
mit den KlassenMain
undMatrixMultiplicator
an. -
👤 Deklariere die folgenden Instanzvariablen:
private int[][] matA, matB, matC
für die beiden Eingabematrizen A und B sowie für die Ausgabematrix C. Deklariere eine Integer-VariablematrixSize
, die die Größe der Matrix verwaltet. -
👤 Implementiere einen Konstruktoren für die Klasse
MatrixMultiplicator
, der als Parameter die Größe der (quadratischen) Matrizen erwartet. Instanziiere ein Objekt vom TypMatrixMultiplicator
in der KlasseMain
. -
👤 Implementiere in der Klasse
MatrixMultiplicator
eine Methode mit dem Methodenkopfpublic void generateRandomValues()
. Diese soll die Matrizen A und B mit zufälligen Werten füllen. Deklariere (private Random rand;
), instanziiere (rand = new Random();
) und verwende (matA[i][j] = rand.nextInt(10));
) dazu ein Objekt vom TypRandom
. -
👤 Implementiere in der Klasse
MatrixMultiplicator
eine Methode mit dem Methodenkopfpublic void displayMatrixA()
. Diese soll zeilenweise die Matrix auf der Konsole ausgeben. Erweitere deine Implementierung um eine Methodepublic void displayMatrixB()
. -
👤 Implementiere die Matrixmultiplikation in einer Methode
public void multiplyWithoutThreads
. -
👤 Teste deine Implementierung in der Klasse
Main
mit einfachen 2x2-Matrizen, bei denen diu die Lösung händisch überprüfen kannst.
Wir betrachten zunächst die parallelisierte Multiplikation von 3x3-Matrizen mit Hilfe von drei Threads.
-
👤 Ergänze den folgenden Programmcode der privaten Klasse
Worker3x3
und der Methodemultiply3x3UsingThreads
in der KlasseMatrixMultiplicator
und ergänze die Kommentare.private class Worker3x3 implements Runnable { private int i; Worker3x3(int pI) { i = pI; } public void run() { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { matC[i][j] += matA[i][k] * matB[k][j]; } } } }
public void multiply3x3UsingThreads() { matC = new int[3][3]; Thread thread0 = new Thread(new Worker3x3(0)); thread0.start(); Thread thread1 = new Thread(new Worker3x3(1)); thread1.start(); Thread thread2 = new Thread(new Worker3x3(2)); thread2.start(); try { thread0.join(); thread1.join(); thread2.join(); } catch (Exception e) { System.out.println(e.getMessage()); } }
-
👤 Füge den folgenden Programmcode in die Klasse
M̀ain
ein und überprüfe, ob die Berechnungen korrekt durchgeführt werden.MatrixMultiplication myMatrixMultiplicator = new MatrixMultiplication(3); myMatrixMultiplicator.generateRandomValues(); myMatrixMultiplicator.displayMatrixA(); myMatrixMultiplicator.displayMatrixB(); myMatrixMultiplicator.multiply3x3UsingThreads(); myMatrixMultiplicator.displayMatrixC();
-
👤 Ändere das Programm so ab, dass es mit Hilfe von fünf Threads zwei 5x5-Matrizen miteinander multipliziert.
Nun betrachten wir beliebig große Matrizen. Beispielsweise soll die Matrixmultiplikation zweier 500x500-Matrizen mittels 500 Threads realisiert werden.
- 👤 Modifiziere das Programm geeignet.
Quellen
- Introduction to Parallel Programming (RWTH Aachen)
- Amdahlsches Gesetz (Wikipedia)
- Nebenläufigkeit (Wikipedia)
- GeeksforGeeks: How to Perform Java Parallel Matrix Multiplication?