Eu não sou especialista neste assunto, mas vou concordar com a minha opinião.
It's pretty clear we're going to have to develop NUMA node affinity, but for now I'm trying to understand the problem. What can cause one style of NUMA machine to allow applications to use both nodes transparently, and what's causing this behaviour now?
Eu sei que o Windows calcula uma "Distância do Nó", estimando a quantidade de tempo que leva para vários nós NUMA se comunicarem entre si. Não sei se sua latência ou largura de banda se baseia (ou talvez ambos), mas é importante saber.
Máquinas modernas, como o Skylake-Server, podem ter "SubNuma Clustering", onde diferentes partes do mesmo chip são reportadas como diferentes nós NUMA. No entanto, a diferença entre os nós dentro do mesmo chip é ~ 10 nanossegundos. Enquanto um soquete diferente pode ter ~ 200 nanossegundos.
Ex: Dois Xeon Golds (20 núcleos por CPU) com clustering sub-NUMA seriam parecidos com os nós 4x NUMA no Windows. Nós 2-NUMA por chip, representando os 10 núcleos "esquerdos" e os 10 núcleos "certos" em cada metade do chip. 3x controladores de memória à esquerda, 3x controladores de memória à direita. Mas todos os 20 núcleos podem falar com o controlador de memória em aproximadamente 80 nanossegundos. Eles podem apenas falar com o controlador de memória "mais próximo" em 70 nanossegundos. Uma diferença quase imperceptível, portanto, o Windows provavelmente prefere flutuar os threads nesses dois nós NUMA.
Minha suposição é que, sob as configurações padrão da sua configuração, o Windows decidiu que uma "Distância do Nó" era curta o suficiente para flutuar os encadeamentos, enquanto a outra configurava as distâncias da memória o suficiente para que as configurações padrão do Windows prefere manter os threads dentro de um nó NUMA.
Essa não é minha única teoria. Minha segunda teoria é que algo estranho está acontecendo com "Grupos de Processadores". Grupos de processadores são uma invasão de compatibilidade da API Win32, porque as máscaras de afinidade de CPU foram limitadas a 64 bits por motivos de desempenho. Portanto, os núcleos lógicos de 64 são o padrão máximo do Windows.
Você pode acessar mais de 64 núcleos lógicos por meio da API do grupo de processadores. link
Resumindo: se seus processos estiverem em "Grupos de processadores" separados, você será um programador para alterar o programa para suportar grupos de processadores.
Eu não fiz muitos testes com esse material pessoalmente. Mas espero que isso seja uma informação útil para você.