Os Três Estágios da Preparação para Otimização de Software Paralelo

A melhoria de desempenho no software paralelo requer uma abordagem estruturada que faça um bom uso dos recursos de desenvolvimento, obtendo bons resultados rapidamente. Este artigo divide essa abordagem em três estágios distintos:

  • Primeiro Estágio: Estabelecendo uma metodologia de otimização. Melhores práticas ajudam a planejar com antecedência e permanecer dentro do plano.
  • Segundo Estágio: Criando uma carga de trabalho adequada.Uma quantidade consistente de trabalho para o aplicativo realizar antes e depois do ajuste permite medir o progresso.
  • Terceiro Estágio: Construindo o ambiente de teste. Um ambiente de teste adequado emula de forma válida o ambiente de produção dentro de seu processo empírico.

Juntos, esses três estágios ajudam as organizações a otimizar o desenvolvimento de software de forma eficiente, levando-o a tirar proveito de um número crescente de núcleos do processador.

Primeiro Estágio: Estabelecendo uma metodologia de otimização

A coisa mais importante para se ter em mente ao otimizar um aplicativo é criar uma abordagem sistemática e segui-la. Isso significa aderir ao método científico, bem como planejar o que você pretende fazer e, em seguida, por em prática seu plano.

Começando com o pé direito

Alguns preceitos gerais serão valiosos para você desde o início das discussões sobre o processo de planejamento até que você constate que sua aplicação atingiu o objetivo final:

  • Estabelecer metas e uma metodologia coerente para alcançá-las. A otimização é difícil, um trabalho potencialmente custoso. Você precisa saber o que está tentando realizar para avaliar se foi bem-sucedido. Alguns exemplos de metas podem ser: atingir uma determinada utilização do processador em cada núcleo ou melhorar o modelo de threads para habilitar um novo recurso para trabalhar em tempo real durante a execução do software.
  • Identificar o efeito de cada alteração feita ao longo do caminho. Ter uma carga de trabalho adequada (discutida abaixo) permite medir os resultados alcançados conforme o processo evolui, para que você saiba exatamente o que acontece como resultado de cada mudança realizada.
  • Mantenha anotações. Anote toda alteração que você faz no software e as razões de cada uma. As notas que você tomar durante um projeto são o fundamento para uma base de conhecimento (mesmo que seja informal) que pode tornar o seu próximo projeto mais bem-sucedido. Essas notas devem também incluir descobertas, como deficiências na especificação da carga de trabalho e como você as superou.

Identificando os passos

Com estas regras consolidadas e em mãos, é hora de criar uma metodologia coerente que permita decidir que mudanças fazer, aprovar essas mudanças e medir o seu efeito sobre o desempenho do aplicativo. A primeira coisa a entender nesta fase é que este é um processo iterativo e de ciclo fechado, conforme mostrado na Figura 1. Cada sequência de passos (uma iteração em torno do círculo) projeta, implementa e verifica uma mudança (e apenas uma) no código do aplicativo:

  • Coletar dados de desempenho. O primeiro passo de cada iteração é aplicar a carga de trabalho e medir o desempnho usando métricas apropriadas (as cargas de trabalho e as métricas são discutidas mais adiante neste artigo). O Intel® Concurrency Checker, também discutido a seguir, pode ajudar a identificar o comportamento das threads nesta etapa.
  • Analisar os dados e identificar problemas. Em seguida, você deve identificar oportunidades de melhoria, muitas vezes usando ferramentas tais como o Intel® VTune Performance Analyzer para ver onde o tempo está sendo gasto ou o Intel® Thread Profiler para descobrir ineficiências nas threads.
  • Gerar alternativas para resolver um problema. Para cada problema há uma solução e esta etapa identifica o ajuste que irá resolver o problema atual.
  • Implementar a melhoria. Depois de ter decidido o que você pretende mudar e tomar nota no seu registro de projeto, faça as mudanças apropriadas no código.
  • Validar os resultados. Colete dados adicionais, compare-os à base de referência e dedique tempo adequado para entender os resultados, voltando atrás se necessário.


Figura 1. O ciclo fechado de otimização de desempenho

Criar uma metodologia para o seu projeto de ajuste de desempenho requer que você siga esta sequência genérica de etapas para determinar como ela deverá se manifestar para o seu caso específico. Investir tempo adequado para fazê-lo antes de começar a fase de ajuste vai lhe dar uma base sólida que irá prevenir erros mais tarde.

O que não fazer 

