II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

27
Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes Eduardo de Lucena Falcão Alisson Vasconcelos de Brito Alexandre Nóbrega Duarte

description

Apresentação realizada na II EPI.

Transcript of II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Page 1: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Estudo e Avaliação do Problema de Otimização da Multiplicação de

Cadeias de Matrizes

Eduardo de Lucena FalcãoAlisson Vasconcelos de BritoAlexandre Nóbrega Duarte

Page 2: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

•Introdução•O Problema da Multiplicação de Cadeias de Matrizes•O Problema do Cache Miss•Análise e Detalhamento de Possíveis Soluções para o Problema de Multiplicação de Cadeias de Matrizes• Abordagem Sequencial• Abordagem com Programação Dinâmica• Abordagem com Minimização do Cache Miss• Abordagem Distribuída com Threads• Abordagem Distribuída com OpenMP

•Resultados•Conclusão•Referências

Sumário

Page 3: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

-Lei de Moore;-Processadores vs Memória RAM-Memória Cache

Introdução

Page 4: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

- Além de aspectos de hardware como frequência do processador e tamanho da memória, é importante utilizar as estruturas de dados e técnicas de algoritmos que mais se adéquam ao estilo de problema a ser resolvido. Adicionalmente, podemos perceber que as escolhas de ferramentas, Linguagens de Programação e APIs também podem ter certo impacto no desempenho da solução.

Introdução

Page 5: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

-O objetivo do presente trabalho é tornar evidentes os vários fatores que podem influenciar no desempenho de um programa:

- utilizar a memória cache de maneira inteligente;- estruturas de dados e técnicas de programação mais

adequados ao problema;- ferramentas e LPs a serem utilizadas.

-Para tal, será apresentado o problema da Multiplicação de Cadeias de Matrizes, avaliando seu tempo de execução, quando projetado de diferentes modos.

Introdução

Page 6: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

-Entrada: cadeia com n matrizes-Saída: matriz resultante do produto das n matrizes

-O problema em sua essência é trivial, pois se multiplicarmos sequencialmente as n matrizes obteremos facilmente o resultado esperado. O maior desafio que reside neste problema é otimizar o desempenho do programa que o resolve. Para tal, podemos explorar técnicas de programação aplicadas ao problema específico, além de buscar sempre explorar o processamento máximo do computador de maneira inteligente.

O Problema da Multiplicação de Cadeias de Matrizes

Page 7: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

-Acontece quando o processador necessita de um dado, e este não está na memória cache. Tal fato obriga o processador a buscar um bloco de dados –um número fixo de palavras - diretamente na memória RAM, trazendo-os para a memória cache e em seguida fornecendo a palavra requerida ao processador.-Em razão do fenômeno da localidade espacial, quando um bloco de dados é trazido para a memória cache para satisfazer uma dada referência à memória, é provável que futuras referências sejam feitas para outras palavras desse bloco [Stallings 2010].

O Problema do Cache Miss

Page 8: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

O Problema do Cache Miss

-Soma de todos os elementos de uma matriz quadrada de tamanho 10000 (Java):- Percorrendo as linhas: 53 ms- Percorrendo as colunas: 2886 ms

-Speedup superior a 50 vezes

Page 9: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Análise e Detalhamento de Possíveis Soluções para o Problema de Multiplicação de Cadeias de Matrizes

-Neste tópico serão descritas algumas abordagens possíveis para a solução deste problema, que em alguns casos são complementares e em outros são antagônicas.- Abordagem Sequencial- Abordagem com Programação Dinâmica- Abordagem com Minimização de Cache Miss- Abordagem Distribuída com Threads- Abordagem Distribuída com OpenMP

Page 10: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem Sequencial

-Multiplicam-se sequencialmente as n matrizes para obter seu produto.-Ex.: para uma cadeia com quatro matrizes a ordem de multiplicação seria -Complexidade:

- , sendo n o tam. das matrizes; ou- , para t matrizes

1 for(int i=0; i<a.length ;i++){ for(int j=0; j<b[0].length ;j++){

c[i][j] = 0;for(int k=0; k<a[0].length ;k++)

c[i][j] += a[i][k] * b[k]

[j]; }}

234567

Page 11: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem com Programação Dinâmica-Analisando mais cuidadosamente o código da Tabela anterior, pode-se perceber que o número de multiplicações escalares relacionadas à multiplicação de duas matrizes respeita o seguinte cálculo:

-O referente à multiplicação pode ser descrito de maneira mais detalhada por

