2010-12-30 13 views
10

Ho bisogno di fare moltiplicazione sulle matrici. Sto cercando una libreria che possa farlo velocemente. Sto usando il compilatore Visual C++ 2008 e ho un core i7 860, quindi se la libreria è ottimizzata per la mia configurazione è perfetta.Che cos'è una buona libreria C++ per le operazioni con le matrici

+2

LAPACK + BLAS ottiene la maggior parte delle cose fatte –

risposta

5

Cerca su Eigen. Dovrebbe avere tutto ciò di cui hai bisogno.

+0

La usa le discussioni (se non non è veloce)? – Yttrill

+0

Eigen è adatto solo alle piccole matrici. Non usa thread per matrici più grandi. Ma usa SSE2 quando disponibile. –

+0

Beh, il loro benchmark mostra diversi ... diamine, il threading può essere implementato dall'utente facendo block products se ne hai davvero bisogno. – rubenvb

3

Ho avuto una buona esperienza con Boost's uBLAS. È una buona opzione se stai già utilizzando Boost.

+0

Utilizza thread (se non non è veloce)? – Yttrill

+2

Utilizza qualsiasi libreria BLAS installata nel sistema. Intel ne fornisce uno che utilizza thread e istruzioni vettoriali: google per Intel MKL. Tuttavia non è gratuito. –

+0

Ho avuto un'esperienza davvero terribile con gli uBLAS di Boost. È completamente non intuitivo e difficile da capire. Per esempio, come dovrei sapere che la moltiplicazione della matrice vettoriale viene eseguita usando 'prod()' - perché non un operatore '*'? Inoltre, non posso nemmeno moltiplicare due vettori. –

1

È possibile utilizzare lo GNU Scientific Library(GSL).

ecco una pagina che descrive le operazioni con le matrici disponibili nella biblioteca, tra cui la moltiplicazione (gsl_matrix_mul_elements()):

http://www.gnu.org/software/gsl/manual/html_node/Matrix-operations.html

e qui ci sono alcuni link per iniziare con l'utilizzo di GSL con Visual Studio:

http://gladman.plushost.co.uk/oldsite/computing/gnu_scientific_library.php

http://www.quantcode.com/modules/smartfaq/faq.php?faqid=33

+0

Davvero? Compilazione del codice Gnu su MSVC++? Voglio dire, se vuoi davvero ottenere prestazioni, userai un BLAS basato su Atlas ma dubito che sarebbe facile costruire su Windows .. :) – Yttrill

+0

http://math-atlas.sourceforge.net/errata.html# gccCrazy –

-1

C'è un'opzione per implementare questo da soli, magari usando std :: valarray perché potrebbe essere parallelo usando OpenMP: gcc ha sicuramente una tale versione, probabilmente anche MSVC++.

Altrimenti, i seguenti trucchi: una delle matrici deve essere trasposta. Poi ci sono:

AB [i, j] = Sum (k) A [i, k] B^t [j, k]

in cui si esegue la scansione memoria contigua. Se hai 8 core puoi facilmente dividere il set di indici [i, j] in 8, e dare ad ogni core 1/8 del lavoro totale. Per renderlo ancora più veloce è possibile utilizzare le istruzioni di moltiplicazione del vettore, la maggior parte dei compilatori fornirà una funzione speciale per questo. Il risultato non sarà veloce come una libreria sintonizzata, ma dovrebbe essere OK.

Se si eseguono calcoli più lunghi come la valutazione polinomiale, un valutatore di thread che ha anche il supporto per i thread (gak, due tipi di thread) farà un buon lavoro anche se non eseguirà l'accordatura a basso livello. Se vuoi veramente fare cose velocemente, devi usare una libreria opportunamente sintonizzata come Atlas, ma probabilmente non avresti Windows in esecuzione se fossi serio su HPC.

+3

Non implementare mai operazioni a matrice da soli. Utilizzare un'implementazione BLAS. –

1

non può correre con le biblioteche scientifiche, ma con Visual C++ che è a portata di mano

#include <windows.h> 
#include <gdiplus.h> 
#pragma comment (lib,"Gdiplus.lib") 
using namespace Gdiplus; 

int main() 
{ 
    ULONG_PTR gpToken = 0; 
    GdiplusStartup(&gpToken, &GdiplusStartupInput(), NULL); 
    //lib inited 

    Matrix A; 
    A.Translate(10,20); 

    Matrix B; 
    B.Rotate(35.0); 

    A.Multiply(&B); 
    if (A.IsInvertible()) 
     A.Invert(); 
    if (!A.IsIdentity()) 
     A.RotateAt(120.0, PointF(10,10)); 

    //getting values 
    REAL elements[6]; 
    A.GetElements(elements); 

    //lib stopped 
    GdiplusShutdown(gpToken); 
    return 0; 
} 

Quindi, con questo si può facilmente prendere l'ostacolo moltiplicazione di matrici (su Windows)

GdiPlus Matrix Documentation

6

BLAS è uno standard Fortran di fatto per tutte le operazioni di algebra lineare di base (essenzialmente moltiplicazioni di matrici e vettori). Sono disponibili numerose implementazioni. Ad esempio:

  • ATLAS è gratuito e presumibilmente auto-ottimizzante. Hai bisogno di compilare te stesso però.
  • Goto BLAS è gestito da Kazushige Goto al TACC. È molto bravo a ottenere l'ultima performance dai processori moderni. Però è solo per uso accademico.
  • Intel MKL fornisce BLAS ottimizzato per processori Intel. Non è gratuito, anche per uso accademico.

Quindi, è possibile utilizzare un wrapper C++, ad esempio boost::ublas.

Se si programma su sistemi distribuiti, esistono PBLAS e ScaLAPACK che consentono l'utilizzo del trasferimento di messaggi per operazioni di algebra lineare distribuita. Su una macchina multicore, solitamente le implementazioni di BLAS (almeno Intel MKL) utilizzano thread per matrici abbastanza grandi.

Se si desidera più routine di algebra lineare avanzate (autovalori, sistemi lineari, meno quadrati, ...), quindi c'è l'altro standard FORTRAN LAPACK de facto. Per quanto ne so, non c'è nulla che lo integri elegantemente con C++ oltre a chiamare le semplici routine di Fortran. Devi scrivere alcuni wrapper per nascondere le chiamate Fortran e fornire un'implementazione audio per il controllo dei tipi.

7

FWIW, Eigen 3 utilizza thread (OpenMP) per prodotti a matrice (in risposta alla dichiarazione precedente su Eigen che non utilizza thread).

Problemi correlati