Il modo più veloce per trovare autovetture di una piccola matrice non simmetrica su una GPU nella memoria condivisa


9

Ho un problema in cui devo trovare tutti gli autovalori positivi (come nell'autovalore è positivo) di una matrice non simmetrica piccola (generalmente inferiore a 60x60). Posso smettere di calcolare quando l'autovalore è inferiore a una determinata soglia. So che gli autovalori sono reali. Qualche suggerimento sugli algoritmi che potrei usare per provare a ottenere le migliori prestazioni? Devo fare diverse migliaia di queste decomposizioni, quindi la velocità è importante.

Grazie in anticipo.

EDIT: Devo farlo sulla GPU nella memoria condivisa. Anche le matrici non hanno necessariamente le stesse dimensioni. Non sono a conoscenza di biblioteche che lo facciano al momento. Sarebbero apprezzati suggerimenti di algoritmi che sarebbero adatti al problema.


1
Se ho capito bene, hai un kernel CUDA che calcola migliaia di piccole matrici nella memoria condivisa e non sei disposto a copiarle nella memoria globale. Prima di provare a dare una risposta, ci sono alcuni punti da chiarire. In CUDA la durata della memoria condivisa è destinata a bloccare la durata: quanti thread hai per ciascuna matrice decomporsi? Le prestazioni estreme sono davvero importanti? (In che modo i tempi di estrazione degli autovalori previsti sono paragonabili ai tempi di generazione della matrice?) In base a quale argomento sai che l'eigensystem è reale? L'eigensystem può essere difettoso?
Stefano M,

Ciao Stefano e grazie per il tuo commento. Per ora, avrò il multiplo più vicino della dimensione dell'ordito alla dimensione della matrice che vorrei decomporre. I tempi di generazione della matrice variano molto e ci sono casi in cui il tempo di generazione della matrice è più costoso, ma ci sono molte situazioni in cui il tempo di generazione della matrice è inferiore alla decomposizione. So che gli autovalori sono reali a causa del modo in cui la matrice viene generata. Preferirei non entrare nei dettagli qui, poiché toglierebbe la domanda originale. Infine, sì, il sistema può essere difettoso.
Kantoku,

Risposte:


3

Senza fare molta ricerca ti consiglio di consultare la libreria MAGMA . Codice disponibile gratuitamente con supporto continuo. NVIDIA ha riconosciuto MAGMA come "Una svolta nei solutori per problemi di autovalori".

C'è anche la biblioteca CULA , che è generalmente un prodotto commerciale, anche se recentemente è stato reso gratuito per uso accademico (vedi dettagli qui ).


Grazie per la tua risposta Alexander. Ho già esaminato entrambe le librerie e, per quanto ne so, le funzioni vengono chiamate dall'host e la memoria deve essere nella memoria globale. Credo che il sovraccarico sarebbe troppo per giustificare l'uso. Tutte queste matrici vengono generate nella memoria condivisa, utilizzate nel kernel e quindi scartate. Vorrei tenerli lì senza doverli reinserire nella memoria globale. Anche se li avessi spinti lì, ci sarebbe comunque il problema di chiamare molte funzioni del kernel dall'host (anche se in più flussi).
Kantoku,

1
@Kantoku, sì, quelle librerie sono più generali e memorizzano l'intera matrice nella memoria globale. Se le tue matrici sono nella memoria condivisa, solo un SM può lavorarci sopra, no? L'implementazione di EVD dovrebbe quindi essere piuttosto semplice.
Alexander,

Sì, immagino di si, ed è per questo che cercavo algoritmi adeguati alla situazione. Non ho familiarità con Evd non simmetrico, quindi stavo cercando suggerimenti.
Kantoku,

@Kantoku (e Alexander). Gli EVD non simmetrici sono tutt'altro che semplici, anche nel caso sequenziale. È ancora un'area attiva di ricerca.
Jack Poulson,

@JackPoulson Ah sì, hai ragione, ma io (e presumo anche Alexander) intendevo dire che sarebbe stato semplice applicare un algoritmo consolidato al problema, considerando che ci sono molte semplificazioni che possono essere fatte quando prendiamo le dimensioni e la natura della matrice in considerazione. Il problema è: quale algoritmo.
Kantoku,

2

Usa le funzioni in LAPACK, è improbabile che tu possa batterle nella tua implementazione.


Ciao Wolfgang. Grazie per la risposta, ma ho intenzione di implementarlo su una GPU usando CUDA e per diverse migliaia di queste piccole matrici (dove ogni blocco gestisce la decomposizione di una singola matrice), e le matrici non sono necessariamente della stessa dimensione, quindi implementando qualcosa che usa la memoria condivisa sembra essere la mia unica scelta. Hai idea di quale algoritmo sarebbe più adatto per questi tipi di matrici? PS Grazie per l'affare.II lezioni che hai tenuto a KAUST lo scorso semestre. Mi sono divertito :)
Kantoku,

2
@Kantoku Dovresti aggiungere questi dettagli alla tua domanda, altrimenti è fuorviante.
Alexander

@Alexander Ho aggiornato la domanda con maggiori dettagli. Grazie per il suggerimento!
Kantoku,

1
@Kantoku: Le GPU sono un po 'al di là del mio regno ma sono sicuro che ci sono già delle librerie là fuori che fanno quello che vuoi (e in effetti vedo che altre risposte sono già collegate a loro). Sono contento di sentire che ti sono piaciute le mie lezioni!
Wolfgang Bangerth,
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.