Recomendaciones para un solucionador de álgebra lineal denso ligero / sin instalación basado en C o C ++


9

La mayor parte de mi programación son códigos de investigación únicos en C para mi propio uso. Nunca he distribuido ningún código a otros que no sean colaboradores cercanos. He desarrollado un algoritmo que estoy publicando en una revista científica. Quiero proporcionar el código fuente y quizás el código ejecutable en el suplemento en línea del artículo. Un colega me pidió que hiciera una generalización del algoritmo que me requería escribir en C ++ (¡ack!) Y que requiere que resuelva pequeños sistemas lineales densos. Si logro obtener una base de usuarios para el algoritmo, será en parte debido a que la barra de entrada para usarlo es baja (como en el piso). Los usuarios potenciales no instalarán bibliotecas, etc. para usar el código. Quiero que el código sea completamente independiente y no esté afectado por ninguna licencia. Simplemente podría escribir mi propio solucionador sacando algo de Golub y van Loan, pero prefiero usar un solucionador de vainilla que alguien más ya haya escrito si hay alguno por ahí. Sugerencias apreciadas. ¡Gracias!



Estimado jep, bienvenido al foro. Su pregunta es muy similar a la de aquí: scicomp.stackexchange.com/questions/351/…
GertVdE

Los solucionadores de bibliotecas tienden a ser complejos y grandes por razones de robustez, eficiencia y generalidad. Si sus problemas son muy pequeños y están razonablemente bien condicionados, le sugiero que escriba su propia mini implementación.
Stefano M

@GertVdE, gracias por la rápida respuesta a esta pregunta. Me incomoda vincularme a la pregunta "Recomendaciones ..." porque tanto la pregunta como la respuesta principal son demasiado generales para proporcionar ayuda en situaciones como estas. Si desea hablar más sobre esto, sugiero que lo llevemos a la sala de chat de scicomp .
Aron Ahmadia

@AronAhmadia: Creo que la única forma de comenzar a resolver algunos de estos debates es comenzar a implementar una crestomática de programación de ciencias computacionales que depende tanto del lenguaje como de la biblioteca. Si el código es claro, y los problemas de configuración pueden solucionarse (usando un script de shell, Chef o Puppet), entonces los debates sobre el rendimiento pueden solucionarse (o concretarse) simplemente ejecutando el código y sincronizándolo en un máquina de referencia. Los debates sobre la claridad pueden resolverse (o al menos hacerse más concretos) mirando el código. De lo contrario, seguiremos teniendo los mismos argumentos.
Geoff Oxberry

Respuestas:


7

Sugeriría duplicar exactamente la interfaz de Lapack a la función que necesita, lo más probable es que solo necesite dgesv. De esa manera, las personas que tienen instalado Lapack pueden simplemente conectarse a él y simplemente funcionará. Para las personas que no tienen instalado Lapack, puede proporcionar su propia implementación simple de esta función, o posiblemente implementarla utilizando Eigen o FLENS como otros sugirieron.

En la tierra de Fortran, la biblioteca Lapack es un estándar tal, que la mayoría de la gente simplemente la usa y eso es todo, en lugar de proporcionar sus propias implementaciones.


+1 Agregue el hecho de que la mayoría de las distribuciones de Linux (al menos basadas en Debian) tienen paquetes binarios en el repositorio y todas las bibliotecas de matemáticas proporcionadas por el proveedor (MKL, SunPerf, ACML, ESSL, etc.) lo llevan. Siempre debe usar libs estándar tanto como sea posible, aunque si está en Windows / Mac, podría estar mejor con algo basado en C, ya que instalar un compilador Fortran gratuito (gfortran) en ellos es una cierta cantidad de trabajo, o eso he oído.
stali

He usado lapack muchas veces pero actualmente no estoy en tierras fortran. Espero que la distribución estadística de las plataformas en las que se ejecuta mi base de usuarios sea similar a la del mundo en general, principalmente ventanas, un porcentaje menor de Mac y un porcentaje aún menor de * nix. Mi experiencia con Windows es mínima y prefiero mantenerlo así. Esta es la razón por la que quiero un código C ++ independiente. Supongo que tendré que proporcionar ayuda a algunos de mis usuarios para que compile y ejecute el código. Necesito minimizar el trabajo requerido para hacer eso.
jep

Si su base de usuarios es Windows / Macs, entonces está mejor con una implementación simple basada en C (quizás incluso la suya). Un paquete que es difícil de instalar o que depende de otras 5 bibliotecas, especialmente cuando no hay un repositorio de paquetes binarios de primera clase (como Debian) disponible, desactivará a sus usuarios durante mucho tiempo. Recuerde que la mayoría de los usuarios de Windows / Mac están acostumbrados a la instalación con un clic. La facilidad de uso triunfa sobre todo lo demás.
stali

5

Un error muy temprano que muchas personas cometen al iniciarse en la informática científica es asumir que necesita escribir todo su código en el mismo idioma. Creo que esto se debe en gran medida a razones históricas, cuando no estaba claro cómo hacer que los programas compilados se comuniquen entre sí a través de versiones pares del mismo compilador. Dicho esto, en este caso, si va a usar C ++ de todos modos, hay varias bibliotecas de plantillas de encabezado de C ++ muy buenas que pueden satisfacer sus necesidades.