Antes de concluirmos esta seção, aqui estão algumas armadilhas a evitar:

  • Não negligencie a grande variedade de sistemas dos usuários finais. As plataformas nas quais você testa seu aplicativo devem representar o ambiente do usuário final. A otimização só para sistemas mais antigos ou com tecnologia de ponta pode ser uma previsão errada do que seus clientes esperam, então prepare-se para o futuro, porém proporcione um desempenho apropriado em máquinas legadas também.
  • Não mude mais de uma coisa de cada vez. Principalmente em otimizações para plataformas paralelas, a relação entre causa e efeito das mudanças que você implementa pode não ser aquela você espera. Se você fizer mais de uma alteração entre as avaliações de resultado, os efeitos de uma podem neutralizar os da outra, ou se os resultados forem negativos, você não saberá qual mudança foi a responsável.
  • Não mexa no hardware. Se possível, dedique um equipamento como o plataforma de testes e não faça quaisquer alterações durante o processo de ajuste. A simples instalação ou atualização de outros softwares podem interferir nos resutados dos testes. Outra opção é usar uma imagem do sistema ou ponto de restauração para garantir que você está testando sempre a mesma configuração de hardware.
Mais informações sobre o primeiro estágio para o desenvolvedor consciente focado em desempenho

The Software Optimization Cookbook, Second Edition é um clássico atualizado, ao qual quatro engenheiros de desempenho da Intel se dedicaram para ajudar a criar uma metodologia de desempenho de sucesso.


Segundo Estágio: Criando uma carga de trabalho adequada

A metodologia de desempenho planejada na seção anterior precisa de mais um ingrediente fundamental para que possa ser colocada em prática: a carga de trabalho. A carga de trabalho, de fato, está no centro do processo de ajuste e escolher a carga de trabalho adequada é vital para o sucesso de seu projeto. Sua finalidade é dar ao aplicativo uma quantidade determinada de trabalho a executar, de modo que os efeitos do ajuste de desempenho possam ser medidos com precisão durante o processo de ajuste.

Cargas de trabalho são, em geral, assuntos internos

Quando se trata de cargas de trabalho, um tamanho definitivamente não serve para todos. Muitas empresas de desenvolvimento de software solicitam que os engenheiros de desempenho da Intel lhes enviem uma carga de trabalho para usar em seu processo de ajuste. Infelizmente, esta não costuma ser a melhor forma de trabalhar, porque cargas de trabalho são muito específicas para o aplicativo. Elas precisam ser bastante específicas para exercitar adequadamente o software em teste (veja as características de uma carga de trabalho eficaz na seção seguinte).

Uma ressalva é que benchmarks padrão do mercado são cargas de trabalho especiais que podem, em alguns casos, ser adequados para uso em uma implementação de ajuste de desempenho. Benchmarks são geralmente desenvolvidos por um consórcio ou por um órgão de governo. Geralmente, eles são construídos de modo a proporcionar resultados reproduzíveis para um uso específico, bastante genérico, como medir o desempenho de um servidor de aplicativos ou banco de dados, para comparar o desempenho entre fornecedores de hardware ou software concorrentes.

Cargas de trabalho podem variar, das muito simples às mais complexas. Por exemplo, uma carga de trabalho para testar o desepenho de um utilitário de compressão de arquivos pode ser simplesmente um conjunto de arquivos gerados com um software de escritório popular. Nesse caso, os arquivos devem incluir diferentes tipos e tamanhos e o número de arquivos deve ser suficiente para fazer com que o tempo de execução seja grande o bastante para revelar claramente as diferenças na execução de testes sucessivos.

Em outros casos, uma carga de trabalho mais complexa pode ser um conjunto de transações a ser aplicado a um sistema de geração relatórios de inteligência de negócios, que pode envolver pesquisa em vários tipos e fontes de dados que deverão ser incluídos nos testes. Como alguns tipos de relatório podem exigir atividades de tratamento de dados, questões associadas com múltiplas fontes de dados, bem como a transmissão via rede, são fatores que devem ser considerados no planejamento da carga de trabalho, bem como na abordagem metodológica correspondente.

Quatro características de cargas de trabalho eficazes

