Paralelizando o problema da Mochila binária com OpenMP
Revisão do algoritmo Knapsack
O problema da mochila é um dos mais populares problemas de otimização combinatória.Seu nome vem do problema enfrentado por alguém que estálimitado pelo tamanho de uma mochila e deve carregar a mochila com os objetos mais úteis ou valiosos.
O objetivo do algoritmo é conseguir a otimização do carregamento da mochila com um conjunto de itens, nesse caso livros, maximizando o valor total e minimizando o peso total dos itens que estão sendo carregados.
No problema da Mochila, temosNitens, de1a N. Cada itemiten um valorvie um pesowi. Todos os valores e os pesos são positivos e inteiros. O peso máximo que podemos levar na bolsa eW. Afinalidade é carregar a mochila com um conjunto de itens de forma que o seu peso total não exceda a capacidadeWe seu valor total seja o maior possível.
Formalmente definida:
Suponhamos queW = 15,N= 6, e temos o seguinte conjunto de objetos:
A solução ótima seria escolher os itens: 1, 2, 5 e 6. O valor total de esta solução e de 330 e o peso de 15.
O problema knapsack pode ser resolvido por vários métodos entre eles estão o algoritmo deenumeração exaustiva, ométodo guloso e atraves dafunção recursiva.
Neste trabalho analisamos o código do programa seqüencialknapsack.tar.gz. Observamos que o programa tem três opções para geração de pesos e valores dos objetos (neste caso livros): podem ser gerados de forma aleatória, de forma estática ou atraves de um arquivo. Optamos pela forma estatica, de modo que os valores vam se repetindo a cada execução, ou seja os sorteio dos livros com seus valores e pesos são sempre os mesmo, o que nos permite melhor a valiar o desempenho entre os diferentes formas de paralelizar
O pacote alem de conter o programaknap.c; traz um timer para a medição dos tempos de execução;knap_defaults.hque contem os valores por default dos números de objetos, a capacidade da mochila, e as cotas dos pesos e dos valores dos objetos e outros arquivos que não nos interessam (knap.upc, knap.pbseknap.ll). Os valores por padrão foram alterados conforme o codigo abaixo para todas as execuções
O timer.ccontem funções que permitem a visualização dos tempos de execução em pontos do programa. Neste caso oknap.cas funçõessolve()ebacktrack().Permitindo a visualização da parte mais critica do programa que é a funçãosolve()que corresponde a maior fatia do tempo de execução.
Durante a execução do programa a funçãosolve()leva em media9.295762 segundos de processamento, e a a funçãobacktrack()leva em media0.006205 segundos, no programa original seqüencial.
Depois de ter refletido sobre o algoritmo se chegou à conclusão de que a opção mais razoável é paralelizar a função solve().
A função solve()possui três for's, sendo os dois ultimos aninhados , inicialmente tentamos paralelizar os três porem, problemas de sincronização e autalizações perdidas resultaram em falhas de segmentação, o que nos obrigou a testar as diretivas #pragma omp critica e #pragma omp
Logo varias tentativas de paralelização do algoritmo deduzimos que a o particionamento deve-se fazer com o cuidado de não irrumpir a comunicação entre os processos. Já que nas primeiras tentativas de paralelização os resultados foram alterados com relação a execução em seqüencial.
Propostas de paralelização
Para paralelizar o algoritmo de knapsack utilizamos o particionamento de dados. Adicionando a o programa as diretivas OpenMP parallel e for.
Neste primeiro programa paralelizamos todas as estruturas for, e o rendimento obtido foi abaixo do sequencial, o tempo desempenho na execução desta versão paralelizada foi maior em relação a versão sequencial. Na segunda proposta de paralelização, unicamente particionamos o primeiro for. Assim como na primeira tentativa o tempo de desempenho em vez de melhorar aumentou.
A seguinte alternativa de paralelização do algoritmo de knapsack foi a mais efetiva nos tempos de desempenho. Com este codigo o tempo de execução foi reduzido a quase a metade em relação a execução em sequencial, mantendoa precisãodos resultados.
Análise de desempenho e resultados
A maquina utilizada para os testes de execução linux03. Os resultados da execução paralela com 100000 objetos e capacidade máxima de 5000:
Fator de aceleração (speedup)
Eficiência
Conclusões
Após aanálise do funcionamento do algoritmo doprogramaseqüencialprocedemos na buscade umaalternativa válida para aparalelizaçãodoproblema da mochila binária. Encontramosquea solução propostanão éa ideal paran processadores,pois ao analisar ospeedupdescobrimos que esta longe dospeedup linear como podemos observar no gráfico.Assim como era esperadoao acrescentarmais threadsnas execuções,o tempo de processamentofoiaumentando.Mesmo assimacreditamos queo programa fruto deste trabalhoé umaboa alternativapara aparalelizaçãodoproblema da mochilabinária, devido a que com um númerodedoisthreads o tempo de execução doprograma paralelocaiu pela metadeem comparação com oprograma sequencial.
Nenhum comentário:
Postar um comentário