Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
Em remoção
Nesta seção, vamos discutir sobre a uma implementação em paralelo do método da substituição para a resolução de sistemas triangulares. Primeiramente, vamos considerar uma matriz triangular inferior quadrada de dimensões , i.e. com para . Ainda, vamos coniderar que é invertível.
Neste caso, um sistema linear pode ser escrito na seguinte forma algébrica
(2.10) | |||
(2.11) | |||
(2.12) | |||
(2.13) | |||
(2.14) |
O algoritmo serial do método da substituição (para frente) resolve o sistema começando pelo cálculo de na primeira equação, então o cálculo de pela segunda equação e assim por diante até o cálculo de pela última equação. Segue o pseudocódigo serial.
Para :
Para :
Implemente!
Para o algoritmo paralelo, vamos considerar uma arquitetura MP com instâncias de processamento. Para cada instância de processamento vamos alocar as seguintes colunas da matriz
(2.15) | |||
(2.16) |
e, para vamos alocar as últimas colunas, i.e.
(2.17) | |||
(2.18) |
Segue o pseudocódigo em paralelo.
Para
Região paralela
Para
O código MP C/C++ que apresentaremos a seguir, faz uso do construtor threadprivate
#pragma omp threadprivate(list)
Este construtor permite que a lista de variáveis (estáticas) list
seja privada para cada thread e seja compartilhada entre as regiões paralelas. Por exemplo:
x = 0 #pragma omp parallel private(x) x = 1 #pragma omp parallel private(x) x vale 0
Agora, com o construtor threadprivate
:
static x = 0 #pragma omp threadprivate(x) #pragma omp parallel x = 1 #pragma omp parallel private(x) x vale 1
Ainda, apenas para efeito de exemplo, vamos considerar que para , e para .
Segue o código paralelo para a resolução direta do sistema triangular inferior. Verifique!
Em remoção
Seja um sistema triangular inferior de dimensões . O seguinte pseudocódigo paralelo é uma alternativa ao apresentado acima. Por que este pseudocódigo é mais lento que o anterior?
Região paralela
Para
Se
Para
Este código tem um número de operações semelhante ao anterior, seu desempenho é afetado pelo chamado compartilhamento falso (false sharing). Este é um fenômeno relacionado ao uso ineficiente da memória cache de cada thread. O último laço deste pseudocódigo faz sucessivas atualizações do vetor , o que causa sucessivos recarregamentos de partes do vetor da memória RAM para a memória cache de cada um dos threads. Verifique!
Seja uma matriz triangular inferior e invertível de dimensões . Escreva um pseudocódigo MP para calcular a matriz inversa usando o método de substituição direta.
Vamos denotar e . Note que são as incógnitas. Por definição, , logo
(2.19) | |||
(2.20) | |||
(2.21) | |||
(2.22) | |||
(2.23) |
onde, e denota o Delta de Kronecker. Ou seja, o cálculo de pode ser feito pela resolução de sistemas triangulares inferiores tendo como matriz de seus coeficientes.
Para construirmos um pseudocódigo MP, podemos distribuir os sistemas lineares a entre os threads disponíveis. Então, cada thread resolve em serial seus sistemas. Segue o pseudocódigo, sendo e .
Região paralela
Para
resolve
Em remoção
Implemente um código MP do pseudocódigo discutido no ER 2.8.1. Compare o tempo computacional com o do código sistria1dcol.cc
.
Implemente um código MP para computar a inversa de uma matriz triangular inferior de dimensões .
Implemente um código MP para computar a solução de um sistema linear triangular superior de dimensões .
Implemente um código MP para computar a inversa de uma matriz triangular superior de dimensões .
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!