¿Recomendaciones para una biblioteca de matriz C ++ rápida y utilizable?

158

¿Alguien tiene recomendaciones sobre una biblioteca de matriz de C ++ rápida y utilizable?

Lo que quiero decir con usable es lo siguiente:

  • Los objetos de matriz tienen una interfaz intuitiva (por ejemplo: puedo usar filas y columnas mientras indexo)
  • Puedo hacer cualquier cosa con la clase de matriz que puedo hacer con LAPACK y BLAS
  • API fácil de aprender y usar
  • Relativamente fácil de instalar en Linux (ahora uso Ubuntu 11.04)

Para mí, la usabilidad es más importante que la velocidad o el uso de memoria en este momento, para evitar la optimización prematura. Al escribir el código, siempre podría usar matrices 1-D (o vectores STL) y una aritmética de índice o puntero adecuada para emular una matriz, pero preferiría no hacerlo para evitar errores. También me gustaría centrar mi esfuerzo mental en el problema real que estoy tratando de resolver y programar en el dominio del problema, en lugar de utilizar parte de mi atención finita para recordar todos los pequeños trucos de programación que utilicé para emular matrices como matrices. , y recuerde los comandos de LAPACK, etc. Además, cuanto menos código tenga que escribir, y cuanto más estandarizado sea, mejor.

Denso versus escaso no importa todavía; Algunas de las matrices con las que estoy tratando serán escasas, pero no todas. Sin embargo, si un paquete particular maneja bien matrices densas o dispersas, vale la pena mencionarlo.

El moderar tampoco me importa mucho, ya que trabajaré con tipos numéricos estándar y no necesito almacenar nada más que dobles, flotantes o ints. Es agradable, pero no es necesario para lo que me gustaría hacer.

Geoff Oxberry
fuente
1
¿Usar CUDA es una opción?
rotafolio el
1
Podría ser, más adelante. No estoy interesado en CUDA en este momento porque estoy construyendo una biblioteca para una aplicación donde la multiplicación de matrices es la menor de mis preocupaciones. La mayor parte del esfuerzo se gastará en llamar a un solucionador de programas lineal de enteros mixtos, por lo que usar CUDA sería excesivo. Después de terminar mi tesis, planeo mirar algoritmos que sean más intensivos en álgebra lineal y menos centrados en la optimización. Sin embargo, definitivamente te animo a publicar sobre las bibliotecas CUDA, si tienes experiencia con ellas, porque estoy seguro de que otras personas estarían interesadas en conocer tus pensamientos.
Geoff Oxberry
¿Qué pasa con Intel MKL e IPP?
Royi

Respuestas:

146

He reunido lo siguiente de la investigación en línea hasta ahora:

Utilicé Armadillo un poco y encontré que la interfaz era lo suficientemente intuitiva, y fue fácil localizar paquetes binarios para Ubuntu (y supongo que otras distribuciones de Linux). No lo he compilado desde la fuente, pero espero que no sea demasiado difícil. Cumple con la mayoría de mis criterios de diseño y utiliza álgebra lineal densa. Puede llamar a las rutinas LAPACK o MKL. En general, no es necesario compilar Armadillo, es una biblioteca basada exclusivamente en plantillas: solo incluye el encabezado y el enlace a BLAS / LAPACK o MKL, etc.

He escuchado cosas buenas sobre Eigen , pero no lo he usado. Se dice ser rápida , utiliza plantillas, y es compatible con el álgebra lineal densa. No tiene LAPACK o BLAS como dependencia, pero parece ser capaz de hacer todo lo que LAPACK puede hacer (además de algunas cosas que LAPACK no puede). Muchos proyectos usan Eigen, lo cual es prometedor. Tiene un paquete binario para Ubuntu, pero como biblioteca de solo encabezado, es trivial de usar también en otros lugares.

La versión 4 de Matrix Template Library también parece prometedora y utiliza plantillas. Admite álgebra lineal densa y dispersa, y puede llamar a UMFPACK como un solucionador disperso. Las características no están claras en su sitio web. Tiene un paquete binario para Ubuntu, descargable desde su sitio web.

PETSc , escrito por un equipo del Laboratorio Nacional de Argonne, tiene acceso a solucionadores lineales dispersos y densos, por lo que supongo que puede funcionar como una biblioteca matricial. Está escrito en C, pero creo que tiene enlaces de C ++ (e incluso si no fuera así, llamar a C desde C ++ no es un problema). La documentación es increíblemente completa. El paquete es un poco exagerado para lo que quiero hacer ahora (multiplicación e indexación de matrices para configurar programas lineales de enteros mixtos), pero podría ser útil como un formato de matriz para mí en el futuro, o para otras personas que tienen necesidades diferentes que yo

