Вы находитесь на странице: 1из 14

ncias Matema ticas e de Computac o Instituto de Cie a o Paulo (USP) Universidade de Sa o Carlos SP Brasil Sa

o Concorrente Programac a SSC-0143

Busca por Pal ndromos em Textos Grandes Utilizando OpenMP e MPI

Grupo 10 Jos e Eduardo de Melo Colabardini, 6792670 dudu@grad.icmc.usp.br Vitor Muniz Carvalho, 67923031 vtrmc@grad.icmc.usp.br

2012

Sum ario
1 Descri c ao do problema 1.1 Pal ndromos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Tabela ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Crivo de Erat ostenes . . . . . . . . . . . . . . . . . . . . . . . 2 OpenMP 3 MPI 4 Decomposi c ao 4.1 Decomposi ca o entre as m aquinas . . . . . . . . . . . . . . . . 4.2 Decomposi ca o entre os processadores . . . . . . . . . . . . . . 3 3 3 3 4 4 5 5 6

5 Implementa c ao 9 5.1 Divis ao do arquivo . . . . . . . . . . . . . . . . . . . . . . . . 9 5.2 Divis ao das tarefas . . . . . . . . . . . . . . . . . . . . . . . . 9 5.3 Sa da . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 6 Testes 7 Conclus ao Refer encias 10 13 13

Descri c ao do problema

O objetivo desse trabalho e desenvolver um programa paralelo para realizar as seguintes tarefas: Texto maior: Encontrar ocorr encias de pal ndromos por palavras e vericar se a soma dos n umeros correspondentes ao mapeamento do c odigo ASCII de cada caracter do pal ndromo e um n umero primo; Texto menor: Encontrar ocorr encias de pal ndromos por palavras e por frases. Para o c alculo de n umeros primos, deve ser utilizado o Crivo de Erat ostenes.

1.1

Pal ndromos

Uma palavra ou frase e pal ndroma se ela pode ser lida da mesma forma em qualquer uma das duas dire c oes, do come co ao m ou do m ao come co. As pontua co es e espa camentos s ao desconsiderados. Alguns exemplos de palavras pal ndromas: ovo, arara, salas, reviver, socos e radar. Alguns exemplos de frases pal ndromas: Socorram-me, subi no onibus em Marrocos, A torre da derrota e Anotaram a data da maratona.

1.2

Tabela ASCII

A tabela ASCII e uma tabela de codicamento de caracter baseada no alfabeto ingl es. C odigos ASCII representam texto em computadores, equipamentos de comunica ca o e outro aparelhos que usam texto. Assim, cada caracter e representado por um n umero que varia de 0 at e 255. Por exemplo, o caracter a e representado pelo n umero 97, equanto o caracter - pelo n umero 45.

1.3

Crivo de Erat ostenes

O Crivo de Erat ostenes e um algoritmo simples e antigo para encontrar n umeros primos at e um certo limite. Ele o faz marcando como n ao primos os n umeros m ultiplos dos n umeros primos. No come co do algoritmo, todos os n umero at e o limite N s ao marcados como primos. Depois, ele come ca marcando os m ultiplos de 2 como n ao primos at e chegar ao N . Na pr oxima itera c ao, ele encontra o n umero maior que 2 que n ao foi marcado, que ser a o 3, marcando seus m ultiplos como n ao primos at e chegar ao N . As itera co es se repetem at e marcar os m ultiplos de todos o n umeros menores ou iguais a N .

Figura 1: Logo do OpenMP.

OpenMP

