Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
[[badge:remoção]]
Nesta seção, vamos discutir sobre a paralelização da decomposição LU para matrizes. A decomposição de uma matriz com dimensões é
(2.24) |
onde é uma matriz triangular inferior e é uma matriz triangular superior, ambas com dimensões .
Para fixar as ideais, vamos denotar , sendo e para , e sendo para . O pseudoalgoritmo serial para computar a decomposição é
U = A, L = I
Para
Para
Para
A forma mais fácil de paralelizar este algoritmo em uma arquitetura MP é paralelizando um de seus laços (itens 2., 2.(a) ou 2.(a)ii.). O laço do item 2. não é paralelizável, pois a iteração seguinte depende do resultado da iteração imediatamente anterior. Agora, os dois laços seguintes são paralelizáveis. Desta forma, o mais eficiente é paralelizarmos o segundo laço 2.(a).
O seguinte código é uma versão paralela da decomposição LU. A matriz é inicializada como uma matriz simétrica de elementos randômicos (linhas 19-41), sendo que a decomposição é computada nas linhas 43-61.
Em remoção
Faça um código MP para computar a solução de um sistema linear usando a decomposição LU. Assuma uma matriz simétrica de elementos randômicos, assim como os elementos do vetor .
A decomposição LU da matriz nos fornece as matrizes (matriz triangular inferior) e (matriz triangular superior), com
(2.25) |
Logo, temos
(2.26) | |||
(2.27) | |||
(2.28) |
Denotando , temos que é solução do sistema triangular inferior
(2.29) |
e, por conseguinte, é solução do sistema triangular superior
(2.30) |
Em síntese, o sistema pode ser resolvido com o seguinte pseudocódigo:
Computar a decomposição LU, A=LU.
Resolver .
Resolver .
Cada passo acima pode ser paralelizado. O código MP fica de exercício, veja E 2.9.1.
Considere a decomposição LU de uma matriz . Em muitas aplicações, não há necessidade de guardar a matriz em memória após a decomposição. Além disso, fixando-se que a diagonal da matriz tem todos os elementos iguais a 1, podemos alocar seus elementos não nulos na parte triangular inferior (abaixo da diagonal) da própria matriz . E, a matriz pode ser alocada na parte triangular superior da matriz . Faça um código MP para computar a decomposição LU de uma matriz , alocando o resultado na própria matriz .
O seguinte código faz a implementação pedida. Neste código, é necessário alocar apenas a matriz , sem necessidade de locar as matrizes e . Da linha 17 à 39, apenas é gerada a matriz randômica . A decomposição é computada da linha 41 a 54.
Este algoritmo demanda substancialmente menos memória computacional que o código parallelLU.cc
visto acima. Por outro lado, ele é substancialmente mais lento, podendo demandar até o dobro de tempo. Verifique!
O aumento no tempo computacional se deve ao mau uso da memória cache dos processadores. A leitura de um elemento da matriz, aloca no cache uma sequência de elementos próximos na mesma linha. Ao escrever em um destes elementos, a alocação do cache é desperdiçada, forçando o cache a ser atualizado. Note que o código parallelLU.cc
requer menos atualizações do cache que o código parallelLU2.cc
.
Em remoção
Implemente o código MP discutido no ER 2.9.1.
Implemente um código MP para computar a inversa de uma matriz simétrica de elementos randômicos usando decomposição LU.
Considere o pseudoalgoritmo serial da composição LU apresentado acima. Por que é melhor paralelizar o laço 2.(a) do que o laço o 2.(a)ii.?
Use o código MP discutido no ER 2.9.2 para resolver um sistema de equações e incógnitas. Assuma que a matriz seja simétrica.
Um algoritmo paralelo mais eficiente para computar a decomposição LU pode ser obtido usando-se a decomposição LU por blocos. Veja o vídeo https://youtu.be/E8aBJsC0bY8 e implemente um código MP para computar a decomposição LU por blocos.
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!