Pergunta

Ao iniciar um thread ou processo em .NET ou Java, existe uma maneira de escolher em qual processador ou núcleo ele será iniciado?Como funciona o modelo de memória compartilhada nesses casos?

Foi útil?

Solução

Se você estiver usando vários threads, o sistema operacional cuidará automaticamente do uso de vários núcleos.

Outras dicas

existe uma maneira de escolher em qual processador ou núcleo ele será lançado?

Você pode usar o gerenciador de tarefas para informar ao Windows em quais CPUs seu programa deve ser executado.Normalmente, isso só é útil para solucionar problemas de programas legados que quebraram implementações de multithreading.Para fazer isso,

  • Execute o gerenciador de tarefas
  • Encontre seu processo no Processes janela.
  • Clique com o botão direito e escolha Set Affinity...
  • Marque as caixas de seleção ao lado da CPU nas quais você deseja permitir a execução do seu aplicativo.O Windows agendará apenas threads desse processo para essas CPUs específicas

Se bem me lembro, o Windows irá 'lembrar' dessas configurações nas próximas vezes em que seu processo for executado, mas por favor, não me cite sobre isso - execute alguns testes você mesmo :-)

Você também pode fazer isso programaticamente no .NET depois que seu programa for iniciado usando o método System.Diagnostics.Process.ProcessorAffinity propriedade, mas não acho que ele 'lembrará' das configurações, então sempre haverá um curto período em que seu aplicativo será executado em qualquer janela da CPU que achar adequada.Não sei como fazer isso em java, desculpe.

Observação:

Isto se aplica a todo o nível do processo.Se você definir a afinidade apenas para CPU0 e, em seguida, iniciar 50 threads, todos os 50 threads serão executados na CPU0 e CPU1, 2, 3, etc., ficarão parados sem fazer nada.

Apenas para reiterar o ponto, isso é útil principalmente para solucionar problemas de software legado quebrado.Se o seu software não estiver quebrado, você realmente não deve mexer em nenhuma dessas configurações e deixar o Windows decidir a(s) melhor(es) CPU(s) para executar o seu programa, para que ele possa levar em consideração o restante do desempenho do sistema.


Quanto ao modelo de 'memória compartilhada', ele funciona da mesma forma, mas há mais coisas que podem dar errado sutilmente quando seu aplicativo está sendo executado em várias CPUs, em vez de apenas intervalos de tempo em uma única.

Para um exemplo revelador, leia este artigo ridículo sobre CPUs e barreiras de memória.

Destina-se ao desenvolvimento do OSX no PowerPC, mas é geral o suficiente para ser aplicado em todos os lugares.IMHO, é um dos dez principais artigos do tipo 'todos os desenvolvedores deveriam ler isto' que li.

O sistema operacional cuida do multithreading quando a máquina virtual está usando threads nativos (em oposição aos threads verdes) e você não pode especificar detalhes de baixo nível, como escolher um processador para um determinado thread.É melhor assim porque você geralmente tem muito mais threads do que processadores disponíveis, então o sistema operacional precisa fazer uma divisão de tempo para dar a todos os threads a chance de serem executados.

Dito isto, você pode definir prioridades de threads se tiver uma tarefa crítica, e uma API de threading geralmente oferece essa possibilidade.Veja a API Java, por exemplo: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setPriority(int)

PS:há algo quebrado no mecanismo de análise ...Eu tive que adicionar o link acima como texto simples

Eu daria uma olhada nas extensões paralelas do framework .NET.Ainda está em CTP, no entanto, deveria fazer o melhor uso dos processadores multi-core.O lugar mais fácil para começar a usar o .NET é na página blog de equipes paralelas.

Quanto ao Java, não tenho ideia.

Eu usei isso em alguns programas porque meu núcleo 0 estava meio bagunçado.

// Programmatically set process affinity
var process = System.Diagnostics.Process.GetCurrentProcess();

// Set Core 0
process.ProcessorAffinity = new IntPtr(0x0001);

ou

// Set Core 1
process.ProcessorAffinity = new IntPtr(0x0002);

Mais sobre isso em "Propriedade Process.ProcessorAffinity".

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