OpenMP (Open Multi-Processing) e uma API multi-plataforma que suporta programa c ao paralela nas linguagens de programa ca o C/C++ e For tran em todas as arquiteturas, incluindo as do Unix e do Windows NT. E um modelo port avel e escal avel que permite a programadores uma interface simples e ex vel para desenvolvimento de aplica c oes paralelas em mem oria compartilhada. OpenMP e uma implementa ca o de multithreading, um m etodo de paraleliza ca o aonde a thread mestre cria um n umero espec co de threads escravas para dividir uma tarefa entre eles. As threads s ao executadas concorrentemente, com o ambiente de execu ca o alocandos as threads nos processadores. Um bloco de c odigo que deve ser executado paralelamente e marcada com uma diretiva do pr e-processador (#pragma omp parallel) que criar a threads antes do bloco ser executado. Cada thread recebe um identicador que pode e um ser obtido atrav es da fun ca o omp get thread num(). Esse identicador n umero inteiro e o mestre possui o identicador 0. Depois da execu c ao do bloco paralelo, as threads se juntam na thread mestre, a qual continua a execu ca o at e o m do programa. Por padr ao, cada thread executa o bloco de c odigo paralelizado independentemente. O ambiente de execu c ao aloca as threads aos processadores dependendo do uso, na capacidade da m aquina e outros fatores. Tanto o paralelismo por tarefas quanto o paralelismo por dados podem ser alcan cados usando OpenMP.

MPI

Figura 2: Logo do OpenMPI. MPI (Message Passing Interface) e um protocolo de comunica ca o independente de linguagens usado para programar em computadores paralelos, suportado cujas metas s ao alta performance, escalabilide e portabilidade. E 4

tanto comunica ca o ponto-a-ponto quanto coletiva. Ele se tornou um padr ao para comunica ca o entre processos que modelam um programa paralelo sendo executado em um sistema de mem oria distribu da. V arias implementa co es consistem em um conjunto espec co de rotinas que s ao diretamente chamadas por um programa C/C++, Fortran e at e linguagens como Java ou Python. Uma das implementa c oes mais utilizadas e o OpenMPI. O OpenMPI oferece, al em das rotinas de passagem de mensagens, um programa espec co que permite a execu ca o do software em v arios computadores, podendo denir em quais ser ao executados. Para cada computador que est a executando o programa, e atribu do um rank, que pode ser obtido pela fun c ao MPI Comm rank. Al em disso, e poss vel saber a quantidade de computadores que est ao executando o programa pela fun ca o MPI Comm size. Para que a comunica c ao entre os n os de cluster seja realizada, e preciso que se utilize ou dena um m etodo de comunica c ao compat vel com o de sua aplica ca o. As rotinas de comunica ca o do OpenMPI podem se comportar de duas maneiras: bloqueantes ou n ao-bloqueantes. Assim, ao se realizar a comunica ca o, o desenvolvedor deve escolher entre quatros modos, que utilizam estrat egias mistas de bloqueio e n ao bloqueio para a passagem de mensagens: standard, synchronous, ready e buered. Para o envio de uma mensagem de um n o a outro s ao utilizados as fun co es MPI Send para envio e MPI Recv para recebimento. Al em dessas fun co es, h a outras para comunica c ao coletiva, auxiliando o desenvolvimento deste tipo de aplica c ao, tais como: MPI Reduce, MPI Barrier, MPI Bcast, MPI Gather, MPI Allgather e MPI Scatter.

4
4.1

Decomposi c ao
Decomposi c ao entre as m aquinas

Como o programa ser a executado em um cluster, podemos executar o programa em diversas m aquinas, dividindo a carga em cada uma delas. Por em, como a mem oria e distribu da, a comunica ca o entre as m aquinas e um fator custoso e tem um peso maior na queda de desempenho. O ideal seria fazer uma decomposi ca o de forma que as tarefas executadas em cada m aquina seja o mais independente poss vel das demais, diminuindo a comunica ca o entre elas. Sendo assim, optamos por fazer uma decomposi c ao de dados, aonde cada m aquina ca respons avel por uma fatia do arquivo. Como o sistema de arquivos e NFS, todo n o escravo ter a tamb em acesso ao arquivo assim como o n o mestre. A divis ao e uniformemente entre as m aquinas, de forma que uma n ao que mais sobrecarregada que a outra. Existe a possibilidade de uma fatia dividir uma palavra ou frase no meio, logo deve ser utilizado alguma heur stica para tratar essas diculdades utilizando a menor comunica ca o poss vel. Adiante ser a dito como isso foi resolvido. 5

Cada m aquina procurar a por pal ndromos em apenas uma fatia do arquivo, inclusive o n o mestre. A gura 3 ilustra a divis ao do arquivo, que ser a processado por partes por cada m aquina.

Figura 3: Decomposi c ao de dados utilizada.

4.2

Decomposi c ao entre os processadores

A tarefa que cada m aquina executa e procurar por palavras e/ou frases pal ndromos em uma fatia do arquivo. Tamb em dever a vericar se a soma ASCII de cada palavra pal ndroma e um primo, no caso do texto maior. A leitura em disco e uma opera ca o muito custosa e tem um peso grande na an alise da decomposi ca o a ser escolhida. Uma leitura no arquivo feita em blocos de tamanho xo e mais eciente do que uma leitura caracter a caracter. Poderia ser utilizado uma decomposi c ao de dados e dividir a fatia do arquivo em fatias menores e deixa a cargo de cada processador da m aquina, mas isto faria com que os seeks feitos no disco sejam aleat orios. Seria mais interessante deixar apenas um processador ler do disco enquanto outros fazem o processamento sobre os dados obtidos. Desta maneira, podemos dividir o problema em 4 tarefas menores: Ler blocos de caracteres do arquivo; Dividir os blocos em palavras e/ou frases; Procurar por pal ndromos nas palavras e/ou frases; Procurar por soma ASCII prima nos pal ndromos. Vale lembrar que cada uma da tarefa depende da tarefa anterior. Com isso, podemos montar o grafo de depend encia ilustrado pela gura 4. Podemos ver que a tarefa de leitura no disco da itera ca o 2 n ao depende da leitura na itera c ao 1. Como dito anteriormente, poder amos dividir o arquivo 6

Figura 4: Grafo de depend encia das tarefas. em v arias fatias e process a-las paralelamente nos processadores. Por em, como o disco e um regi ao cr tica, ou seja, s ao feitos v arios acessos simult aneos em um u nico recurso, essa decomposi c ao n ao e interessante. Outro fato que deve ser observado e que as verica co es de n umeros primos s o e feita se a palavra for pal ndroma. Seguindo essa ideia, poderia ser feita uma decomposi c ao especulativa, que consiste em vericar se a palavra e prima antes mesmo de saber se ela e pal ndroma. Desta forma, teremos o grafo de depend encia ilustrado pela gura 5.

Figura 5: Grafo de depend encia utilizando uma decomposi ca o especulativa. Como podemos observar, essa decomposi c ao adianta o c alculo de n umeros primos em uma itera ca o. Para um n umero muito grande de itera co es, essa itera ca o a menos ser a irrelevante. Al em disso, a porcentagem de uma palavra aleat oria ser um pal ndromo e muito baixa e, portanto, ser a feita mais computa ca o desperdi cada do que u til. Portanto, essa decomposi c ao n ao e t ao vantajosa. A op ca o que nos pareceu mais interessante foi realizar a decomposi ca o de controle. Facilmente podemos ver que podemos modelar de forma bem intuitiva esse problema em um pipelining. S ao criadas quatro sess oes, cada uma respons avel por uma tarefa. Aquelas tarefas que dependem de valores ainda n ao calculados s ao atrasadas em uma itera ca o. A partir da 4o itera ca o, teremos o pipelining cheio e com m aximo desempenho. Para esse tipo de decomposi c ao alcan car o maior n vel de paralelismo, e 7

desej avel que as tarefas executadas em cada se ca o levem a mesma quantidade de tempo para executar. Ent ao, para procurar o melhor desempenho do pipelining, foi executado o programa sequencialmente para a entrada wikipedia.txt e contado os tempos de cada tarefa. V arias aferi c oes foram feitas para ter uma informa ca o con avel. A imagem 6 mostram os resultados obtidos.

Figura 6: Gr aco em barras ilustrando o tempo de execu c ao m edio de cada tarefa por itera c ao. O tempo de cada itera ca o torna-se o tempo da execu c ao da se ca o mais lenta. Supondo que n ao e poss vel subdividir as tarefas, o tempo de cada itera ca o ser a, no m nimo, dado pelo tempo de parseamento. Sendo assim, ao inv es de utilizar quatro se c oes, poder amos utilizar apenas duas se c oes, uma para o parseamento e outra para cuidar das outras tarefas. Neste caso, teremos o grafo de depend encia ilustrado pela gura 7.

Figura 7: Grafo de depend encia utilizando uma decomposi c ao de controle otimizada. Na 1a itera ca o, apenas a leitura do disco e feita, j a que as outras tarefas o dependem dela. Na 2 itera ca o, o parseamento da primeira leitura j a pode o ser realizado. Na 3 itera ca o em diante, a leitura do disco e a verica ca o de pal ndromos e primos s ao executados sequencialmente. Desta forma, conseguimos obter o maior desempenho poss vel com o menor n umeros de se c oes necess arias. Isso tamb em diminui o overhead causado pela cria ca o de threads e torna o programa mais eciente em m aquinas com menor n umero de processadores. 8

5
5.1

Implementa c ao
Divis ao do arquivo

Para executar o mesmo programa em diversas m aquinas, foi utilizado a biblioteca MPI. Desta forma podemos realizar a decomposi ca o do arquivo entre os n os do cluster. E poss vel obter o rank da m aquina corrente, que chamaremos de rank , pela fun c ao MPI Comm rank e a quantidade de m aquinas executando o programa, que chamaremos de tasks, pela fun c ao MPI Comm size. Sendo que o arquivo tem uma quantidade length de bytes, a divis ao length aquina. Ent ao, cada m aquina ca mais justa seria tasks bytes para cada m length length respons avel pelos bytes de rank tasks at e (rank + 1) tasks 1, sendo que o rank inicial e 0. Como a divis ao nem sempre e exata, os bytes restantes ser ao lidos pela m aquina de rank mais alto. Como dito anteriormente, existe a possibilidade de uma fatia do arquivo incorporar uma frase ou palavra incompleta. Para tratar isso, utilizamos a heur stica de que a m aquina i sempre ignorar a a primeira palavra e/ou frase, sendo que esta ser a capturada pela m aquina i 1. Essa regra vale para todas as m aquinas, exceto para a primeira, que dever a pegar a primeira palavra e/ou frase. Desta forma, n ao ser a necess ario comunica ca o entre as m aquinas, evitando perdas de desempenho.

5.2

Divis ao das tarefas

Para poder dividir as tarefas que dever ao ser executados entre os processadores foi utilizado a biblioteca OpenMP. Para criar as se co es denidas pela decomposi ca o de controle citada acima, foi adicionado a diretiva #pragma omp parallel sections num threads(2), limitando o n umero de threads a ser criada por dois, o necess ario. O c odigo de cada se ca o e denido pela diretiva #pragma omp section. Ao nal das se co es, o sections cria uma barreira impl cita para sincronismo. Foram feitos v arios testes sobre o tamanho do bloco que dever a ser lido para cada itera ca o. Como o disco l e, no m nimo, um registro de 512 bytes, seria interessante utilizar blocos de tamanho m ultiplo de 512. Aquele que produziu melhores resultados foi 4096 bytes, ou seja, 8 registros. Para dividir as palavras dentro de um bloco de caracteres, foi considerado que qualquer caracter que n ao seja alfanum erico e um separador. Para frases, somente os caracteres ., !, ?, \n, \r e \t s ao considerados como separadores. Na verica ca o de pal ndromos e tamb em na soma ASCII das palavras e frases, foram considerados apenas n umeros e letras. Ou seja, se houver algum espa co ou caracter de pontua c ao em uma frase, ela ser a ignorada ao vericar por pal ndromo e na soma. No caso do texto maior, para cada palavra pal ndroma encontrada, e vericado se a soma ASCII desta palavra e um n umero primo. Para evitar rec alculos desnecess arios, uma vez descobertos todos os primos at e um 9

n umero m aximo max, n ao ser a necess ario executar o Crivo de Erat ostenes novamente para n umeros inferiores a max. Quando for necess ario descobrir se um n umero maior que max e primo, o vetor que armazena os valores e expandido e o Crivo e executado at e esse novo n umero m aximo. Para evitar que o vetor seja realocado com frequ encia, ele ser a sempre expandido em m ultiplos de 5000. Desta forma, melhoramos ainda mais o desempenho.

5.3

Sa da

Como sa da do programa, temos para cada caso: Texto maior: Todas as palavras pal ndromas e a indica c ao de quais delas s ao primas ou n ao, em ordem de ocorr encia; Texto menor: Todas as palavras e frases pal ndromas, em ordem de ocorr encia. Para isso, cada n o escravo envia seus resultados obtidos para o n o mestre, e esse ser a respons avel por exibi-los na tela na ordem correta. A fun ca o MPI Send foi utilizada para o envio dos pal ndromos para o n o mestre. O n o mestre utiliza a fun ca o MPI Recv para receb e-los. Sendo assim, o modo de comunica c ao utilizado foi standard, que se sobressaiu nos testes envolvendo tamb em os modos synchronous e ready. Al em disso, para ambos os casos, e exibido o tempo somado de cada uma das quantro tarefas (leitura do disco, parseamento e verica ca o de pal ndromos e de primos). Vale refor car que esse tempo e somado, podendo ser maior do que o tempo de execu c ao de fato, j a que o programa e execu tado paralelamente nos n os. E exibido tamb em a quantidade de palavras pal ndromas encontradas, quantas delas s ao primas e a quantidade de frases pal ndromas encontradas. Para isso, foi utilizado a fun ca o MPI Reduce com a opera ca o MPI SUM, que realiza a soma das vari aveis de tempo de todos os n os, colocando a resposta em uma outra vari avel no n o mestre.

Testes

Foram realizados testes utilizando dois arquivos, Wikipedia (texto maior) e Shakespeare (texto menor). Para realizar compara c oes entre diversos modos de execu c ao do algoritmo e observar o aumento de performance, foram criados quatro vers oes do programa, uma apenas sequencial, uma utilizando apenas OpenMP (threads ), uma utilizando apenas OpenMPI (um processo em cada n o escravo) e outra utilizando ambos OpenMP e OpenMPI. Para o gr aco da gura 8, foram realizadas dez aferi co es de tempo de execu ca o para os casos sequencial e OpenMP. J a para os das guras 9 e 10 utilizando OpenMPI, e utilizando tanto OpenMPI e OpenMP, foram realizados cinco aferi co es para cada quantidade de n os do cluster utilizados. Os 10

valores utilizados para o gr aco foi a mediana dos dados obtidos, ou seja, o centro da distribui ca o dos dados. Ela foi escolhida porque os tempos de execu ca o no cluster podem variar consideravelmente devido a in umeros fatores como: n umero de processos em execu c ao, porcentagem de CPU utilizada, velocidade de comunica c ao entre os n os, entre outros. Assim, podemos desconsiderar os tempos de execu c ao que s ao muito maiores ou muito menores do que as restantes (outliers).

Figura 8: Tempo total de execu c ao para as vers oes sequencial e OpenMP nos dois textos. Analisando as vers oes sequencias e OpenMP, podemos ver, pelo gr aco da gura 8, que ambas as vers oes sequenciais tanto para o caso do texto maior e do menor se mostraram mais ecientes do que utilizando OpenMP. Isso provalvemente se deve ao fato da concorr encia de acesso ao disco r gido e ao overhead causado pela cria c ao de threads. Tamb em foi comparado as vers oes OpenMPI e OpenMP-OpenMPI juntas para o texto maior, variando a quantidade de n os executando o programa. O gr aco da gura 9 ilustra os resultados obtidos.

Figura 9: Tempo total de execu ca o para as vers oes OpenMPI e OpenMPOpenMPI no texto maior. Observamos que a vers ao OpenMPI tem um desempenho melhor para um menor n umero de n os. No entanto, percebemos que ambas convergem para 11

um mesmo tempo de execu ca o com o aumento do n umero de n os no cluster. O fato de que a vers ao utilizando OpenMP ter menor eci encia com poucos n os provavelmente se deve ao mesmo fato analisado anteriormente no caso sequencial. O melhor tempo de execu ca o ocorreu com a vers ao OpenMP-OpenMPI, utilizando 12 n os, com o tempo de 1155,9 milisegundos. Neste caso, o speed5727,5 up em rela c ao ` a vers ao sequencial foi de 1155 = 4, 95. ,9 Analisando o texto menor com as mesmas vers oes e variando o n umero de n os, foi obtido os resultados ilustrados pela gura 10.

Figura 10: Tempo total de execu c ao para as vers oes OpenMPI e OpenMPOpenMPI no texto menor. Neste caso, podemos observar, que a partir da utiliza c ao de tr es n os do cluster, os gr acos basicamente se sobrep oem, obtendo a mesma eci encia at e a utiliza ca o de dez n os, provavelmente quando a utiliza ca o de apenas OpenMPI se torna desvantajosa e OpenMP se torna atrativo. O melhor tempo de execu ca o ocorreu com a vers ao OpenMP-OpenMPI, utilizando 13 n os, com o tempo de 313,152 milisegundos. Neste caso, o 770,874 speed-up em rela c ao ` a vers ao sequencial foi de 313 = 2, 46. ,152 Abaixo temos mais detalhadamente os tempos de execu c ao de cada m odulo dos programas (em milisegundos), utilizando-se cinco aferi c oes e uso da mediana: Wikip edia: Modo Sequencial OpenMP OpenMPI (12 n os) Shakespeare: 12 Pal ndromo 1810.28 7914.62 1555.55 N umeros primos Total 28.807 5727.5 64.759 13049.4 79.629 1164.98

Modo Sequencial OpenMP OpenMPI (10 n os)

Pal ndromo 217.636 417.279 175.751

N umeros primos Total 0.465 770.874 0.582 803.183 0.489 313.639

OpenMP - OpenMPI: Arquivo Shakespeare (13 n os) Wikip edia (12 n os) Pal ndromo 455.21 3657.17 N umeros primos Total 0.562 309.404 67.839 1155.9

Onde para a obten ca o do tempo do pal ndromo e n umeros primos e realizado a fun c ao reduce, ou seja, s ao somados os tempos de processamento de cada n o escravo (se houver), e total e o tempo para naliza c ao do programa no n o mestre.

Conclus ao

A modelagem do problema utilizando decomposi ca o de dados e de controle se mostrou vi avel e vantajosa para a divis ao dos trabalhos entre os n os do cluster e os processadores de uma mesma m aquina (threads). Foi obtido um speed-up razo avel para o texto menor (2,46) e um excelente para o texto maior (4,95). Al em disso, a resolu c ao de problemas computacionalmente dif ceis e hoje de extrema import ancia para ci encias como a F sica, Qu mica e Biologia e para empreendimentos comerciais relacionados a temas t ao variados quanto a prospec ca o de petr oleo, simula co es mercadol ogicas, sistema nanceiro, bolsa de valores, ind ustria de cinema, v deo e televis ao. Assim, o conhecimento adquirido em OpenMP para manipula c ao de threads e de OpenMPI para aplica co es distribu das e extremamente importante para o desenvolvimento de aplica co es cr ticas ou que necessitam de um grande desempenho computacional.

Refer encias
[1] ASCII Table. http://asciitable.com. Acesso em: maio/2012. [2] OpenMPI.org. http://open-mpi.org. Acesso em: maio/2012. [3] OpenMP.org. http://openmp.org. Acesso em: maio/2012. [4] Ananth Grama, Anshul Gupta, George Karypis, Vipin Kumar. Introduction to Parallel Computing. Addison Wesley, 2nd Ed, 2003. [5] L. Mattson, T.; Meadows. A Hands-on Introduction to OpenMP.

13

Вам также может понравиться