Vorrei concentrarmi solo su CUDA e BLAS.
Lo speedup su un'implementazione BLAS dell'host non è una buona metrica per valutare il throughput, poiché dipende da troppi fattori, anche se sono d'accordo sul fatto che lo speedup è di solito ciò che ci interessa.
Se si guardano i benchmark pubblicati da NVIDIA e si tiene conto del fatto che Tesla M2090 ha 1331 Gigaflop (singola precisione) e 665 Gigaflop (doppia prec.), Si noterà che per SGEMM e DGEMM abbiamo un throughput misurato quasi a Il 60% di quello teorico, il che è abbastanza buono.
Ma come si definiscono le prestazioni dei flop? Conteggio flop / tempo trascorso, dove il conteggio flop è ( e sono le dimensioni della matrice) e il tempo trascorso può includere o meno il tempo di trasferimento dall'host alla memoria GPU e viceversa. (Come sottolinea correttamente Godric, questo fa una grande differenza!)2m n km × kk × n
Per quanto riguarda il throughput continuo in virgola mobile, penso che i flop debbano essere calcolati senza tener conto dei dati e dei tempi di trasferimento dei risultati, e questo rende difficili i confronti di velocità. Inoltre, devi tenere conto delle dimensioni della matrice, poiché le migliori prestazioni sono per matrici grandi.
In conclusione: l'accelerazione di un'applicazione nella vita reale può essere molto diversa dalle prestazioni di picco misurate sulle routine di algebra lineare, poiché è necessario tenere conto dell'inizializzazione della GPU, dei tempi di trasferimento dei dati, ecc. Ecc.
Quindi non risponderò alla tua domanda sulla libreria più veloce, dal momento che la domanda non ha senso a meno che non venga definita una metrica e un problema precisi. Detto questo, penso che cuBLAS e MAGMA siano un ottimo punto di partenza.