Ich kann die zweite Hälfte Ihrer Frage nicht beantworten, was andere Implementierungen betrifft, aber ich kann einen Einblick in die Herausforderungen geben. Als Referenz habe ich persönlich ViennaCL auf einer nVidia GTX 560 Ti mit 2 GB Speicher für meine Benchmarks verwendet.
Über den Seriencode eines i5 mit mittlerer Reichweite sah ich Beschleunigungen für dichte Matrixmultiplikationen von ungefähr 40x. Für Operationen wie eine vektorskalare Multiplikation sah ich bis zu 1000-fache Beschleunigungen. Der 800-Pfund-Gorilla im Raum ist jedoch Speicherbandbreite. Für die meisten kommerziellen GPUs verwenden Sie so etwas wie PCIe, was den Durchsatz auf etwa 6 GB / s begrenzt. In meinem Fall, während die Berechnung 40x schneller war, dauerten die drei Matrixkopien (zwei auf die GPU und eine zurück) jeweils ungefähr so viel Zeit wie nur die Berechnung auf der CPU.
Das Problem bei jeder allgemeinen Bibliothek für die lineare Algebra der GPU wird sein, dass sie Objekte auf der GPU nicht wirklich wiederverwenden können, weil sie nicht wissen, was Sie mit ihnen tun werden. Daher muss bei jedem Aufruf eines Rechenkerns wahrscheinlich auf die GPU kopiert und anschließend das Ergebnis zurückkopiert werden. Dies wird einen großen Teil der Gewinne verschlingen.
Wenn Sie Objekte wie Matrizen wiederverwenden können, können Sie die übergeordneten Algorithmen schreiben, um so viel Speicherverwaltung wie möglich zu vermeiden. Eine Bibliothek würde dies jedoch nur schwer effizient tun können.
Ich hoffe, dass dies hilft, und ich bin sicher, dass es hier andere Leute gibt, die viel mehr Erfahrung damit haben, aber dies sind die Erfahrungen und Eindrücke, die ich während meines kurzen Streifzuges in das GPU-Computing gemacht habe.
Lassen Sie mich nur auf CUDA und BLAS konzentrieren.
Beschleunigung über eine Host-BLAS-Implementierung ist keine gute Metrik zur Beurteilung des Durchsatzes, da sie von zu vielen Faktoren abhängt, obwohl ich der Meinung bin, dass Beschleunigung normalerweise das ist, worum es einem geht.
Wenn Sie sich die von NVIDIA veröffentlichten Benchmarks ansehen und berücksichtigen, dass der Tesla M2090 eine Spitzenleistung von 1331 Gigaflops (einfache Genauigkeit) und 665 Gigaflops (doppelte Genauigkeit) aufweist, werden Sie feststellen, dass wir für SGEMM und DGEMM einen gemessenen Durchsatz von nahezu bei haben 60% der theoretischen, was ziemlich gut ist.
In Bezug auf den anhaltenden Gleitkommadurchsatz denke ich, dass Flops ohne Berücksichtigung von Daten und Ergebnisübertragungszeiten berechnet werden sollten, und dies erschwert Vergleiche bei der Beschleunigung. Außerdem müssen Sie die Matrixgröße berücksichtigen, da die beste Leistung für große Matrizen erzielt wird.
Fazit: Die Beschleunigung einer realen Anwendung kann sich stark von der gemessenen Spitzenleistung bei linearen Algebra-Routinen unterscheiden, da Sie die GPU-Initialisierung, Datenübertragungszeiten usw. usw. berücksichtigen müssen.
Daher werde ich Ihre Frage zur schnellsten Bibliothek nicht beantworten, da die Frage nur dann sinnvoll ist, wenn eine genaue Metrik und ein genaues Problem definiert sind. Trotzdem denke ich, dass cuBLAS und MAGMA ein sehr guter Ausgangspunkt sind.
quelle