No puedo responder la segunda mitad de su pregunta en cuanto a otras implementaciones, pero puedo proporcionar una idea de los desafíos. Como referencia, personalmente utilicé ViennaCL en un nVidia GTX 560 Ti con 2 GB de memoria para mis puntos de referencia.
Sobre el código de serie en un i5 de rango medio, vi aceleraciones para multiplicaciones de matriz densas de aproximadamente 40x. Para operaciones como una multiplicación vectorial-escalar, vi velocidades de hasta 1000x. Sin embargo, el gorila de 800 libras en la habitación es el ancho de banda de la memoria. Para la mayoría de las GPU comerciales, utilizará algo como PCIe que lo limita a unos 6 GB / s de rendimiento. En mi caso, mientras que el cálculo fue 40 veces más rápido, las tres copias matriciales (dos para la GPU y una hacia atrás) tomaron aproximadamente el mismo tiempo que hacer el cálculo en la CPU.
El problema con cualquier biblioteca general para el álgebra lineal de GPU será que realmente no pueden reutilizar objetos en la GPU, porque no saben qué va a hacer con ellos. Por lo tanto, cada llamada a un núcleo de cómputo probablemente requerirá copia en la GPU y luego volver a copiar el resultado. Esto consumirá una gran parte de las ganancias.
Si puede reutilizar objetos como las matrices, podría escribir los algoritmos de nivel superior para evitar la mayor cantidad de administración de memoria posible, pero sería difícil para una biblioteca hacer esto de manera eficiente.
Espero que esto ayude, y estoy seguro de que hay otras personas aquí que tienen mucha más experiencia en esto, pero estas son las experiencias e impresiones que obtuve durante mi breve incursión en la informática de GPU.
Déjame concentrarme solo en CUDA y BLAS.
La aceleración sobre la implementación de BLAS de un host no es una buena métrica para evaluar el rendimiento, ya que depende de demasiados factores, aunque estoy de acuerdo en que la aceleración suele ser lo que le importa.
Si observa los puntos de referencia publicados por NVIDIA y tiene en cuenta que el Tesla M2090 tiene un rendimiento máximo de 1331 Gigaflops (precisión simple) y 665 Gigaflops (doble prec.), Verá que para SGEMM y DGEMM tenemos un rendimiento medido casi en 60% del teórico, que es bastante bueno.
En lo que respecta al rendimiento sostenido de coma flotante, creo que los flops deben calcularse sin tener en cuenta los datos y los tiempos de transferencia de resultados, y esto dificulta las comparaciones de aceleración. Además, debe tener en cuenta el tamaño de la matriz, ya que el mejor rendimiento es para matrices grandes.
En pocas palabras: la aceleración de una aplicación de la vida real puede ser muy diferente del rendimiento máximo medido en las rutinas de álgebra lineal, ya que debe tener en cuenta la inicialización de la GPU, los tiempos de transferencia de datos, etc.
Por lo tanto, no responderé su pregunta sobre la biblioteca más rápida, ya que la pregunta no tiene sentido a menos que se defina una métrica y un problema precisos. Dicho todo esto, creo que cuBLAS y MAGMA son un muy buen punto de partida.
fuente