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.

Nenhum comentário:

Postar um comentário