Vários processadores

Computadores com vários processadores normalmente são projetados para uma das duas arquiteturas: NUMA (acesso à memória não uniforme) ou SMP (multiprocessamento simétrico).

Em um computador NUMA, cada processador está mais próximo de algumas partes da memória do que outras, tornando o acesso à memória mais rápido para algumas partes da memória do que outras partes. No modelo NUMA, o sistema tenta agendar threads em processadores próximos à memória que está sendo usada. Para obter mais informações sobre NUMA, consulte Suporte numa.

Em um computador SMP, dois ou mais processadores ou núcleos idênticos se conectam a uma única memória de main compartilhada. No modelo SMP, qualquer thread pode ser atribuído a qualquer processador. Portanto, agendar threads em um computador SMP é semelhante ao agendamento de threads em um computador com um único processador. No entanto, o agendador tem um pool de processadores, para que ele possa agendar threads para serem executados simultaneamente. O agendamento ainda é determinado pela prioridade do thread, mas pode ser influenciado pela configuração da afinidade de thread e do processador ideal do thread, conforme discutido neste tópico.

Afinidade de thread

A afinidade de thread força um thread a ser executado em um subconjunto específico de processadores. A definição da afinidade de thread geralmente deve ser evitada, pois ela pode interferir na capacidade do agendador de agendar threads efetivamente entre processadores. Isso pode diminuir os ganhos de desempenho produzidos pelo processamento paralelo. Um uso apropriado da afinidade de thread é testar cada processador.

O sistema representa afinidade com uma máscara de bits chamada máscara de afinidade do processador. A máscara de afinidade é o tamanho do número máximo de processadores no sistema, com bits definidos para identificar um subconjunto de processadores. Inicialmente, o sistema determina o subconjunto de processadores na máscara.

Você pode obter a afinidade de thread atual para todos os threads do processo chamando a função GetProcessAffinityMask . Use a função SetProcessAffinityMask para especificar a afinidade de thread para todos os threads do processo. Para definir a afinidade de thread para um único thread, use a função SetThreadAffinityMask . A afinidade de thread deve ser um subconjunto da afinidade do processo.

Em sistemas com mais de 64 processadores, a máscara de afinidade representa inicialmente processadores em um único grupo de processadores. No entanto, a afinidade de thread pode ser definida como um processador em um grupo diferente, o que altera a máscara de afinidade para o processo. Para obter mais informações, consulte Grupos de processadores.

Processador Ideal de Thread

Quando você especifica um processador ideal de thread, o agendador executa o thread no processador especificado quando possível. Use a função SetThreadIdealProcessor para especificar um processador preferencial para um thread. Isso não garante que o processador ideal seja escolhido, mas fornece uma dica útil para o agendador. Em sistemas com mais de 64 processadores, você pode usar a função SetThreadIdealProcessorEx para especificar um processador preferencial em um grupo de processadores específico.

Suporte ao NUMA

Grupos de processadores