Matrix-Matrix-Multiplikation mit mehreren Threads

Es liegt nun sehr nahe, auch die Matrix-Matrix-Multiplikation zu parallelisieren mit Hilfe der Vorlesungsbibliothek und den vorgestellten Techniken. Im Vergleich zu vorher ist es dabei sinnvoll, die Matrix C zweidimensional zu zerlegen, d.h. in einzelne Teilblöcke \(\mathbf{C}_{i,j}\), die sich unabhängig voneinander als Produkt eines Zeilenbereichs \(\mathbf{A}_i\) und Spaltenbereichs \(\mathbf{B}_j\) berechnen lassen.

Entwickeln Sie eine auf der Template-Funktion mm (in der Header-Datei hpc/matvec/mm.h) beruhende Fassung mm, die als zusätzliche Parameter nof_row_threads und nof_col_threads erhält. Aus diesen beiden Parametern ergibt sich dann die Aufteilung der Matrix \(C\) in die Blöcke \(\mathbf{C}_{i,j}\). Überlegen Sie sich im Hauptprogramm, wie Sie die Zahl der insgesamt zur Verfügung stehenden Threads möglichst gut zweidimensional aufteilen können.

Vergleichen Sie die Ausführungszeiten und die MFLOPs zwischen Ihrer parallelisierten Fassung und der nicht parallelisierten Version. Fügen Sie noch eine Spalte mit dem Speedup-Faktor hinzu. Vergleichen Sie die Ausführungszeiten einer wirklich zweidimensionalen Aufteilung (mit nof_row_threads > 1 && nof_col_threads > 1) mit Varianten, bei denen entweder nof_row_threads == 1 oder nof_col_threads == 1.