Pergunta

Eu escrevi um programa C que lê um conjunto de dados de um arquivo e, em seguida, aplica um algoritmo de mineração de dados para encontrar os clusters e classes nos dados. No momento eu estou tentando reescrever este programa sequencial de vários segmentos com PThreads e eu sou novato a uma programação paralela e eu tenho uma pergunta sobre o número de threads de trabalho que lutaram minha mente:

O que é a melhor prática para encontrar o número de segmentos de trabalho quando você faz a programação paralela e como você determinar isso? Você tenta número diferente de tópicos e ver seus resultados, então, determinar ou existe um procedimento para descobrir o número ideal de threads. É claro que eu estou investigando esta questão do ponto de vista do desempenho.

Foi útil?

Solução

Há um par de questões aqui.

  1. Como Alex diz, o número de tópicos que você pode usar é específico do aplicativo. Mas também existem restrições que vêm do tipo de problema que você está tentando resolver. Seus tópicos precisam se comunicar uns com os outros, ou pode todos eles trabalham de forma isolada em partes individuais do problema? Se eles precisam trocar dados, em seguida, haverá um número máximo de threads além do qual a comunicação inter-thread vão dominar, e você não verá ainda mais a velocidade-up (na verdade, o código vai ficar mais lento!). Se eles não precisam trocar dados, em seguida, tópicos igual ao número de processadores provavelmente será próxima do ideal.

  2. dinamicamente ajustando o pool de segmentos para a arquitetura subjacente para a velocidade em tempo de execução não é uma tarefa fácil! Você precisaria de um monte de código adicional a criação do perfil de tempo de execução de suas funções. Veja por exemplo a maneira FFTW trabalhos em paralelo. Este é certamente possível, mas é bastante avançado, e vai ser difícil se você é novo para programação paralela. Se em vez do número de núcleos estimativa é suficiente, em seguida, tentando determinar esse número a partir do OS em tempo de execução e desova seus segmentos conformidade será um trabalho muito mais fácil.

Para responder à sua pergunta sobre a técnica: A maioria dos códigos paralelos grandes executados em supercomputadores com uma arquitetura conhecida e levar um longo tempo para ser executado. O melhor número de processadores não é apenas uma função do número, mas também da topologia de comunicação (como os processadores estão ligados). Eles, portanto, beneficiar de uma fase de testes onde a melhor número de processadores é determinada medindo o tempo necessário em pequenas problemas. Isso normalmente é feito à mão. Se possível, perfilando deve ser sempre preferida para adivinhar com base em considerações teóricas.

Outras dicas

Você basicamente quer ter como muitos segmentos pronto para executar como você tem núcleos disponíveis, ou no máximo 1 ou 2 mais para garantir que nenhum núcleo que está disponível para que você nunca vai ser deixado ocioso. O truque está em estimar quantos threads normalmente será bloqueado à espera de outra coisa (principalmente I / O), uma vez que é totalmente dependente de sua aplicação e até mesmo em entidades externas além de seu controle (bancos de dados, outros serviços distribuídos, etc, etc) .

No final, uma vez que você tiver determinado sobre quantos threads deve ser o ideal, executando benchmarks para tamanhos de pool de segmentos em torno de seu valor estimado, como você sugere, é uma boa prática (pelo menos, ele permite que você verifique o seu suposições), especialmente se, como parece, você precisa fazer para obter a última gota de desempenho do seu sistema!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top