vías una tipos sentido segun qué que país mexico ifla especializadas especializada entre documentacion diferencia desarrollo definicion cuál concepto centro bibliotecas biblioteca autores c++ performance eigen

c++ - tipos - qué es una biblioteca especializada y cuál es su sentido en un país en vías de desarrollo



¿Cómo puede la biblioteca C++ Eigen funcionar mejor que las bibliotecas especializadas de proveedores? (7)

Estaba revisando los parámetros de rendimiento: http://eigen.tuxfamily.org/index.php?title=Benchmark

No pude evitar observar que eigen parece superar consistentemente a todas las bibliotecas especializadas de proveedores. La pregunta es: ¿cómo es posible? Uno supondría que mkl / goto usaría un código ajustado específico del procesador, mientras que eigen es bastante genérico.

Observe esto http://download.tuxfamily.org/eigen/btl-results-110323/aat.pdf , esencialmente un dgemm. Para N = 1000 Eigen obtiene aproximadamente 17Gf, MKL solo 12Gf


Acerca de la comparación ATLAS vs. Eigen

Eche un vistazo a este hilo en la lista de correo de Eigen comenzando aquí:

Muestra, por ejemplo, que ATLAS supera a Eigen en el producto matriz-matriz en un 46%:

Se pueden encontrar más resultados de puntos de referencia y detalles sobre cómo se realizaron los puntos de referencia aquí:

Editar:

Para mi conferencia "Fundamentos de software para computación de alto rendimiento", creé un pequeño marco llamado ulmBLAS. Contiene el conjunto de puntos de referencia ATLAS y los estudiantes podrían implementar su propio producto matriz-matriz basado en los documentos BLIS . Puede echar un vistazo a los puntos de referencia finales que también miden Eigen:

Puede usar el marco ulmBLAS para hacer sus propios puntos de referencia.

También eche un vistazo a


Eigen tiene una evaluación perezosa. De ¿Cómo se compara Eigen con BLAS / LAPACK? :

Para operaciones que involucran expresiones complejas, Eigen es inherentemente más rápido que cualquier implementación de BLAS porque puede manejar y optimizar una operación completa globalmente, mientras que BLAS obliga al programador a dividir operaciones complejas en pequeños pasos que coinciden con la API de función fija BLAS, que incurre en ineficiencia debido a la introducción de temporales. Véase, por ejemplo, el resultado de referencia de una operación Y = a X + b Y que implica dos llamadas a las rutinas BLAS de nivel 1, mientras que Eigen genera automáticamente un solo bucle vectorizado.

El segundo gráfico en los http://eigen.tuxfamily.org/index.php?title=Benchmark es Y = a*X + b*Y , que Eigen fue especialmente diseñado para manejar. No debería sorprender que una biblioteca gane en un punto de referencia para el que fue creada. Notarás que los puntos de referencia más genéricos, como la multiplicación matriz-matriz, no muestran ninguna ventaja para Eigen.


Eigen utiliza un código altamente ajustado como se detalla en su documentación.


El código genérico puede ser rápido porque Compile Time Function Evaluation (CTFE) permite elegir una estrategia óptima de bloqueo de registros (submatrices temporales pequeñas almacenadas en registros de CPU).

Mir GLAS e Intel MKL son más rápidos que Eigen y OpenBLAS. Mir GLAS es más genérico en comparación con Eigen. Ver también el benchmark y el hilo de reddit .


Envié la misma pregunta a la lista de correo de ATLAS hace un tiempo:

http://sourceforge.net/mailarchive/message.php?msg_id=28711667

Clint (el desarrollador de ATLAS) no confía en estos puntos de referencia. Sugirió algún procedimiento de referencia confiable. Tan pronto como tenga algo de tiempo libre, haré este tipo de evaluación comparativa.

Si la funcionalidad BLAS de Eigen es realmente más rápida que la de GotoBLAS / GotoBLAS, ATLAS, MKL, entonces deberían proporcionar una interfaz BLAS estándar de todos modos. Esto permitiría la vinculación de LAPACK contra tal Eigen-BLAS. En este caso, también sería una opción interesante para Matlab y sus amigos.


No parece superar constantemente a otras bibliotecas, como se puede ver en los gráficos más abajo en esa página que vinculó. Por lo tanto, las diferentes bibliotecas están optimizadas para diferentes casos de uso, y diferentes bibliotecas son más rápidas para diferentes problemas.

Esto no es sorprendente, ya que generalmente no se puede optimizar perfectamente para todos los casos de uso. La optimización para una operación específica generalmente limita las opciones de optimización para otros casos de uso.


Los puntos de referencia están diseñados para ser malinterpretados .

Veamos el producto matriz * matriz. El punto de referencia disponible en esta http://eigen.tuxfamily.org/index.php?title=Benchmark del sitio web de Eigen le dice que Eigen (con su propio BLAS) da tiempos similares al MKL para matrices grandes (n = 1000). He comparado Eigen 3.2.6 con MKL 11.3 en mi computadora (una computadora portátil con un núcleo i7) y la MKL es 3 veces más rápida que Eigen para dichas matrices con un hilo, y 10 veces más rápido que Eigen usando 4 hilos. Esto parece una conclusión completamente diferente. Hay dos razones para esto. Eigen 3.2.6 (su BLAS interno) no usa AVX. Además, no parece hacer un buen uso de multihilo. Este punto de referencia oculta esto ya que utilizan una CPU que no tiene soporte AVX sin multihilo.

Normalmente, esas bibliotecas C ++ (Eigen, Armadillo, Blaze) traen dos cosas:

  • Sobrecarga agradable del operador : puede usar +, * con vectores y matrices. Para obtener un buen rendimiento, deben usar técnicas complicadas conocidas como "expresión de plantilla inteligente" para evitar temporalmente cuando reducen el tiempo (como y = alpha x1 + beta x2 con vectores y, x1, x2) e introducen cuando son útiles (como A = B * C con matrices A, B, C). También pueden reordenar operaciones para menos cálculos, por ejemplo, si A, B, C son matrices A * B * C se pueden calcular como (A * B) * C o A * (B * C) dependiendo de sus tamaños.
  • BLAS interno : para calcular el producto de 2 matrices, pueden confiar en su BLAS interno o en uno proporcionado externamente (MKL, OpenBLAS, ATLAS). En chips Intel con matrices grandes, el MKL es casi imposible de superar. Para matrices pequeñas, uno puede vencer al MKL ya que no fue diseñado para ese tipo de problemas.

Por lo general, cuando esas bibliotecas proporcionan puntos de referencia contra el MKL, generalmente usan hardware antiguo y no activan el multihilo para que estén a la par con el MKL. También pueden comparar las operaciones de nivel 1 de BLAS como y = alpha x1 + beta x2 con 2 llamadas a una función de nivel 1 de BLAS, lo cual es una cosa estúpida de todos modos.

En pocas palabras , esas bibliotecas son extremadamente convenientes para su sobrecarga de + y * que es extremadamente difícil de hacer sin perder el rendimiento. Usualmente hacen un buen trabajo en esto. Pero cuando te dan un punto de referencia que dice que pueden estar a la par o vencer al MKL con su propio BLAS, ten cuidado y haz tu propio punto de referencia. Por lo general, obtendrás resultados diferentes ;-).