Trilinos , escrito por un equipo del Sandia National Laboratory, proporciona interfaces C ++ orientadas a objetos para matrices densas y dispersas a través de su componente Epetra, e interfaces con plantillas para matrices densas y dispersas a través de su componente Tpetra. También tiene componentes que brindan funcionalidad de solucionador lineal y de solución propia. La documentación no parece ser tan pulida o prominente como PETSc; Trilinos parece el análogo de Sandia de PETSc. PETSc puede llamar a algunos de los solucionadores de Trilinos. Los binarios para Trilinos están disponibles para Linux.

Blitz es una biblioteca orientada a objetos de C ++ que tiene binarios de Linux. No parece mantenerse activamente (29-06-2012: ¡acaba de aparecer una nueva versión ayer!), Aunque la lista de correo está activa, por lo que hay alguna comunidad que la usa. No parece hacer mucho en la forma de álgebra lineal numérica más allá de BLAS, y parece una biblioteca de matriz densa. Utiliza plantillas.

Boost :: uBLAS es una biblioteca orientada a objetos C ++ y parte del proyecto Boost. Admite plantillas y álgebra lineal numérica densa. He oído que no es particularmente rápido.

La Plantilla numérico Toolkit es una biblioteca de C ++ orientado a objetos desarrollado por NIST. Su autor, Roldan Pozo, parece contribuir con parches ocasionalmente, pero ya no parece estar en desarrollo activo (la última actualización fue 2010). Se enfoca en álgebra lineal densa y proporciona interfaces para algunas descomposiciones de matriz básicas y un solucionador de valores propios.

Elemental , desarrollado por Jack Poulson, es un paquete de software de álgebra lineal densa de memoria distribuida (paralela) escrito en un estilo similar a FLAME . Para obtener una lista de características y antecedentes del proyecto, consulte su documentación . FLAME tiene una biblioteca asociada para álgebra lineal densa secuencial y de memoria compartida, llamada libflame , que parece estar escrita en C. orientada a objetos. las bibliotecas de álgebra lineal son más una ciencia y menos un arte negro.

Hay otras bibliotecas que se pueden agregar a la lista; Si contamos los paquetes de álgebra lineal dispersos como "bibliotecas matriciales", la mejor libre que conozco en C es SuiteSparse , que está programada en estilo orientado a objetos. He usado SuiteSparse y me resultó bastante fácil de aprender; depende de BLAS y LAPACK para algunos de los algoritmos que descomponen problemas dispersos en muchos subproblemas de álgebra lineal pequeños y densos. El autor principal del paquete, Tim Davis, es increíblemente útil y un gran tipo versátil.

Los Harwell subrutinas Las bibliotecas son famosos por sus escasas rutinas de álgebra lineal, y son gratis para los usuarios académicos, aunque tenga que pasar por este proceso de llenar un formulario y recibir un correo electrónico para cada archivo que desea descargar. Dado que las subrutinas a menudo tienen dependencias, el uso de un solucionador puede requerir la descarga de cinco o seis archivos, y el proceso puede volverse algo tedioso, especialmente porque la aprobación del formulario no es instantánea.

También hay otros solucionadores de álgebra lineal dispersos, pero por lo que puedo decir, MUMPS y otros paquetes se centran principalmente en la solución de sistemas lineales, y resolver sistemas lineales es la menor de mis preocupaciones en este momento. (Tal vez más tarde, necesitaré esa funcionalidad, y podría ser útil para otros).

Geoff Oxberry
fuente
2
Creo que has confundido a Eigen con Elemental; No he trabajado en Eigen, aunque estoy muy impresionado con el proyecto. Elemental se dirige principalmente a máquinas de memoria distribuida.
Jack Poulson
3
Supongo que mi primera pregunta sería: ¿Alguna vez quieres ejecutar algo en paralelo?
Matt Knepley
1
Debo mencionar Trilinos ... aunque no tiene mucha visibilidad aquí (todavía), es una alternativa viable a PETSc, con un paquete de matriz con plantilla, un eigensolver y un solucionador de matriz disperso, también tiene un paquete destinado específicamente para abstraer la contabilidad de un algoritmo, aunque no sé qué tan bien funciona.
Andrew Spott
1
Eigen parece genial: un colega mío lo usó en un contexto profesional y puede ponerlo en funcionamiento lo suficientemente rápido sin sacrificar el rendimiento.
qdot
77
También agregaría las siguientes bibliotecas a su respuesta: ViennaCL : biblioteca de encabezado C ++ basada en OpenCL que puede interactuar con Eigen y MTL. PLASMA : un rediseño basado en UTK de las bibliotecas BLAS y LAPACK con descomposiciones basadas en mosaicos. MAGMA : otro proyecto de UTK que se centra en mejorar el rendimiento de LAPACK / BLAS.
Aron Ahmadia
24

