2012-04-05 15 views
10

Sto sviluppando un programma che deve eseguire calcoli di algebra lineare pesante.Algebra lineare parallela per sistema multicore

Ora sto usando le routine LAPACK/BLAS, ma ho bisogno di sfruttare la mia macchina (24 core Xeon X5690).

ho trovato progetti come pblas e ScaLAPACK, ma tutti sembrano concentrarsi sul calcolo distribuito e sull'utilizzo di MPI.

Non ho alcun cluster disponibile, tutti i calcoli verranno eseguiti su un singolo server e l'utilizzo di MPI sembra un eccessivo.

Qualcuno ha qualche suggerimento su questo?

+3

Non cancellare usando MPI, specialmente se non si riescono a trovare le librerie abilitate per MPI per fare il lavoro pesante. Potrebbe essere più facile che trovare librerie per l'algebra lineare a memoria condivisa o scrivere il proprio codice di memoria condivisa. Un'ottima implementazione MPI funzionerà in modo efficiente su un computer con memoria condivisa. –

+0

Lo so. Non volevo dire che avrei scritto codice MPI da solo. Volevo semplicemente evitare tutto ciò che utilizza MPI poiché questo non sarà un programma cluster e voglio evitare qualsiasi overhead non necessario – Patrik

+0

Voting per chiudere come tool rec/too broad. –

risposta

2

Considerare l'utilizzo di Intel MKL. OpenBLAS può anche essere abbastanza veloce, anche se non l'ho ancora eseguito su> macchine quadcore.

+0

Buona chiamata, ma come usarla? La documentazione mostra che le funzioni hanno lo stesso nome di LAPACK. Devo solo collegarmi a mkl invece di lapack blas e gfortran? (I miei ldflag attuali sono -llapack -lblas -lgfortran). Fondamentalmente ho bisogno di un sostituto parallelo per DSTEBZ e DSTEIN – Patrik

+0

@Patrik: MKL è progettato per essere compatibile con BLAS, quindi solo la ricompilazione e il collegamento * dovrebbero * funzionare. Devo ammettere che non lo uso mai direttamente da C, ma sempre attraverso Numpy. –

+2

Da Fortran è, come @larsmans indovina, un'operazione diretta di collegamento con le librerie (a destra). In caso di problemi, consultare l'advisor della linea di collegamento Intel: http://software.intel.it/it/it/articles/intel-mkl-link-advisor/ –

10

Come menzionato da @larsmans (con, diciamo, MKL), si usano ancora interfacce LAPACK + BLAS, ma si trova solo una versione sintonizzata multithread per la propria piattaforma. MKL è fantastico, ma costoso. Altro, open-source, le opzioni includono:

  • OpenBLAS/GotoBLAS, il supporto Nehalem dovrebbe funzionare bene, ma nessun supporto sintonizzati ancora per Westmere. Il multithreading funziona molto bene.
  • Atlas: sintonizza automaticamente la tua architettura al momento dell'installazione. probabilmente più lento per le matrici "tipiche" (ad esempio, SGEMM quadrato) ma può essere più veloce per i casi dispari, e per Westmere potrebbe persino battere OpenBLAS/GotoBLAS, non l'ho testato io stesso. Principalmente ottimizzato per casi seriali, ma include routine di multithreading parallele.
  • Plasma - Implementazione LAPACK progettata in modo specifico per multicore.

Sarei d'accordo anche con il commento di Mark; a seconda delle routine di LAPACK che stai utilizzando, la memoria distribuita con MPI potrebbe effettivamente essere più veloce del multithread. È improbabile che sia il caso delle routine BLAS, ma per qualcosa di più complicato (ad esempio le routine autovalore/vettore in LAPACK) vale la pena di provarlo. Anche se è vero che le chiamate alla funzione MPI sono un sovraccarico, fare cose in una modalità di memoria distribuita significa che non devi preoccuparti così tanto di false condivisioni, sincronizzazione dell'accesso a variabili condivise, ecc.

+0

Sto usando dlamch, dstebz, dstein, dlamch e dstebz – Patrik

+0

Forse pdstebz e pdstein sono la funzione che sto cercando, ma hanno un'interfaccia diversa. Quali sono i parametri di lwork, liwork e ortogonalizzazione? Qual è il modo migliore per sfruttare più core nella chiamata dstebz e dstein? – Patrik

+0

Penso che la prima cosa da provare sia con un'installazione multithread blas/lapack - ad esempio openblas o gotoblas. Iniziare con lo scalapack richiede un po 'di lavoro, perché la distribuzione della matrice tra i core non è ovvia. La buona notizia è che una volta che si ha il problema di usare lo scalapack, funzionerà anche attraverso i nodi. Ho dato un esempio di utilizzo di scalapack qui: http://scicomp.stackexchange.com/questions/1688/how-do-i-use-scalapack-pblas-for-matrix-vector-multiplication/1713#1713 –