Qual è l'overhead nella moltiplicazione delle matrici sparse


10

La moltiplicazione di matrici (sia Mat * Mat, sia Mat * Vec) viene ridimensionata con il numero di non zeri o con le dimensioni della matrice? O una combinazione dei due.

Che dire con la forma.

Ad esempio, ho una matrice 100 x 100 con 100 valori o una matrice 1000 x 1000 con 100 valori.

Quando si quadrano queste matrici (o si moltiplicano per matrici simili con sparsità simili), il primo (100x100) sarà più veloce del secondo (1000x1000)? Dipende da dove sono i valori?

Se dipende dall'implementazione, sono interessato alla risposta per PETSc.

Risposte:


11

Il costo della moltiplicazione matrice-vettore sparsa si ridimensiona linearmente con il numero di voci diverse da zero, poiché ogni voce viene moltiplicata una volta per una voce nel vettore.

Il costo della moltiplicazione matrice-matrice sparsa dipende fortemente dalla struttura dei nonzeros. Ad esempio, considera la quadratura di una matrice sparsa che ha una struttura a punta di freccia :UN

UN=(δ1β1δ2β2δn-1βn-1γ1γ2γn-1δn),

allora ha O ( n ) nonzeros, ma A 2 è denso. Esiste una ben nota interpretazione grafica di questo fenomeno: ogni percorso di lunghezza 1 o 2 nel grafico di A diventa un bordo nel grafico di A 2 (ovvero una voce diversa da zero in A 2 ).UNO(n)UN2UNUN2UN2


4

Innanzitutto, dipende dall'implementazione. Se si implementa una matrice sparsa come una matrice densa e si riempiono i valori diversi da zero, si ridimensionerà con la dimensione complessiva della matrice. Se è memorizzato come diverso da zero, verrà ridimensionato man mano che il tempo di accesso si ridimensiona con la dimensione della matrice.

Nella documentazione PETSc , spiega che l'archiviazione predefinita per matrici sparse è l'archiviazione di righe compresse, che si ridimensiona con il numero di righe e il numero di valori diversi da zero per riga. Quindi mi aspetto che un MatMat si ridimensioni ampiamente con il quadrato di questa misura; cioè .O(r2n2)

Una cosa da notare, tuttavia, è che non ha senso memorizzare ciò che non c'è; se ti interessa questa prestazione, perché stai memorizzando 100 valori per una matrice 1000x1000? Ciò significa che almeno il 90% delle righe / colonne non ha alcun valore diverso da zero e potrebbe essere completamente rimosso dalla matrice. Se il modello di valori diversi da zero non cambia, prendere in considerazione la rimozione delle righe sempre tutte zero da questa e dalla matrice di destinazione; eliminerà circa il 90% dello sforzo, lasciando le prestazioni delle due matrici (100 2 , 1000 2 ) sostanzialmente equivalenti.


Righe e colonne vuote spesso hanno una funzione rispetto a un problema (ad esempio mantenendo una mappatura uniforme tra il numero di riga e la posizione in un'immagine ad esempio) Ci sarà comunque un compromesso che non si sbarazzerà di questi.
meawoppl

Esattamente; peggiorare le prestazioni di runtime di circa 10 volte solo per mantenere una mappatura che è possibile memorizzare in un singolo array di 100 pollici non è un normale compromesso. Dal momento che la domanda riguardava le prestazioni come la dimensione in bianco delle scale della matrice, questo è un punto piuttosto importante in particolare per PETSc, come ha chiesto.
Phil H,

3

Un modello completo di prestazioni SpMV è riportato in questo documento . Mostra chiaramente che il principale limitatore è la larghezza di banda, sebbene sia possibile ridurre l'onere utilizzando più vettori. Dopo di che ti imbatti in limiti di problemi di istruzione e un limite di istruzioni di scrittura in sospeso credo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.