-Sendo assim, pode-se observar que a ordem com que as matrizes são multiplicadas pode tornar o programa mais eficiente, ou seja, reduzir o número de multiplicações.

Page 12: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem com Programação Dinâmica-Por ex., para multiplicar uma cadeia de matrizes contendo três matrizes existem duas parentizações possíveis.-Ex.:

-Speedup de 10x. É interessante perceber que para o exemplo anterior a abordagem sequencial é a mais rápida. Mas, deve ser ressaltado que isso foi apenas uma coincidência, e que a probabilidade da abordagem sequencial ser a mais rápida torna-se bastante remota quando o número de matrizes da cadeia aumenta, o que proporciona um ganho expressivo quando se utiliza a abordagem com a parentização otimizada.

Ordem de mult. Nº de mult. escalares

1 75000

2 7500

Page 13: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem com Programação Dinâmica-Mas como proceder para encontrar a parentização otimizada?-Através da força bruta, o nº de soluções seria exponencial em n ( ), sendo n o número de multiplicações, tornando essa verificação inviável [Cormen et al 2002]. Uma alternativa viável para este problema é a utilização da estratégia de Programação Dinâmica.-A Programação Dinâmica (PD) geralmente é aplicada a problemas de otimização, ou seja, problemas que possuem várias soluções, mas deseja-se encontrar uma solução ótima, como é o caso do corrente problema. Para aplicar a PD ao problema da multiplicação de cadeias de matrizes são necessárias quatro etapas: caracterizar a estrutura de uma solução ótima, que nesse caso é a estrutura de uma colocação ótima dos parênteses; definir recursivamente o valor de uma solução ótima para o problema; calcular o valor de uma parentização ótima; construir a solução ótima a partir das informações coletadas. Mais detalhes sobre descrição e implementação desse problema através da PD são fornecidos em [Cormen et al 2002].

Page 14: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem com Minimização do Cache Miss-Com relação ao problema de multiplicação de matrizes, deve-se primeiramente ressaltar que a própria natureza de seu algoritmo o faz mais suscetível à ocorrência de cache miss. Pois é sabido que para multiplicar duas matrizes, deve-se percorrer a linha da primeira e a coluna da segunda, e quando se percorre a coluna de uma matriz a probabilidade de ocorrência do cache miss aumenta.-Baseado no funcionamento do algoritmo, observou-se que é possível minimizar a ocorrência do cache miss invertendo as linhas 1 e 2 da Tabela 1 (quando pertinentes), com o objetivo de que o programa reutilize dados previamente armazenados na memória cache.

1 for(int i=0; i<a.length ;i++){ for(int j=0; j<b[0].length ;j++){

c[i][j] = 0;for(int k=0; k<a[0].length ;k++)

c[i][j] += a[i][k] * b[k]

[j]; }}

234567

Page 15: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem com Minimização do Cache Miss-Pensou-se o seguinte: se a quantidade de linhas da primeira matriz é maior que a quantidade de linhas da segunda matriz, deve-se manter o código da Tabela 1, caso contrário, devem ser invertidas as linhas 1 e 2 da Tabela 1. Com essa verificação, o algoritmo sempre percorrerá a “maior linha possível”, o que minimiza o cache miss.

if(a.length > b.length)

<Código da Tabela 1>

else

<Código da Tabela 1 com linhas 1 e 2 invertidas>

1 for(int i=0; i<a.length ;i++){ for(int j=0; j<b[0].length ;j++){

c[i][j] = 0;for(int k=0; k<a[0].length ;k++)

c[i][j] += a[i][k] * b[k]

[j]; }}

234567

Page 16: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem com Minimização do Cache Miss-Outra maneira de se reduzir o cache miss para o problema da multiplicação de matrizes seria multiplicar a primeira matriz pela matriz transposta da segunda. Pode-se perceber que para isto seria necessário mudar o código relativo à multiplicação das matrizes: ao invés de multiplicar linhas da primeira matriz por colunas da segunda, multiplicar-se-iam linhas da primeira matriz por linhas da segunda, o que implicaria numa redução significativa do cache miss. Para evitar um custo adicional para o cálculo da transposta da segunda matriz, poderia apenas ser alterado o método de criação das mesmas para já criá-las como sendo suas próprias transpostas.

Page 17: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem Distribuída com Threads-A abordagem distribuída utilizando threads visa explorar a potencialidade máxima dos processadores atuais, que geralmente possuem mais de um núcleo físico e/ou lógico. Contudo, a abordagem distribuída com threads utilizada no presente trabalho não caracteriza uma solução ótima, apesar de explorar a capacidade máxima do hardware.

