Solucionador linear esparso para muitos lados do lado direito


12

Preciso resolver o mesmo sistema linear esparso (300x300 a 1000x1000) com muitos lados do lado direito (300 a 1000). Além deste primeiro problema, eu também gostaria de resolver sistemas diferentes, mas com os mesmos elementos diferentes de zero (apenas valores diferentes), ou seja, muitos sistemas esparsos com padrão de esparsidade constante. Minhas matrizes são indefinidas.

O desempenho da fatoração e inicialização não é importante, mas o desempenho do estágio de resolução é. Atualmente, estou pensando em PaStiX ou Umfpack, e provavelmente vou brincar com o Petsc (que suporta ambos o solucionador) Existem bibliotecas capazes de tirar proveito de minhas necessidades específicas (vetorização, multiencadeamento) ou devo confiar em solucionadores gerais e talvez modificá-los um pouco para as minhas necessidades?

E se a matriz esparsa for maior, até ?106×106

Respostas:


10

Sem tomar partido da discussão sobre o uso de solucionadores diretos ou iterativos, eu só quero acrescentar dois pontos:

  1. Existem métodos de Krylov para sistemas com vários lados do lado direito (chamados métodos de bloco de Krylov ). Como um bônus adicional, eles geralmente têm convergência mais rápida que os métodos Krylov padrão, já que o espaço Krylov é construído a partir de uma coleção maior de vetores. Veja Dianne P. O'Leary, o algoritmo de gradiente conjugado em bloco e métodos relacionados . Álgebra Linear e suas aplicações 29 (1980), páginas 239-322. e Martin H. Gutknecht, métodos espaciais Block Krylov para sistemas lineares com vários lados do lado direito: Uma introdução (2007).

  2. Se você tiver diferentes matrizes com o mesmo padrão de esparsidade, poderá pré-calcular uma fatoração simbólica para a primeira matriz, que pode ser reutilizada no cálculo da fatoração numérica para esta e as matrizes subsequentes. (No UMFPACK, você pode fazer isso usando umfpack di symbolice passando o resultado para umfpack_di_numeric.)


9

Geralmente, há uma troca entre a quantidade de trabalho que você dedica na construção de um bom pré-condicionador para um solucionador iterativo e o trabalho que você salva usando um bom pré-condicionador ao resolver os sistemas lineares. No seu caso, o caso é bastante claro: trabalhe o máximo possível na construção de um bom pré-condicionador, pois você precisará resolver muitos sistemas lineares. Na verdade, acho que é apropriado investir tempo para obter o pré-condicionador perfeito: uma decomposição da LU (usando UMFPACK, por exemplo, ou o solucionador Pardiso que faz parte do MKL da Intel). Em seguida, basta aplicar essa decomposição quantas vezes for necessário. Se você tiver sistemas lineares para resolver, nada poderá superar uma decomposição exata.O(N)


4
Sua última declaração é discutível. Considere uma fatoração multifrontal exata de uma discretização 3D FEM ou FD sobre um cubo, que deve exigir trabalho de e uso de memória de . Portanto, as soluções exatas exigem flops por lado direito e, portanto, para suficientemente grande , qualquer solucionador iterativo com menor complexidade assintótica será mais rápido. O(N2)O(N4/3)O(N4/3)N
22813 Jack Poulson

3
Talvez. Mas, por uma questão de consideração prática, os solucionadores diretos esparsos ainda são extremamente rápidos, uma vez que a constante na frente de um solucionador de é bastante grande, enquanto a constante na frente do é não. O(N)O(N4/3)
Wolfgang Bangerth 08/02

2
O problema é que você fica com memória e paciência para a fatoração no ponto de cruzamento. Para o Laplaciano de 7 pontos, o multigrid precisa de cerca de 50 flops / dof, levando a um crossover de flops (versus back- resolution ) em torno de dofs. A resolução traseira usa muito mais memória, mas geralmente existem kernels para muitos lados do lado direito. O multigrid geralmente não é escrito para muitos lados do lado direito, sacrificando o potencial de vetorização. Eu apostaria que você pode escrever um algoritmo MG para o qual o tempo por RHS é menor que um CHOLMOD (ou qualquer outro pacote) para o 3D Laplacian em alguns . 105n<300k
precisa

3

Você não é muito claro em sua declaração do problema quando fala sobre "os mesmos elementos diferentes de zero (apenas valores diferentes)". Você está dizendo que a matriz tem um padrão de escarsidade constante, mas os valores reais mudam? Ou você está dizendo que a matriz é de fato constante?

Supondo que a matriz esparsa seja constante e que apenas o lado direito esteja sendo alterado, você deve procurar métodos que usem a fatoração direta (no formato ) da matriz e, em seguida, resolver cada lado direito com a frente / substituição para trás. Quando a fatoração estiver concluída, cada solução terá um tempo extremamente rápido ( para fatores completamente densos, mas para fatores esparsos isso será proporcional ao número de não-zeros nos fatores). S ( n 2 )PA=LUO(n2)

Para vários lados do lado direito e sistemas de equações desse tamanho, os métodos iterativos geralmente não valem a pena.

Todos os pacotes que você mencionou oferecem métodos de fatoração direta (embora o PetSc seja conhecido principalmente por seus solucionadores iterativos.) No entanto, seus sistemas são tão pequenos que é improvável que você possa obter acelerações paralelas substanciais, principalmente em um ambiente de memória distribuída.

Eu sugiro usar o Umfpack para este trabalho - PaStix e PetSc são um exagero.


Obrigado pela sua resposta. Para esclarecer: pedi primeiro uma matriz única com muitos lados do lado direito e, em seguida, outro problema é uma coleção de matrizes com o mesmo padrão de esparsidade, mas os valores mudam, e cada uma delas deve ser resolvida por muitos rhs. Pergunta subsidiária: e se a matriz esparsa for agora 10 ^ 5x10 ^ 5 a 10 ^ 6x10 ^ 6?
chouf nat

2
Minha regra geral é que um solucionador direto esparso (tomando como exemplo a discretização de um 2E PDE) é mais rápido que até um bom solucionador iterativo se o tamanho da matriz for menor que . Isso pode ser um palpite, mas pode lhe dar uma ideia. 105
Wolfgang Bangerth

Usar um método iterativo para seus sistemas maiores com apenas um lado direito pode fazer sentido, principalmente se você não precisar de soluções muito precisas e, principalmente, se encontrar um pré-condicionador eficaz ou se seus sistemas já estão bem condicionados. No entanto, se seus sistemas estão mal condicionados, você precisa de soluções precisas e não consegue encontrar um bom pré-condicionador, provavelmente ainda estará melhor com a fatoração direta.
22713 Brian Borchers

Outra consideração importante são os requisitos de memória. Depois de entrar em sistemas esparsos muito grandes, onde é da ordem , você pode ficar sem memória facilmente para armazenar a fatoração direta. No ponto, você definitivamente será forçado a mudar para o uso de um método iterativo. 10 6N106
Brian Borchers
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.