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