HPC - Prodotto matrice-matrice SIMD

Moreno Marzolla moreno.marzolla@unibo.it

Ultimo aggiornamento: 2021-05-15

Il file simd-matmul.c contiene la versione seriale del prodotto matrice-matrice \(r=p \times q\), sia nella versione normale che nella versione cache-efficient che traspone la matrice \(q\) per sfruttare al meglio la cache (ne abbiamo parlato a lezione).

La versione cache-efficient può essere usata per trarre vantaggio dalle estensioni SIMD del processore, in quanto il prodotto riga-colonna diventa un prodotto riga-riga. Osserviamo che il corpo della funzione scalar_matmul_tr()

    for (i=0; i<n; i++) {
        for (j=0; j<n; j++) {
            double s = 0.0;
            for (k=0; k<n; k++) {
                s += p[i*n + k] * qT[j*n + k];
            }
            r[i*n + j] = s;
        }
    }

calcola il prodotto scalare di due vettori di \(n\) elementi memorizzati a partire dagli indirizzi di memoria \((p + i \times n)\) e \((\mathit{qT} + j \times n)\). Sfruttando il calcolo SIMD del prodotto scalare, realizzare la funzione simd_matmul_tr() in cui il prodotto scalare di cui sopra viene calcolato usando i vector datatype del compilatore. Si garantisce che le dimensioni delle matrici siano multiple della lunghezza dei vettori SIMD.

Si presti attenzione che in questo esercizio si usa il tipo double; è pertanto necessario definire un tipo vettoriale v2d, di ampiezza 16 Byte e composto da due valori double, utilizzando una dichiarazione simile a quella vista a lezione:

    typedef double v2d __attribute__((vector_size(16)));
    #define VLEN (sizeof(v2d)/sizeof(double))

Il server usato per le esercitazioni supporta le estensioni SIMD di Intel fino ad AVX2, e quindi dispone di registri SIMD di ampiezza 256 bit = 32 Byte. Si provi a modificare la propria implementazione per sfruttare un tipo vettoriale v4d contenente quattro valori double.

Compilare con:

    gcc -march=native -O2 -std=c99 -Wall -Wpedantic -D_XOPEN_SOURCE=600 simd-matmul.c -o simd-matmul

Eseguire con

    ./simd-matmul [matrix size]

Esempio:

    ./simd-matmul 1024

File