Dado que está distribuyendo su código por razones académicas, y desea incorporar un solucionador de álgebra lineal denso en su código, le recomiendo encarecidamente que considere Eigen . Eigen ha sido licenciado bajo la Licencia pública de Mozilla y es una biblioteca de solo encabezado. Esto significa que puede distribuir Eigen con su código en forma de fuente (esto no impone ninguna restricción de licencia en su código), y recibirá acceso a sus capacidades generales, incluidos los solucionadores lineales densos extremadamente eficientes. Como menciona GertVdE, tiene varias otras opciones .


Esperaba un solo archivo. He hecho programación científica durante bastante tiempo. He mezclado bastante lenguajes como C y fortran, pero para este proyecto realmente solo quiero un archivo que contenga todo mi código fuente. Supongo que podría poner un solucionador de C en el código de C ++ que no sería un gran problema. Principalmente quiero mantener el código lo más simple posible. La LU con pivote debe ser adecuada. Voy a mirar a Eigen. ¡Gracias!
jep

@jep, también puedes intentar seleccionar las rutinas que necesitas de CLAPACK si realmente no te importa en absoluto el rendimiento.
Aron Ahmadia

Hay buenas razones para escribir todo el código dependiente en el mismo idioma, en particular, en entornos HPC, tiene problemas extraños de compilación / enlace y problemas de interfaz de 32/64 bits. Por ejemplo, ¿cómo sé el ancho de un entero para las bibliotecas integradas? ¿Cómo sé con certeza qué compilador se usó para una biblioteca integrada, y puedo vincularlo con este otro compilador? Tener todo en un idioma simplifica muchos de estos problemas. Y sí, debería haber documentación proporcionada por los encargados del mantenimiento del clúster, pero la mayoría de las veces no la hay.
Victor Liu

@VictorLiu: los problemas a los que se refiere están más estrechamente relacionados con las implementaciones que con los idiomas. El espacio para comentarios es un mal lugar para entablar una discusión seria, pero estoy feliz de entablar una conversación con usted o en otro lugar si desea que amplíe mis pensamientos sobre esto.
Aron Ahmadia

4

Si desea un solucionador confiable para sistemas de ecuaciones lineales, recomendaría FLENS . Contiene una reimplementación exacta de LAPACK (incluso reproduce los mismos errores de redondeo que LAPACK si se usa una implementación BLAS de un solo subproceso). Esto es cierto para todas las funciones FLENS-LAPACK (junto con las funciones de utilidad de aproximadamente 100 rutinas).

FLENS está bajo una licencia BSD y, por lo tanto, permite incorporarse a productos patentados.

FLENS es solo encabezado y si solo necesita un subconjunto de FLENS, puedo darle una versión simplificada que contiene solo las funciones que necesita. FLENS viene con su propia implementación BLAS de referencia. Pero, opcionalmente, sus usuarios pueden vincularse con bibliotecas BLAS optimizadas como ATLAS, OpenBLAS o GotoBALS. Para matrices grandes, esto proporciona una ganancia de rendimiento de aproximadamente el 40% en comparación con Eigen.

Y sí, Eigen también usa el paquete de pruebas LAPACK para verificar sus resultados. Lo hacen para 3 funciones (Lu, Cholesky y Eigenvalues ​​/ -vectors de una matriz simétrica). Sin embargo, su cálculo de valores / vectores propios de una matriz no simétrica fallaría en el conjunto de pruebas LAPACK.

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.


1
Michael: considere esta advertencia amistosa de que debe seguir la regla en las preguntas frecuentes sobre la divulgación de afiliación .
Aron Ahmadia

Claro, pero también puedes reformular tus publicaciones de 'Recomiendo encarecidamente que consideres Eigen' a algo como 'por ejemplo, Eigen'. En este caso, elimino mis comentarios sobre Eigen (aunque todos han demostrado ser ciertos), incluido este.
Michael Lehn

1
Sus comentarios sobre Eigen no están en discusión aquí (aunque me parecen fuera de tema). Usted es un desarrollador principal de FLENS, si va a recomendarlo en una respuesta aquí, debe divulgar su afiliación como desarrollador del proyecto.
Aron Ahmadia

Ah, está bien entonces. Pensé que estaba implícitamente claro por '... puedo darte ...'. ¿La divulgación en este formulario está bien?
Michael Lehn

2
Solo quiero decir gracias por hacer esto; Tenía planes similares para volver a implementar una gran parte de Lapack en C ++. Sin embargo, parece que para la mayoría de las rutinas avanzadas (valor propio), simplemente aplazas llamar a Lapack, por lo que es un poco de publicidad falsa decir que vuelves a implementar todo. Por otro lado, en realidad he portado la fuente ZGEEV a C ++ en RNP , aunque algunas partes todavía están en indexación basada en 1 desde la conversión automática.
Victor Liu el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.