Navegação : Página Inicial : Imprensa (546) : Boletins (85)
2011/06 - Edição 48 - Preparando-se para a Otimização Paralela
Leia aqui a 48a edição do boletim "Assespro em Destaque"
Preparando-se para a Otimização Paralela
Computadores multi-core tornaram-se uma tendência dominante, compondo 83% das vendas de PCs em 2010. E o número de núcleos está aumentando, com 68% das vendas projetadas sendo de quatro ou mais núcleos em 2012. Neste ambiente, otimizar os aplicativos para a tecnologia multi-core está se tornando, cada vez mais, uma exigência. Esta otimização pode resultar em grandes melhorias de desempenho, mas é preciso um plano de ação que esteja bem adaptado ao aplicativo. Aqui estão algumas dicas para ajudar neste processo:
Redesenho ou Ajuste
A primeira escolha a fazer é se você vai começar do, zero com um desenho paralelo que utilize o paralelismo, ou ajustá-lo conforme um código existente. Se você já tem um aplicativo em série que está funcionando corretamente, você pode usá-lo como ponto de partida e procurar maneiras de introduzir o paralelismo.
Antes de fazer alterações no código existente, não se esqueça de medir o desempenho do seu software atual para estabelecer um padrão. Então, ao fazer as alterações, repita a medição para que você possa dizer se as alterações estão, na verdade, resultando em um melhor desempenho.
A forma de medir o desempenho do aplicativo vai depender do que seu aplicativo está projetado para fazer. Para ser capaz de repetir as medições de desempenho, comece por identificar a carga de trabalho que vai medir. A carga de trabalho é uma tarefa ou um conjunto de tarefas que identifica para que o aplicativo realize. O objetivo é definir uma carga de trabalho repetitiva, e, na sequência, fazer a medição, enquanto a carga de trabalho é executada. Depois de saber a quantidade de trabalho realizado durante um determinado período de tempo, pode-se repetir a carga mais tarde e verificar se o aplicativo está realizando mais trabalho no mesmo período de tempo, ou então realizar a mesma quantidade de trabalho em um curto período de tempo. Isto dará uma medida direta das melhorias de desempenho com o ajuste do aplicativo. Também é possível medir o progresso usando ferramentas que medem os níveis de simultaneidade do aplicativo.
Trabalhar com funções ou dados
Se começar com um aplicativo existente, a estrutura do aplicativo determinará se vai empregar a decomposição funcional ou a decomposição de dados (ou ambos): Caso o aplicativo tenha funções ou tarefas que são independentes umas das outras, elas podem ser executadas em paralelo. Se o aplicativo tiver funções que operam sobre grandes quantidades de dados e se for possível quebrar os dados em unidades menores que podem ser processadas de forma independente, então você pode utilizar a decomposição de dados.
A natureza do aplicativo também irá determinar a granularidade de paralelismo ideal. Granularidade refere-se à frequência com que as tarefas que compõem o aplicativo precisam se comunicar entre si. Quanto menos frequência de comunicação necessária, mais paralelismo de granulação grossa pode ser usado e o aplicativo pode se beneficiar do paralelismo, que exigirá menos sobrecarga de comunicação.
É importante identificar onde estão os maiores problemas antes de começar a fazer mudanças. Ferramentas para identificar hotspots ou pontos de estrangulamento em seu código irão guiá-lo a aplicar seus esforços para as áreas que podem render mais melhorias. Hotspots são locais onde o processador gasta muito tempo, assim eles podem ser bons targets para a otimização, se o código é ineficiente. No entanto, pode ser que um hotspot já seja eficiente, e o motivo pelo qual o processador gasta muito tempo está relacionado com uma grande carga de trabalho estar sendo realizada. Um hotspot é um gargalo quando o tempo de processamento é alto, devido à ineficiência. Se você determinar que um gargalo é paralelizável, esse é um local ideal para aplicar o esforço de otimização.
Escolha uma metodologia
Depois de saber quais são as áreas do código que precisam de melhoria, há diferentes opções para continuar com a otimização paralela. De acordo com uma pesquisa recente, multi-threading, o modelo de memória compartilhada e a passagem de mensagens são as mais populares técnicas de programação paralela empregadas pelos desenvolvedores.
O Multi-threading provoca múltiplos threads (tarefas a serem realizadas por uma CPU) que existem dentro de um único processo, compartilhando memória e outros recursos, resultando em uma operação mais rápida em sistemas multi-core. Uma desvantagem do multi-threading é que ele introduz o não determinismo: você pode não ser capaz de prever a ordem em que a transformação ocorre, o que poderia levar a erros. O de memória compartilhada [Shared memory model], em que um único espaço de memória, é usado por vários processadores, oferece um espaço de endereço unificado que pode ser simples de trabalhar, mas requer cuidados para evitar condições de disputa, quando há dependência entre os eventos. A passagem de mensagens [Message passing] envolve comunicação entre processos e pode exigir mais trabalho para implementar, mas evita condições de disputa por meio de sincronização.
Medir o progresso e verificar os erros
Cada vez que incorporar mais paralelismo no aplicativo, é recomendável medir novamente o trabalho para verificar se está progredindo no sentido de melhorar o desempenho do aplicativo. Também é importante neste momento ter a certeza de que não foram introduzidos quaisquer defeitos empregando ferramentas que podem ajudá-lo a verificar os erros de threading. Depois de determinar que a sua mais recente etapa de otimização paralela foi um sucesso, você poderá iterar o processo para buscar ainda mais paralelismo e melhorar o desempenho, ou parar quando tiver alcançado seus objetivos.
Para mais informações sobre a programação paralela e ferramentas para medir a simultaneidade de seus aplicativos, acesse http://software.intel.com/parallel
Diana Byrne é Gerente de Produto Multi-core do Grupo de Software e Serviços da Intel, onde trabalha desde 2004. Ela possui mestrados em Matemática, Ciências da Computação e Gestão da Tecnologia.
Para visualizar o 48º Boletim clique aqui