Cargas de trabalho apropriadas devem ter as seguintes características:

  • Mensurável. Deve haver um meio consistente e confiável para medir o desempenho do aplicativo durante a execução da carga de trabalho. A métrica utilizada varia de acordo com o tipo de software em teste, por exemplo, um jogo pode usar quadros por segundo, um aplicativo de e-commerce pode usar transações por segundo e um filtro de rede pode usar pacotes por segundo.
  • Reproduzível. Dadas as mesmas circunstâncias, a carga de trabalho deve produzir aproximadamente os mesmos resultados em todas as execuções. Pequenas variações podem ocorrer devido a efeitos não controláveis como o estado do cache e as tarefas de segundo plano do sistema operacional, mas devem ser pequenas a ponto de não invalidar os resultados do teste. Desativar aplicativos como firewalls e antivírus, bem como aumentar o tamanho da carga de trabalho ou a duração da execução do teste pode ajudar a minimizar os efeitos externos.
  • Estática. As medições associadas a uma carga de trabalho não devem variar com o tempo. Um exemplo em que esta questão pode interferir no processo de testes é quando a carga de trabalho executa I/O de arquivos pesados, ocupando gradualmente o disco de modo que as operações de leitura e gravação de arquivos gradualmente levem mais tempo para ser executadas, diminuindo o desempenho do teste, independentemente de alterações efetuadas como parte da metodologia de ajuste.
  • Representativa. O trabalho que está sendo executado deve ter a mesma natureza da carga colocado sobre o sistema em condições normais de operação. Ele deve exercitar ao máximo possível a base de código, enquanto emula um cenário de utilização normal, em vez de focar, por exemplo, em uma parte específica do aplicativo que a equipe decidiu de antemão ser de interesse.

O que não fazer 

Agora que discutimos as principais características de uma carga de trabalho bem feita, é importante considerar o oposto, para completar esse entendimento. Veja a seguir alguns exemplos de armadilhas comuns em que as empresas de desenvolvimento podem cair:

  • Não escolha uma atividade muito pequena. Se a quantidade de trabalho realizada durante o teste for muito pequena, pode ser difícil notar as mudanças nos resultados dos testes. Por exemplo, se uma carga de trabalho for executada em 10 segundos no teste inicial e 9,5 segundos na próxima etapa, fica difícil detectar esta diferença usando um cronômetro, embora represente uma melhoria de desempenho de cinco por cento. Note que, em alguns casos, este problema pode ser resolvido simplesmente medindo quantas vezes uma carga de trabalho pode ser executada em um determinado período, em vez de quanto tempo leva para executar a carga de trabalho uma vez.
  • Não se concentre em somente em parte dos tipos de dados do mundo real. Se uma carga de trabalho não inclui toda a gama de possibilidades, pode não representar com precisão as mudanças de desempenho mais detectáveis usando outros tipos de dados. Por exemplo, se um aplicativo de inteligência de negócios apresenta um gargalo na importação de um determinado tipo de dado, resolver essa questão exige que aquele tipo de dado seja considerado no projeto da carga de trabalho.
  • Não gaste muito tempo tentando criar a carga de trabalho perfeita. Não há carga de trabalho perfeita para todos os propósitos e o objetivo deve ser criar uma carga que quantifique o desempenho abrangendo boa parte do código e que siga as diretrizes dadas acima. Estabeleça com um cronograma para a criar a carga de trabalho com antecedência e permaneça dentro dos limites de tempo que você definiu.
Mais informações sobre o segundo estágio para o desenvolvedor consciente focado em desempenho

The Server Room Blog-Server Performance Tuning Habit #5: Know Your Workload demonstra, por analogia e exemplo, como criar e tirar o máximo proveito de uma carga de trabalho para ajuste de desempenho.


Terceiro Estágio: Construindo o ambiente de teste

Uma vez criada uma carga de trabalho que atenda aos critérios gerais especificados acima e adaptada às necessidades específicas do aplicativo que está sendo otimizado, é hora de estabelecer o ambiente de teste em que você irá efetivamente realizar o ajuste.

Escolha de hardware e criação de plataforma de teste

Conforme mencionado anteriormente, um equipamento de testes dedicado é ideal para fins de teste, uma vez que esta prática reduz a probabilidade de que mudanças não controladas venham a interferir nos resultados do teste. É também apropriado escolher uma plataforma recente e não um sistema antigo, que pode não estar em uso justamente porque foi substituído por um modelo mais novo. O ajuste de desempenho é uma atividade de alto valor e deve ser considerada como tal, incluindo a compra, se necessária e possível, de um equipaento que emula rigorosamente um sistema típicamente utilizado pelos clientes do produto de software.

