2009-07-01 11 views
14

Estoy escribiendo un software para ecuaciones diferenciales parciales hiperbólicas en C++. Casi todas las anotaciones son vectoriales y matriciales. Además de eso, necesito el solucionador de álgebra lineal. Y sí, los tamaños del vector y de la matriz pueden variar considerablemente (desde, por ejemplo, 1000 hasta tamaños que solo pueden resolverse mediante computación de memoria distribuida, por ejemplo, clusters o arquitectura similar). Si hubiera vivido en la utopía, hubiera tenido un solucionador lineal que se adapta muy bien para clusters, GPU y multinúcleos.biblioteca de plantillas ublas vs. matriz (MTL4)

Al pensar en la estructura de datos que debería representar las variables, llegué accros al boost.ublas y MTL4. Ambas bibliotecas son compatibles con Blas nivel 3, MTL4 implementa soluciones dispersas y es mucho más rápido que ublas. Ambos no tienen implementado soporte para procesadores multinúcleo, sin mencionar la paralelización para cálculos de memoria distribuida. Por otro lado, el desarrollo de MTL4 depende del único esfuerzo de 2 desarrolladores (al menos como yo lo entendí), y estoy seguro de que hay una razón por la que las ublas están en la biblioteca de impulso. Además, la biblioteca mkl de Intel incluye el ejemplo para unir su estructura con ublas. Me gustaría vincular mis datos y software a la estructura de datos que será sólida como una roca, desarrollada y mantenida durante un largo período de tiempo.

Finalmente, la pregunta. ¿Cuál es su experiencia con el uso de ublas y/o mtl4, y qué recomendaría?

dar gracias, mightydodol

+0

grande gracias por las respuestas ... – dodol

+0

@mightydodol: eres bienvenido. Agregué un enlace a un documento que estaba buscando todo el día. Puede que le resulte interesante. También corrigió un error fáctico relacionado con ScaLAPACK. – stephan

+0

gracias para señalar a eigen. @stephan Sí, el documento fue realmente interesante. Casi el mismo problema que el mío. – dodol

Respuesta

11

con sus requerimientos, probablemente volvería a BOOST::uBLAS. De hecho, un buen despliegue de uBLAS debería estar a la par con MTL4 con respecto a la velocidad.

La razón es que existen bindings para ATLAS (paralelización de memoria compartida, por tanto, que se puede optimizar de manera eficiente para su computadora), y también implementaciones como el Intel Math Kernel Library o HP MLIB Vendor-sintonizado.

Con estas fijaciones, uBLAS con una biblioteca ATLAS/BLAS bien ajustada haciendo los cálculos debe ser lo suficientemente rápida. Si enlaza con un BLAS/ATLAS dado, debería estar a la par con MTL4 vinculado al mismo BLAS/ATLAS utilizando el indicador del compilador -DMTL_HAS_BLAS, y probablemente más rápido que el MTL4 sin BLAS según su propio observation (por ejemplo, vea here, donde GotoBLAS supera a MTL4).

En resumen, la velocidad no debe ser un factor decisivo siempre que esté dispuesto a utilizar alguna biblioteca BLAS. La usabilidad y el soporte es más importante. Tienes que decidir si MTL o uBLAS son más adecuados para ti. Tiendo hacia uBLAS dado que es parte de BOOST, y MTL4 actualmente solo es compatible con BLAS selectively. También puede encontrar este comparison of scientific C++ packages ligeramente anticuado interesante.

Una grande PERO: para sus requisitos (matrices extremadamente grandes), probablemente omita el "azúcar sintáctico" uBLAS o MTL, y llame directamente a la interfaz C "metálica" de BLAS/LAPACK. Pero así soy yo ... Otra ventaja es que debería ser más fácil que cambiar a ScaLAPACK (LAPACK de memoria distribuida, nunca lo he usado) para problemas mayores. Para ser claros: para los problemas de mantenimiento de la casa, no sugeriría llamar directamente a una biblioteca de BLAS.

1

Se puede ver las diferencias de rendimiento directamente aquí: http://www.osl.iu.edu/research/mtl/mtl4/doc/performance.php3

Ambos son bibliotecas razonables para utilizar en términos de sus interfaces, no creo que debido a uBLAS consiguió a través del proceso de revisión de impulso que se trata necesariamente de forma más robusta .He tenido mi cuota de pesadillas con efectos secundarios no evidentes y consecuencias no deseadas de las implementaciones de uBLAS.

Eso no quiere decir que uBLAS sea malo, es realmente bueno, pero creo que dadas las dramáticas diferencias de rendimiento para MTL estos días, vale la pena usarlo en lugar de uBLAS aunque es posiblemente un poco más arriesgado porque es "solo 2 desarrollador "grupo de soporte.

