Solucionador lineal escaso para muchos lados derechos


12

Necesito resolver el mismo sistema lineal disperso (300x300 a 1000x1000) con muchos lados derechos (300 a 1000). Además de este primer problema, también me gustaría resolver diferentes sistemas, pero con los mismos elementos distintos de cero (solo valores diferentes), es decir, muchos sistemas dispersos con un patrón de dispersión constante. Mis matrices son indefinidas.

El rendimiento de la factorización e inicialización no es importante, pero el rendimiento de la etapa de resolución sí lo es. Actualmente estoy considerando PaStiX o Umfpack, y probablemente jugaré con Petsc (que admite ambos solucionadores) ¿Hay bibliotecas capaces de aprovechar mis necesidades específicas (vectorización, subprocesamiento múltiple) o debo confiar en solucionadores generales, y tal vez modificarlos ligeramente para mis necesidades?

¿Qué pasa si la matriz dispersa es más grande, hasta ?106×106

Respuestas:


10

Sin tomar partido por la discusión sobre si usar solucionadores directos o iterativos, solo quiero agregar dos puntos:

  1. Existen métodos de Krylov para sistemas con múltiples lados derechos (llamados métodos de bloque de Krylov ). Como beneficio adicional, estos a menudo tienen una convergencia más rápida que los métodos estándar de Krylov, ya que el espacio de Krylov se construye a partir de una colección más grande de vectores. Ver Dianne P. O'Leary, El algoritmo de gradiente conjugado en bloque y métodos relacionados . Álgebra lineal y sus aplicaciones 29 (1980), páginas 239-322. y Martin H. Gutknecht, Métodos espaciales de Block Krylov para sistemas lineales con múltiples lados derechos: una introducción (2007).

  2. Si tiene diferentes matrices con el mismo patrón de dispersión, puede calcular previamente una factorización simbólica para la primera matriz, que puede reutilizarse para calcular la factorización numérica para esta y las matrices posteriores. (En UMFPACK, puede hacer esto usando umfpack di symbolicy pasando el resultado a umfpack_di_numeric).


9

Por lo general, existe una compensación entre la cantidad de trabajo que realiza para construir un buen preacondicionador para un solucionador iterativo y el trabajo que ahorra al usar un buen preacondicionador cuando realmente resuelve los sistemas lineales. En su caso, el caso es bastante claro: trabaje tanto como pueda para construir un buen preacondicionador porque debe resolver tantos sistemas lineales. De hecho, creo que es apropiado invertir el tiempo para obtener el preacondicionador perfecto: una descomposición LU (usando UMFPACK, por ejemplo, o el solucionador Pardiso que viene como parte del MKL de Intel). Luego, simplemente aplique esta descomposición tantas veces como sea necesario. Si tiene que resolver sistemas lineales , no se puede esperar que nada supere una descomposición exacta.O(N)


44
Su última declaración es discutible. Considere una factorización multifrontal exacta de una discretización 3D FEM o FD sobre un cubo, que debería requerir un trabajo de y un uso de memoria . Por lo tanto, las soluciones exactas requieren flops por el lado derecho y, por lo tanto, para un suficientemente grande , cualquier solucionador iterativo con una menor complejidad asintótica será más rápido. O ( N 4 / 3 ) O ( N 4 / 3 ) NO(N2)O(N4/3)O(N4/3)N
Jack Poulson

3
Tal vez. Pero como una cuestión de consideración práctica, los solucionadores directos dispersos aún son muy rápidos dado que la constante frente incluso a un solucionador es bastante grande, mientras que la constante frente al es no. O ( N 4 / 3 )O(N)O(N4/3)
Wolfgang Bangerth

2
El problema es que tienes poca memoria y paciencia para la factorización en el punto de cruce. Para el Laplaciano de 7 puntos, la multigrid necesita alrededor de 50 flops / dof, lo que lleva a un cruce de flops (frente a la resolución posterior) en alrededor de dofs. La resolución posterior utiliza mucha más memoria, pero los núcleos para muchos lados derechos están comúnmente disponibles. Multigrid generalmente no se escribe para muchos lados derechos, lo que sacrifica el potencial de vectorización. Apuesto a que puede escribir un algoritmo MG para el cual el tiempo por RHS es menor que un CHOLMOD (o cualquier otro paquete) resuelve para 3D Laplacian a unos . n < 300 k105n<300k
Jed Brown

3

No está del todo claro en su declaración del problema cuando habla de "los mismos elementos distintos de cero (solo valores diferentes)" ¿Está diciendo que la matriz tiene un patrón de dispersión constante pero los valores reales cambian? ¿O estás diciendo que la matriz es de hecho constante?

Suponiendo que la matriz dispersa es constante y que solo está cambiando el lado derecho, entonces debe buscar métodos que usen la factorización directa (de la forma ) de la matriz, y luego resuelva para cada lado derecho adelante / sustitución hacia atrás Una vez que se completa la factorización, cada solución será extremadamente rápida ( tiempo para factores completamente densos, pero para factores dispersos esto será proporcional al número de nonzeros en los factores). O ( n 2 )PA=LUO(n2)

Para múltiples lados derechos y sistemas de ecuaciones de este tamaño, los métodos iterativos generalmente no valen la pena.

Todos los paquetes que mencionó ofrecen métodos de factorización directa (aunque PetSc es conocido principalmente por sus solucionadores iterativos). Sin embargo, sus sistemas son tan pequeños que es poco probable que pueda obtener aceleraciones paralelas sustanciales, particularmente en un entorno de memoria distribuida.

Sugeriría usar Umfpack para este trabajo: PaStix y PetSc son excesivos.


Gracias por tu respuesta. Para aclarar: primero pedí una matriz única con muchos lados derechos, y luego, otro problema es una colección de matrices con el mismo patrón de dispersión pero los valores cambian, cada uno de ellos debe resolverse por muchas horas. Pregunta subsidiaria: ¿qué pasa si la matriz dispersa ahora es 10 ^ 5x10 ^ 5 a 10 ^ 6x10 ^ 6?
nat chouf

2
Mi regla de oro es que un solucionador directo disperso (tomando como ejemplo la discretización de un 2d PDE) es más rápido que incluso buenos solucionadores iterativos si el tamaño de la matriz es inferior a . Puede ser una suposición aproximada, pero puede darte una idea. 105
Wolfgang Bangerth

Usar un método iterativo para sus sistemas más grandes con un solo lado derecho podría tener sentido, particularmente si no necesita soluciones muy precisas y particularmente si puede encontrar un preacondicionador efectivo o si sus sistemas ya están bien acondicionados. Sin embargo, si sus sistemas están mal acondicionados, necesita soluciones precisas y no puede encontrar un buen preacondicionador, es probable que aún esté mejor con la factorización directa.
Brian Borchers

Otra consideración importante son los requisitos de memoria. Una vez que ingresa a sistemas dispersos muy grandes donde es del orden , puede quedarse sin memoria para almacenar la factorización directa. En este punto, definitivamente se verá obligado a cambiar a un método iterativo. 10 6N106
Brian Borchers
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.