- A estratégia utilizada para esta abordagem divide a cadeia pelo número de threads a serem criadas. Desse modo, cada thread fica encarregada de realizar a multiplicação de uma sub-cadeia, e ao final, quando todas terminarem sua execução, a thread principal realizará a multiplicação das matrizes resultantes.

Page 18: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem Distribuída com Threads-Como exemplo, considere uma cadeia com doze matrizes utilizando a abordagem distribuída com duas threads. Esta cadeia seria quebrada ao meio em duas sub-cadeias e , e depois passaria pelo processo de se encontrar a parentização ótima através da estratégia de PD. Porém, é fácil perceber que a parentização ótima para a cadeia muito dificilmente será alcançada com a divisão da cadeia. Para alcançarmos tanto a parentização ótima e ainda explorar a capacidade máxima do processador outra estratégia deve ser utilizada, como por exemplo, a abordagem distribuída utilizando a biblioteca OpenMP.

Page 19: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

1 for(int i=0; i<a.length ;i++){ for(int j=0; j<b[0].length ;j++){

c[i][j] = 0;for(int k=0; k<a[0].length ;k++)

c[i][j] += a[i][k] * b[k]

[j]; }}

234567

Abordagem Distribuída com OpenMP-A abordagem distribuída utilizando a biblioteca OpenMP (Open Multi-Processing) não divide a cadeia de matrizes em sub-cadeias, e portanto, mantém a parentização otimizada encontrada através da abordagem por PD. Ao invés disso, utilizam-se diretivas em trechos de código que são interpretadas pelo compilador, e que ao executar o programa, ativam as threads dos processadores de acordo com as mesmas. Portanto, o trecho de código que se pretende distribuir deve ser minuciosamente estudado para que nenhuma violação lógica ou física seja cometida.-Para o problema da multiplicação de matrizes, foi percebido que os elementos da matriz resultante não possuem interdependências, o que possibilita a paralelização desse trecho de código, mais especificamente do loop for da linha 1.

#pragma omp parallel for

<Código da Tabela 1>

Page 20: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Abordagem Distribuída com OpenMP-A biblioteca OpenMP usa o modelo de paralelismo fork-and-join, que ramifica a thread principal em threads paralelas, e quando estas terminam de executar, a thread principal reassume o controle do programa [Chandra et al 2001]. Existem diversas diretivas da biblioteca OpenMP que permitem os programadores tornarem seus programas distribuídos. A diretiva que foi utilizada atua de forma simples, ela subdivide a quantidade total de iterações no loop for pelo número de threads a serem utilizadas, e cada thread executará uma parte das iterações que antes eram executadas por apenas uma thread. No problema da multiplicação de matrizes, se a matriz resultante tiver 10 linhas, e for especificado que o processador deve trabalhar com duas threads, a primeira computará o produto das 5 primeiras linhas da matriz resultante, e a segunda computará as linhas restantes.

Page 21: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Resultados

-Para avaliar algumas das abordagens estudadas pensou-se em realizar cinco experimentos, aliando diferentes algoritmos e técnicas de programação. 1.Linguagem de Programação Java:

a) Abordagem sequencial, “maximizando o cache miss”;b)Utilizando técnicas de PD, “maximizando o cache miss”;c) Utilizando técnicas de PD, minimizando o cache miss;d)Utilizando técnicas de PD, minimizando o cache miss, além de tornar a lógica do algoritmo distribuída em 2 Threads; e)Utilizando técnicas de PD, minimizando o cache miss, além de tornar a lógica do algoritmo distribuída em 4 Threads;

-“Maximizar o cache miss” tem o objetivo de tornar mais evidente a ocorrência do mesmo, e prover uma noção de tempo desperdiçado quando o mesmo ocorre. Para minimizar o cache miss foi utilizada o código explicado anteriormente (slide 15). E para tornar a lógica do algoritmo distribuído foi utilizada a abordagem distribuída com threads. Para fins de padronização as matrizes foram preenchidas com 1’s.

Page 22: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Resultados

-Para tais experimentos, foi utilizado um notebook Dell Vostro 3450, Sistema Operacional Windows 7 Professional Service Pack 1 de 64 Bits, 4 GB de memória RAM, processador Intel® Core™ i5-250M de 2.5 GHz.-A cadeia de matrizes escolhida para os experimentos foi a seguinte: <7000,50,30,5000,32,40,5000,80,20,4000,20,10,1000,50>, o que equivale às matrizes

