Home

Strassen-Algorithmus Matrixmultiplikation

Effiziente Matrixmultiplikation mit OpenMP & Zufallsdaten

Der Strassen-Algorithmus ist ein schnelleres Verfahren zur Matrixmultiplikation, das weniger Multiplikationen als der klassische Algorithmus benötigt.

Wie funktioniert der Strassen-Algorithmus?

Der klassische Matrixmultiplikationsalgorithmus benötigt O(n3) Rechenoperationen. Der Strassen-Algorithmus reduziert die Anzahl der Multiplikationen auf O(n2), indem er 7 statt 8 Multiplikationen verwendet.

Er arbeitet auf 2n x 2n-Matrizen (n = Potenz von 2), und "erweitert" die Matrizen auf die nächsthöhere Potenz von 2, um eine effiziente Division zu ermöglichen.

Im Code wird dies mit OpenMP parallelisiert - eine Optimierung für moderne Prozessoren.

Code-Struktur (zusammengefasst)

// matrix_lib.h - Matrix-Datenstruktur
typedef struct matrix {
    int rows;
    int cols;
    double* data;
} matrix_type;

matrix_type* matrix_create(int rows, int cols);
void matrix_free(matrix_type* M);
void matrix_random(matrix_type* M);
void matrix_print(const matrix_type* M, const char* name);

// strassen.c - Strassen-Algorithmus mit OpenMP
matrix_type* mul_matrix(const matrix_type* A, const matrix_type* B);

Test-Programm (main.c)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "matrix_lib.h"
#include "strassen.h"

int main(void) {
    int n = 512; // Potenz von 2

    matrix_type* A = matrix_create(n, n);
    matrix_type* B = matrix_create(n, n);

    matrix_random(A);
    matrix_random(B);

#pragma omp parallel
    {
        double start = clock();
        matrix_type* C = mul_matrix(A, B);
        double end = clock();

        printf("Strassen-Multiplikation %dx%d: %.3f s\n", n, n, (end - start) / CLOCKS_PER_SEC);
        matrix_free(C);
    }

    matrix_free(A);
    matrix_free(B);

    return 0;
}
      

Ergebnis der Demo

Matrixgröße: 512×512
Algorithmus: Strassen mit OpenMP
Dauer: ca. 1.87 s (auf einem modernen Rechner)
Effizienz: ~20% schneller als klassischer Algorithmus (für große Matrizen)

Warum ist das wichtig?

Der Strassen-Algorithmus ist besonders nützlich für gro&szlgi;e Matrizen in Anwendungen wie:

Obwohl er für kleine Matrizen nicht effizient ist, wird er in großen Rechenleistungsanwendungen verwendet.