Uma vez que o sistema de testes foi escolhido, uma instalação de teste deve ser criada, em muitos casos para simular os usuários ou sistemas externos que interagem com o sistema de teste sob condições equivalentes às do mundo real. A complexidade do projeto da instalação de teste pode ser significativa, dependendo dos requisitos do sistema. É preciso que a instalação de teste seja estável e eficiente o suficiente para não impactar artificialmente os resultados do teste.

Considerando ferramentas e processos de automação de testes

A natureza cíclica do processo de teste sugere que muitas tarefas repetitivas estão envolvidas. De fato existe uma correlação positiva entre o número de iterações e a qualidade do resultado final. Em outras palavras, isso significa que o teste de software pode tornar-se tedioso, com resultados dúbios que podem ser desagradáveis e erros que podem surgir durante o processo. Automatizar procedimentos de teste onde faz mais sentido é uma abordagem útil para melhorar a eficiência e a precisão dos resultados, bem como para fornecer uma maneira inteligente de sair do tédio.

Diversas ferramentas de automação, como AutoIt*, AutoMate* e QuickMacros* podem exercer um papel significativo nesse esforço. Há um grande número delas disponíveis, muitas das quais estão disponíveis gratuitamente. A escolha de ferramentas nesta área deve considerar uma integração total com outros processos e ferramentas já utilizados. Embora essas ferramentas sejam normalmente construídas com essa integração em mente, a utilização de abordagens baseadas em scripts personalizados usando Perl* ou Windows* PowerShell é uma outra opção que pode proporcionar flexibilidade adicional.

Outra opção interessante (e gratuita) para o seu processo é o Intel Concurrency Checker, que ajuda a verificar se as threads do aplicativo estão sendo executadas simultaneamente. Você pode usá-lo para medir o desempenho ao executar o aplicativo antes e depois de fazer melhorias específicas no código e comparar os resultados obtidos. A ferramenta integra os processos de testes automatizados aqui descritos, executados em modo de linha de comando/script ou, alternativamente, a partir de uma interface gráfica. Uma vantagem do Intel Concurrency Checker é que ele pode ser usado mesmo sem ter acesso ao código-fonte do aplicativo, o que o torna útil, por exemplo, para testar a simultaneidade de software proprietário de outra empresa que pode afetar o sistema como um todo.

Endereçando a necessidade de testar configurações do sistema, bem como alterações de código

Note que, não obstante o conselho dado acima que depois de ter estabelecido um ambiente de hardware para teste você não deve alterar inadvertidamente quaisquer componentes de hardware, o ajuste de performance às vezes envolve fazer alterações no sistema intencionalmente, como uma configuração da BIOS ou do servidor. Em tais casos, a alteração feita no sistema de teste é a única mudança a ser feita para a iteração de teste (na ausência de alterações no código). Esta prática ainda atende ao preceito descrito acima de mudar apenas um fator por vez dentro do ambiente de teste.

Mais informações sobre o terceiro estágio para o desenvolvedor consciente focado em desempenho

Entrepreneur Network's Automation Software page conta com uma lista de utilitários que podem ser usados para automatizar tarefas repetitivas, como as envolvidas no ajuste de desempenho.


Conclusão

A compreensão dos requisitos para desenvolver uma metodologia de ajuste de desempenho e o estabelecimento de uma carga de trabalho para tirar proveito dela representam um trabalho árduo e preciso, mas são os fundamentos necessários para melhorar a qualidade do software em um hardware paralelo. Este trabalho prévio ajuda a garantir que seus esforços apresentarão bons resultados, com o objetivo final de fornecer o melhor software possível e alcançar a melhor posição competitiva para o seu produto.
Uma vez que as tarefas descritas neste documento estejam completas, você estará preparado para localizar gargalos em seu código. Transformar esses problemas em oportunidades é o objetivo do ajuste de desempenho.

Compartilhe com a Comunidade

Conte-nos sobre seus esforços reativos ao ajuste de desempenho de suas aplicações paralelas, incluindo aquilo que funcionou e o que não funcionou, e conecte-se com seus colegas do mercado e com profissionais da Intel para ajudar a resolver as questões que ainda estão pendentes (ou ajudar alguém a fazê-lo).
Participe do Fórum: Computação Paralela com Software Intel®

Recursos para estudo complementar

Agora que este artigo “abriu seu apetite” para mais recursos que podem melhorar os resultados do seu processo de ajuste de desempenho, o seguintes sites podem auxiliá-lo a dar os próximos passos:

Pour de plus amples informations sur les optimisations de compilation, consultez notre Avertissement concernant les optimisations.