-Pode-se perceber que todas as matrizes da cadeia possuem o número de linhas muito superior ao número de colunas, ou justamente o inverso, pois a ocorrência de cache miss torna-se mais acentuada nesses casos.

Page 23: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Resultados

1.Linguagem de Programação Java:a) Abordagem sequencial, “maximizando o cache miss”;b)Utilizando técnicas de PD, “maximizando o cache miss”;c) Utilizando técnicas de PD, minimizando o cache miss;d)Utilizando técnicas de PD, minimizando o cache miss, além de tornar a lógica do algoritmo distribuída em 2 Threads; e)Utilizando técnicas de PD, minimizando o cache miss, além de tornar a lógica do algoritmo distribuída em 2 Threads;

-Diferença de desempenho da abordagem que usa PD para a sequencial 25.8 s-Pode-se notar que quando é utilizada uma estratégia de minimização de cache miss obteve-se 4.7 segundos de speedup, que representa uma evolução de quase 50%-Ao analisar a estratégia distribuída com threads, pode-se perceber que tanto utilizando 2 como 4 threads, houve perda de desempenho

0

5

10

15

20

25

30

35

4036.7

10.9

6.2 6.6 6.4

1.a1.b1.c1.d1.e

Page 24: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Conclusão

- O objetivo do presente trabalho foi mostrar a importância de dominar técnicas relacionadas a projeto de algoritmos, e também conceitos de arquitetura de computadores para obter melhor desempenho do software e hardware. Ao utilizar a técnica de PD aliada à minimização de cache miss, obteve-se um speedup de 6x em relação ao desempenho da solução mais simples (sequencial). É interessante perceber que todos os algoritmos estão na mesma ordem de complexidade de tempo ( ), e mesmo assim foram obtidos ganhos de desempenho.- Destes resultados, pode-se colher como aprendizado, que ao receber um problema é necessário estudá-lo, visualizá-lo de diferentes perspectivas para adotar a estratégia de solução mais eficiente. Para tal, devem ser analisados os algoritmos pertinentes, ferramentas (APIs, bibliotecas, etc.) e LPs a serem utilizadas, além de conceitos sobre funcionamento de software/hardware, de sistemas operacionais e da arquitetura do computador de uma forma generalizada.

Page 25: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Trabalhos Futuros

Como possibilidades para trabalhos futuros, pode ser considerada a implementação das abordagens já citadas na LP C++, uma vez que geralmente os programas escritos nessa LP tendem a ter melhor desempenho que em Java. Além disso, a abordagem Distribuída com OpenMP parece ser a mais eficiente. O fato de aproveitar o desempenho da LP C++, realizando a distribuição do algoritmo em quantas threads desejar, mantendo a parentização ótima alcançada pela PD, e minimizar a ocorrência de cache miss com a abordagem da matriz transposta, aparenta ser a melhor solução analisada no presente trabalho. Outra tarefa interessante seria implementar os algoritmos para multiplicação de matrizes desenvolvidos por Strassen, que possui complexidade de , ou o desenvolvido por Coppersmith e Winograd com ordem de complexidade , aliando à alguma abordagem de minimização de cache miss para comparação dos resultados [Robinson 2005].

Page 26: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Referências

- Koomey, J. G., Berard, S., Sanchez, M., Wong, H. (2009) “Assessing Trends in the Electrical Efficiency”. Final report to Microsoft Corporation and Intel Corporation.- Schaller, R. R. “Moore's law: past, present and future”. (1997) IEEE Spectrum, Vol 34, pp. 52-59.- Alted, F. “Why Modern CPUs are Starving and what can be done about it”. (2010) Computing in Science & Engineering, pp. 68–71.- Stallings, W. “Arquitetura e Organização de Computadores”. (2010) Editora Prentice Hall, pp. 122-144.- Cormen, T. H., Leiserson, C. E., Rivest, R. L., Stein, C. “Algoritmos: Teoria e Prática”. (2002) Editora Campus, pp. 259-295.- Chandra, R., Dagum, L., Kohr, D., Maydan, D., McDonald, J., Menon, R. “Parallel Programming in OpenMP”. (2001) Editora Morgan Kaufmann.- Robinson, S. “Toward an Optimal Algorithm for Matrix Multiplication”. (2005) Society for Industrial and Applied Mathematics. Vol. 38, Nº 9.

Page 27: II EPI - Estudo e Avaliação do Problema de Otimização da Multiplicação de Cadeias de Matrizes

Obrigado!

Perguntas?