• Nenhum resultado encontrado

Os benchmarks desenvolvidos neste trabalho foram usados em outros projetos de pesquisa e também como material de apoio para o ensino.

Prado et al.(2015), por exemplo, fez uso de 8 benchmarks desenvolvidos neste projeto de mestrado para avaliar novas técnicas propostas para extração de informações estruturais a partir de programas concorrentes Java.

A avaliação realizada nesse trabalho verificou aspectos de consistência e desempenho das técnicas propostas. Os aspectos de consistência relacionam-se com a corretude do conjunto resultante das informações estruturais extraídas dos benchmarks. Os aspectos de desempenho, por sua vez, relacionam-se à forma como estas técnicas afetam a instrumentação, a geração do PCFG e a execução do programa instrumentado em termos de tempo de execução e tamanho dos arquivos instrumentados.

Os 8 benchmarks usados foram: 1) Non-blocking Message Passing (NB-MP) - que correspondente ao benchmark Non_Blocking_MP; 2) Greatest Common Divisor (GCD) - que correspondente ao benchmark Parallel_GCD; 3) Producer-Consumer (PC) - que correspondente a uma versão do benchmark Prod_Cons_Lock_Cond que não utiliza a parte do código que é

6.6. Uso dos Benchmarks Desenvolvidos em Outras Pesquisas 81

implementado com locks explícitos e variáveis de condição, mas que faz uso de 100 threads, além da thread main; 4) Master-Slave (MS) - que correspondente ao benchmark Master_Slave; 5) Prime Server (PS) - que correspondente ao benchmark Prime_Server; 6) Multithreaded Token Ring (MT-TR) - que correspondente ao benchmark TR_File; 7) Token Ring (TR) - uma versão do benchmark TR_File no qual foram instanciados 21 processos e 440 threads, além da thread main; 8) Matrix Multiplication (MM) - que correspondente ao benchmark Matrix_Both.

Os resultados obtidos mostraram que a abordagem proposta é eficaz, apresentando um comportamento estável do módulo ValiInst (mesmo para programas com maiores quantidades de processos e threads) com todos os programas podendo ser analisados, instrumentados e o código-fonte representado com sucesso em um PCFG.

Batista(2015) fez uso de 9 benchmarks para avaliar diversos aspectos presentes nos módulos ValiExec e ValiSync da ferramenta ValiPar e também para avaliar a execução paralela de variantes implementada na Darch (Distributed ARCHitecture), uma arquitetura distribuída e multiprocessada que funciona como um middleware entre aplicações que se comunicam via passagem de mensagem na linguagem Java.

Dentre os aspectos considerados pelo autor estão a validação dos algoritmos de execu- ção determinística, o overhead adicionado pela execução determinística quando comparada à execução livre e uma visão do tamanho dos arquivos de rastros gerados relacionando-os com a quantidade de primitivas e de linhas de código presentes nos benchmarks. Outra validação feita foi quanto à eficácia do algoritmo de geração de variantes em aumentar a cobertura das arestas de sincronização, avaliando, também, o custo/benefício das duas políticas de seleção de transmissores, já apresentadas na seção3.5do capítulo3. Por fim, o autor faz um estudo sobre o speedup e a eficiência obtidos com o uso da execução paralela de variantes implementada na Darch quando comparada à geração de variantes feita de modo sequencial na ferramenta ValiPar.

Os 9 benchmarks usados foram: 1) One_to_All; 2) Blocking_MP_PP; 3) Non_Blocking_- MP; 4) All_to_All; 5) SM; 6) PC; 7) Prime_Server; 8) TR_File; 9) Matrix_Both.

De modo resumido, os resultados obtidos pelo autor revelaram que os algoritmos de execução determinística cumpriram os objetivos, reexecutando os rastros obtidos nas execuções livres dos benchmarks. Concluiu-se também que a primeira política de seleção de transmissores gera um menor número de variantes, porém não garante a cobertura de todas as arestas de sincronização, entretanto a segunda política de seleção é mais custosa mas conseguiu cobrir 100% das arestas de sincronização dos benchmarks testados. Finalmente, os resultados obtidos com os experimentos realizados com a execução paralela de variantes revelaram a eficiência dos algoritmos de paralelização em reduzir o tempo da atividade de teste quando comparado à execução de variantes de modo sequencial.

