Mostrando postagens com marcador programação. Mostrar todas as postagens
Mostrando postagens com marcador programação. Mostrar todas as postagens

domingo, 20 de julho de 2014

Tutorial: Limitar uso de CPU do paralelismo

Introdução
Paralelismo utiliza os núcleos livres de uma CPU para executar rotinas com maior desempenho. Isso pode ser um problema quando o computador que executa o código é compartilhado e existem outros processos e sistemas rodando que não podem parar.

Nota: para mais informações sobre como o paralelismo funciona, visite o outro artigo do blog: Análise: Programação Paralela

Solução
A solução para este problema não é deixar de criar rotinas paralelas, mas sim limitá-las para não usarem 100% de CPU e permitir que o código seja executado com maior desempenho, mas sempre mantendo o processador com uma folga para a execução de outros processos e sistemas.
Para isso, faremos o uso do ParallelOptions.MaxDegreeOfParallelism.

Exemplo
Utilizaremos um simples loop for em paralelo de 1 até 1.000.000 para analisar o comportamento da CPU.
Na chamada do método Parallel.For, podemos passar por parâmetro um objeto do tipo ParallelOptions, onde defimimos o valor da propriedade MaxDegreeOfParallelism para a quantidade de núcleos da CPU que serão usados no loop.

        static void Main(string[] args)
        {
            Console.Title = "Parallel";

            ParallelOptions options = new ParallelOptions();
            options.MaxDegreeOfParallelism = 3;

            Parallel.For(0, 1000000, options, i =>
            {
                Console.Write(i.ToString() + "; ");
            });

            Console.ReadLine();

        }

Definindo o parâmetro MaxDegreeOfParallelism como 3, significa que, serão feitas até 3 atividades em paralelo simultâneamente.
Em outras palavras, em um computador com 4 núcleos, só serão usados 3 núcleos e o uso de CPU ficaria por volta de 75%.
Segue abaixo algumas imagens que representam o uso de CPU, conforme o valor da propriedade MaxDegreeOfParallelism.

MaxDegreeOfParalelism = 1

MaxDegreeOfParalelism = 2

MaxDegreeOfParalelism = 3

MaxDegreeOfParalelism = 10

Notas finais
Se o valor da propriedade MaxDegreeOfParallelism for um número maior que a quantidade de núcleos da CPU, o processo executará normalmente, usando todos os núcleos disponíveis da CPU. Se o valor da propriedade for -1, serão usados todos os núcleos, se o valor for zero ou um número menor que -1, será lançada uma exception.

Conclusão
Utilizar paralelismo para executar rotinas com maior desempenho realmente pode ser muito viável, mas adicionar limite na execução de um código em paralelo também é um assunto que precisa ser discutido para manter o sistema executando sempre com folga, sem ficar com picos de 100% de uso de CPU, o que pode afetar outros sistemas e processos que estejam em execução no mesmo computador.

quinta-feira, 17 de julho de 2014

Conceito: Programação Paralela

Resumo
Programação paralela (também paralelismo ou computação paralela), é quando uma tarefa é executada em mais de um núcleo do processador, para aumentar o desempenho e diminuir o tempo de execução.

Introdução
Os computadores pessoais atualmente possuem geralmente processadores com dois ou quatro núcleos de CPUs, isso faz com que o processador possa executar mais processos "ao mesmo tempo", levando o fato de que em vez de executar comandos em sequência, podemos executar vários comandos em CPUs diferentes, de forma "simultânea".

Os termos "ao mesmo tempo" e "simultânea" estão entre aspas porque para a programação ser executada ao mesmo, por teoria, é necessário dois ou mais processadores, mas o que ocorre com programação paralela é que cada núcleo executa uma tarefa, o que dá a impressão de as tarefas estarem sendo executadas simultaneamente no mesmo processador.

Até então, para programar uma rotina que executasse dois ou mais códigos em paralelo, era necessário programação em baixo nível, mas com o Microsoft Framework 4 em diante, programação paralela se tornou algo simplificado ao desenvolvedor.

Vantagens:
  • Pode ser usado para aumento de desempenho em rotinas importantes.
  • Divisão de trabalho: dois núcleos trabalhando são mais rápidos do que um só.
  • O desempenho é diretamente proporcional ao número de processadores e núcleos do computador.
Desvantagens:
  • Em geral, é difícil programar e debugar o código.
  • Se usado desnecessariamente, pode causar uso de excessivo de CPU, podendo até travar o sistema ou o computador.
  • Não haverá diferença no desempenho no caso de processadores com apenas um núcleo.
  • A execução não é ordenada, ou seja, os métodos chamados em paralelo poderão ser executados em qualquer ordem.

Conclusão
Os benefícios da programação paralela realmente valem a pena para rotinas de grande importância e que precisam ser executadas no menor tempo possível. Porém sempre deve-se ter cautela em usar esse tipo de programação para não comprometer a integridade e estabilidade do sistema ou computador.


Mais informações em:
http://msdn.microsoft.com/pt-br/library/vstudio/ms171868(v=vs.100).aspx#parallel_computing
http://msdn.microsoft.com/pt-br/library/vstudio/dd460693(v=vs.100).aspx

Para ver uma análise feita sobre programação paralela e programação comum, não deixe de visitar o outro artigo do blog: Análise: Programação Paralela