Al final del día, se trata de velocidad con una biblioteca de matriz, vaya con MTL4.

8

Si está programando vectores, matrices y álgebra lineal en C++, me vería en Eigen:

http://eigen.tuxfamily.org/

Es más rápido que uBLAS (no estoy seguro de MTL4) y la sintaxis más limpia mucho.

+0

Eigen es la única otra biblioteca de matriz además de ATLAS/LAPACK que usamos. Es sustancialmente más rápido para la multiplicación de matriz para matrices más pequeñas (por debajo de 100 filas) y comparable en rendimiento a un estándar ATLAS/BLAS sin ajuste de proveedor para matrices más grandes (siempre que el procesador admita las instrucciones de SSE). Sin embargo, es sustancialmente más lento que ATLAS/LAPACK para álgebra lineal avanzada (por ejemplo, descomposición LU) para matrices más grandes y no admite procesadores multi-core. – stephan

+0

¿Estoy equivocado o Eigen no tiene soporte para matrices complejas? –

+0

@quant_dev: Creo que es correcto, aunque sospecho que los desarrolladores estarían dispuestos a ayudar con eso. Yo no soy uno de los desarrolladores. –

0

Hay una versión paralela de MTL4. Solo eche un vistazo a simunova

1

Desde mi propia experiencia, MTL4 es mucho más rápido que uBLAS y también es más rápido que Eigen.

2

Hay una biblioteca de C++ que falta en esta lista: FLENS

http://flens.sf.net

responsabilidad: Sí, esta es mi bebé

  • Es cabecera única
  • Viene con un simple, Implementación de referencia C++ no ejecutable, genérica (es decir, con plantilla) de BLAS.
  • Si está disponible, puede utilizar una implementación de BLAS optimizada como back-end. En este caso, es como usar BLAS directamente (some Benchmark I should update).
  • Puede usar overloaded operators instead of calling BLAS functions.
  • Viene con su propia reintroducción genérica autónoma de un conjunto de funciones LAPACK. Llamamos a este puerto FLENS-LAPACK.
  • FLENS-LAPACK tiene exactamente la misma precisión y rendimiento que el LAPACK de Netlib. Y en mi experiencia (FLENS-) LAPACK + ATLAS o (FLENS-) LAPACK + OpenBLAS le da el mismo rendimiento que ACML o MKL.
  • FLENS tiene una política diferente con respecto a la creación de vectores/matrices temporales en la evaluación de expresiones de álgebra lineal. La política de FLENS es: ¡Nunca crearlos! Sin embargo, en un special debug-mode, permitimos la creación de temporales "cuando sea necesario". Esta política "cuando sea necesario" es la predeterminada en otras bibliotecas como Eigen o Armadillo o en Matlab.
+0

Su sitio web está limpio, pero la documentación es difícil ... p. ¿Cómo hacer una descomposición propia en una matriz simétrica? Una breve hoja de referencia (por ejemplo, Eigen) atraerá a más usuarios, en mi humilde opinión. – zhanxw

+0

Puede encontrar una descripción general de las funciones de álgebra lineal en [FLENS-LAPACK] (http://apfel.mathematik.uni-ulm.de/~lehn/FLENS/flens/lapack/lapack.html). Sin embargo, tiene razón, la documentación aquí no está completa. Se centra en la funcionalidad que se necesita con frecuencia, así como en funciones que ya transferí a FLENS/C++. Pero la mayoría/muchas de las otras rutinas de LAPACK se pueden usar si hay una implementación de LAPACK nativa disponible. ... Trataré de dedicar un tiempo extra a la redacción y ampliar la documentación aún más. –

5

Para proyectos nuevos, probablemente sea mejor mantenerse alejado de uBlas de Boost. Las preguntas frecuentes de uBlas incluso tienen esta advertencia desde finales de 2012:

P: ¿Debo usar uBLAS para nuevos proyectos? ... la última mejora importante de uBLAS fue en 2008 y no se han registrado cambios significativos desde 2009. ... ¿Desempeño? Hay alternativas más rápidas. ¿Innovador? uBLAS tiene más de 10 años y se perdió todo lo nuevo de C++ 11.

+0

ya que es 2013, esta es información valiosa. Algo completamente irrelevante para el tema de esta publicación: creo que la palabra "alternativa" incluye una o todas las posibilidades, como cosas, proposiciones o cursos de acción (así que no hay necesidad de una forma plural), es decir, las bibliotecas alternativas son más rápidas. – dodol

Cuestiones relacionadas