Pregunta

Estoy escribiendo un software para ecuaciones diferenciales parciales hiperbólicas en c ++. Casi todas las notaciones son los vectores y matrices. Además de eso, necesito el solucionador de álgebra lineal. Y sí, los tamaños de la matriz de vector y pueden variar considerablemente (de por ejemplo 1,000 a tamaños que se pueden resolver sólo mediante la computación de memoria distribuida, por ejemplo. Racimos o arquitectura similar). Si hubiera vivido en la utopía, me había tenido solucionador lineal que escala grande para clusters, y las GPU multinúcleo.

Cuando se piensa en la estructura de datos que deben representar las variables, vine accros los boost.ublas y MTL4. Ambas bibliotecas son compatibles nivel blas 3, MTL4 implementa solucionador escasa y es mucho más rápido que ublas. Ambos no han implementado soporte para los procesadores multi-núcleo, por no hablar de paralelización para los cálculos de memoria distribuida. Por otro lado, el desarrollo de MTL4 depende del esfuerzo único de 2 desarrolladores (al menos según entendí), y estoy seguro de que hay una razón que los ublas se encuentra en la biblioteca de impulso. Además, la biblioteca mkl de Intel incluye el ejemplo para la unión de su estructura con ublas. Me gustaría unir mis datos y software para la estructura de datos que será sólida como una roca, desarrollado y mantenido por un largo período de tiempo.

Por último, la cuestión. ¿Cuál es su experiencia con el uso de ublas y / o mtl4, y lo recomendaría?

Gracias, mightydodol

¿Fue útil?

Solución

Con los requisitos, probablemente iría por impulso :: uBLAS . De hecho, un buen despliegue de uBLAS debe ser más o menos a la par con respecto a la velocidad MTL4.

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

Con estos enlaces, uBLAS con una biblioteca ATLAS / BLAS bien afinado de hacer los cálculos deben ser lo suficientemente rápido. Si se enlaza contra una determinada BLAS / ATLAS, debe ser más o menos a la par con MTL4 enlazados contra las mismas BLAS / ATLAS utilizando el indicador del compilador -DMTL_HAS_BLAS , y muy probablemente más rápido que el MTL4 sin BLAS acuerdo a su propia observación (ejemplo ver aquí , donde GotoBLAS superando a los MTL4).

Para resumir, la velocidad no debe ser su factor decisivo, siempre y cuando estén dispuestos a utilizar alguna biblioteca BLAS. Facilidad de uso y el apoyo es más importante. Usted tiene que decidir, si MTL o uBLAS es más adecuado para usted. Tiendo hacia uBLAS dado que es parte de BOOST, y MTL4 sólo soporta actualmente BLAS selectivamente. También puede encontrar esta un poco anticuado comparación de C ++ científica paquetes interesante .

Una gran pero: para sus necesidades (extremadamente grandes matrices), probablemente saltaría las uBLAS "azúcar sintáctica" o MTL, y llamar a la interfaz de "metal" C de BLAS / LAPACK directamente. Pero eso es sólo conmigo ... Otra ventaja es que debería ser más fácil que para cambiar al ScaLAPACK (Distributed LAPACK memoria, nunca se han utilizado) para los problemas más grandes. Para que quede claro:. Para los problemas de la casa-hold, yo no recomendaría llamar a una biblioteca BLAS directamente

Otros consejos

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 sobre MTL4) y la sintaxis más limpia mucho.

Para los nuevos proyectos, es probablemente lo mejor que se mantenga alejado de uBlas de Boost. El uBlas FAQ incluso tiene esta advertencia desde finales de 2012:

Q: ¿Debo usar uBLAS para nuevos proyectos?    ... la última mejora importante de uBLAS fue en 2008 y ningún cambio significativo se ha comprometido desde 2009. Rendimiento ...? Hay alternativas más rápidas. ¿Innovador? uBLAS es más de 10 años de edad y se perdió toda la materia nueva de C ++ 11.

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

http://flens.sf.net

Renuncia: Sí, esta es mi bebé

  • Se Sólo encabezado
  • Viene con un simple no performant, genérico implemenation C ++ de referencia, (es decir, con plantilla) de BLAS.
  • Si está disponible se puede utilizar una implementación optimizada BLAS como backend. En este caso es como usar directamente BLAS ( algún punto de referencia que debería actualizar ).
  • Puede utilizar operadores sobrecargados en lugar de llamada funciones BLAS .
  • Viene con su propia e independiente, genérica re-implemenation de un montón de funciones LAPACK. Llamamos a este puerto FLENS-LAPACK .
  • FLENS-LAPACK tiene exactamente la misma precisión y rendimiento que 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 del vector temporal / matrices en la evaluación de expresiones de álgebra lineal. La política es FLENS: Nunca crearlos !!!. Sin embargo, en un el modo de depuración especial permitimos la creación de provisionales "cuando sea necesario". Esta "cuando sea necesario" que la política es el valor predeterminado en otras bibliotecas como Eigen o armadillo o en Matlab.

Usted 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 manera más robusta. He tenido mi parte de pesadillas con efectos secundarios no evidentes y las consecuencias imprevistas de uBLAS implementaciones.

Eso no quiere decir uBLAS es malo, es realmente bueno, pero creo que dadas las representaciones dramáticas diferencias para MTL estos días, vale la pena usarlo en lugar de uBLAS a pesar de que es posiblemente un poco más arriesgada becuase de que es "sólo el 2 desarrollador "grupo de apoyo.

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

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

Hay una versión paralela de MTL4. Sólo echar un vistazo a simunova

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top