Este documento fue escrito en marzo de 2009 para ayudar en la elección de una biblioteca de álgebra lineal para una biblioteca científica. Evalúa la portabilidad, la interfaz de alto nivel y las licencias para varias bibliotecas, entre ellas Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos y uBlas. Parece ser particularmente aficionado a Flens y Seldon . (Uno de los requisitos era que las plantillas C ++ y las matrices dispersas debían ser compatibles).

J h
fuente
17

De todos los proyectos enumerados anteriormente, en realidad solo hay dos pesos pesados ​​que son extremadamente utilizados (y por buenas razones): PETSc y Trilinos. Ambos están desarrollados profesionalmente y tienen una gran base de desarrolladores. Todos los demás son proyectos bastante pequeños en comparación con estos dos, y recomendaría ir con ellos porque (i) serán compatibles durante mucho tiempo y (ii) es probable que ya tengan todas las funcionalidades que necesitará con respecto a álgebra lineal (y mucho más además de eso).

Wolfgang Bangerth
fuente
44
PETSc no presenta mucho más que una interfaz ligeramente abstracta para ScaLAPACK y PLAPACK. Si Geoff está interesado en el álgebra lineal densa conveniente, creo que PETSc es excesivo (no sé lo suficiente sobre las capacidades densas de Trilinos para comentar)
Aron Ahmadia
@AronAhmadia: En este punto, creo que la respuesta se ha transformado en más de un recurso wiki comunitario, por lo que he estado agregando paquetes a pedido de los comentaristas.
Geoff Oxberry
3
@WolfgangBangerth: Creo que es importante mencionar los objetivos de diseño. Si el objetivo es escribir un software que sea duradero y destinado a ser utilizado por otros, y el álgebra lineal es una parte integral de ese software, entonces PETSc y Trilinos son buenas opciones. Sin embargo, hay casos en que las opciones más ligeras son preferibles y útiles, porque tienen API más simples y pueden realizar casi la misma tarea en menos líneas de código. Finalmente, el sesgo de selección juega un papel en la supervivencia de los códigos. Si nadie usa los códigos más pequeños, no durarán ni construirán una base como PETSc y Trilinos.
Geoff Oxberry
1
Para agregar a lo que dijo Geoff, la gran mayoría de la funcionalidad de PETSc y Trilinos proviene de envoltorios alrededor de bibliotecas externas. Decir que nadie debería usar dichas bibliotecas externas directamente me parece extraño.
Jack Poulson
1
@JackPoulson: en realidad mantengo mi comentario. Sí, PETSc envuelve muchos paquetes individuales. Pero lo hace con una interfaz uniforme y, por lo tanto, es más simple aprender esto una vez que tener que aprender las peculiaridades de cada convención y estilo de nombres de paquetes. En otras palabras, si bien cada proyecto individual puede usar igualmente los paquetes envueltos, existe una sinergia que proviene de usarlos a través de PETSc cada vez.
Wolfgang Bangerth
11

Si tu quieres

  • Clases de matriz con una interfaz intuitiva.
  • Todas las características de LAPACK y BLAS
  • API fácil de aprender y usar
  • Fácil de instalar

Entonces te recomiendo que eches un vistazo a mi biblioteca FLENS . Lo diseñé para exactamente este tipo de tareas. Sin embargo, requiere un compilador conforme C ++ 11 (por ejemplo, gcc 4.7 o clang).

FLENS le ofrece exactamente el mismo rendimiento que la implementación BLAS subyacente. Hay algunos puntos de referencia (bastante antiguos) que muestran esto

Lo mismo puede decirse de FLENS-LAPACK, solo le brinda exactamente el mismo rendimiento que el LAPACK de Netlib si se usa la misma implementación BLAS.

Con respecto a los nuevos puntos de referencia, permítanme entrar en más detalles ...