Vilela(2015) faz uso de 15 benchmarks a fim de evidenciar benefícios e limitações de técnicas de geração automática de dados de teste no contexto de programas sequenciais,

aplicadas à programas concorrentes. Em seu trabalho, dentre outros aspectos, pretende-se aferir a dimensão dos conjuntos de teste gerados para satisfazer os critérios selecionados em seu estudo, medir o tempo necessário para geração dos conjuntos de teste e avaliar a qualidade dos conjuntos gerados.

Nesse estudo foram selecionadas ferramentas como a EvoSuite (FRASER; ARCURI,

2011), Randoop (PACHECO; ERNST,2007) e jPET (ALBERT et al.,2011), que implementam técnicas de geração. Atualmente o autor faz uso da ferramenta EvoSuite (que realiza a geração automática dos dados de testes por meio de algoritmos genéticos) para gerar conjuntos de dados de teste que serão utilizados como entradas para os 15 benchmarks selecionados.

Posteriormente, os benchmarks, juntamente com os conjuntos de dados de teste, serão alvo de estudos experimentais na ferramenta ValiPar. Os 15 benchmarks que estão sendo usados são: 1) Parallel_GCD; 2) GCD_Two_Slaves; 3) GCD_LCM; 4) TR_Iterations; 5) TR_Same_- Primitives; 6) TR_Different_Primitives; 7) Sieve_of_Eratosthenes; 8) Roller_Coaster_MP; 9) Prod_Cons_Lock_Cond; 10) Cigarette_Smokers; 11) Matrix; 12) Jacobi; 13) TR_File; 14) TR_Broadcast; 15) GCD_LCM_Both.

Os benchmarks também foram usados para demonstrar a atividade de teste de programas concorrentes para estudantes do curso de Engenharia de Computação na Universidade de São Paulo em São Carlos. O objetivo da aula foi mostrar como ferramentas de teste podem ajudar os testadores na atividade de descoberta de defeitos em programas concorrentes. Esta experiência foi muito positiva e bem recebida pelos estudantes, sendo importante para revelar o potencial do uso de tais benchmarks como um recurso educacional para o ensino tanto da programação concorrente quanto do teste de programas concorrentes.

6.7 Considerações Finais

Neste capítulo foram apresentados os resultados obtidos com os experimentos realizados com os benchmarks livres de defeitos conhecidos e com defeitos inseridos. Primeiramente foi dada uma visão de como os experimentos ocorreram e depois os resultados foram discutidos de forma crítica, dando um enfoque no que os benchmarks conseguiram evidenciar da ferramenta Valipar.

Foi possível perceber que os benchmarks conseguiram gerar uma demanda controlada e qualificada sobre o modelo, os critérios e sobre a ferramenta. Os benchmarks sem defeitos conhecidos possibilitaram evidenciar a eficiência do modelo implementado pela ferramenta ValiPar que foi capaz de representar diversos tipos de primitivas de programas concorrentes de passagem de mensagem e memória compartilhada utilizados nos benchmarks.

Os experimentos também permitiram mostrar a capacidade da ferramenta em realizar a execução não determinística, determinística e geração de variantes para uma gama de programas,

6.7. Considerações Finais 83

exceto para alguns casos evidenciados ao decorrer do capítulo. Além disso, os experimentos com os benchmarks sem defeitos inseridos demostraram uma limitação quanto à escalabilidade da ferramenta com relação à geração de variantes que, a depender da política utilizada, pode ser bastante custosa.

Os benchmarks com defeitos inseridos permitiram perceber a capacidade da ferramenta em revelar os defeitos de modo geral, e mais especificamente a eficácia do critério all-sync-edges em revelar os defeitos e a eficiência do suporte da geração de variantes para revelar defeitos que necessitam exercitar uma certa sincronização entre os processos.

Finalmente evidenciou-se o uso dos benchmarks desenvolvidos neste projeto em outras pesquisas em andamento no ICMC/USP.

85

CAPÍTULO

7

CONCLUSÕES E CONTRIBUIÇÕES