Hace algún tiempo le pregunté a Clint Whaley (el autor de ATLAS) qué piensa sobre los puntos de referencia publicados en el sitio de Eigen. Él acaba de confirmar a mi sospechoso de que estos puntos de referencia probablemente no sean confiables. Mientras tanto, algunos otros puntos de referencia realizados como sugirió Clint. Los detalles se pueden encontrar en el sitio de ATLAS y en la lista de correo de Eigen. Los puntos de referencia no están bien presentados en los gráficos, pero muestran que ATLAS siempre es aproximadamente un 40% más rápido que Eigen. Esto contradice los puntos de referencia del sitio Eigen pero confirma otros puntos de referencia (por ejemplo, los de blaze-lib).

Tenga en cuenta que para el álgebra lineal numérica densa los productos matriz-matriz son los más relevantes. Personalmente no me importa si Eigen o ATLAS son más rápidos. Si Eigen fuera más rápido que ATLAS, usaría Eigen como backend BLAS.

Descargo de responsabilidad: Sí, FLENS es mi bebé! Eso significa que codifiqué alrededor del 95% y cada línea de código valió la pena :-)

Michael Lehn
fuente
Hola Michael, bienvenido a scicomp. Su URL no funciona para mí, ¿hay algún problema con su servidor?
Aron Ahmadia
Gracias por la pista. La URL es correcta, pero parece que estamos teniendo un problema en el departamento de matemáticas con el servidor de archivos. Justo a tiempo para el fin de semana ...
Michael Lehn
1
Ok, acabo de crear nueva documentación del repositorio actual de git y la copié en otro servidor: apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
Michael Lehn
3

He estado usando GMM ++ por algún tiempo y estoy feliz con eso.

GertVdE
fuente
1

¿Cuál sería la mejor biblioteca matricial para manejar matrices de pequeño tamaño, que se usan comúnmente, por ejemplo, al ensamblar matrices de elementos finitos, para realizar operaciones de tensor, etc.

Ya estoy usando PETSc para la solución de los grandes sistemas lineales dispersos que surgen en mi aplicación, pero actualmente estoy usando mi propia biblioteca simple para manejar estas matrices / vectores ... Estoy considerando mudarme a una biblioteca más rápida. como los mencionados anteriormente.

¿Cuál sería la mejor opción para asociarse con PETSc? Eigen? ¿Armadillo? IMPULSO :: uBlas? MTL4? Utilizo algunas cosas de BOOST, así que, primero pensé en usar BOOST :: uBlas, pero no hay mucha documentación, ejemplos, etc.

Bernardo MR
fuente
2
Recomiendo no usar uBlas, ya que se sabe que es un orden de magnitud más lento que las rutinas BLAS optimizadas. Creo que Eigen brilla más para matrices muy pequeñas debido a ingeniosos trucos de plantillas.
Jack Poulson
1
Esto es probablemente mejor para una pregunta separada. Sé que Eigen, MTL4 y Armadillo tienen trucos para resolver sistemas de tamaño pequeño, pero creo que estás preguntando cómo ensamblar matrices, y por eso, no lo sé. Normalmente ensamblo matrices elemento por elemento. No estoy seguro de si alguna de las bibliotecas mencionadas son buenas para acoplar con PETSc; Todavía no soy usuario de PETSc. Sin embargo, secundo el comentario de Jack sobre Boost :: uBlas, porque es lento.
Geoff Oxberry
1

Armadillo, Boost y otros ahora se incluyen como parte de Ceemple, un rápido entorno informático técnico C ++ basado en JIT. Disponible (gratis) en http://www.ceemple.com .

usuario7774
fuente
0

Sorprendido, nadie ha mencionado TooN hasta ahora. Lo he estado usando felizmente por casi 3 años.

Es muy similar a Eigen, aunque no tan completo. Sin embargo, creo que tiene la sintaxis más agradable de alguna manera.

También viene con clases que ayudan a modelar transformaciones comunes que se encuentran con frecuencia en Gráficos y Visión, basadas en Grupos de Mentiras (Euclidiana Especial / Ortogonal en 2 y 3 dimensiones, etc.) y Álgebras de Mentiras asociadas.

rsp1984
fuente
0

HASEM Matrix C ++ Library es lo que realmente necesita http://sourceforge.net/projects/hasem/

Nidam
fuente
1
"¡HASEM es casi capaz de resolver cualquier problema de álgebra lineal"!
David Ketcheson
¿Por qué es lo que alguien necesita?
mabraham