win32 / stdlib détectant seulement la moitié du nombre de cœurs logiques en C / C ++ sous Windows

J’ai un programme mathématique C ++ compilé avec mingw-w64, qui détecte le nombre de cœurs logiques du système pour démarrer le nombre optimal de threads de travail.

Cela fonctionne bien sur toutes les machines que j’ai testées jusqu’à présent, mais un utilisateur signale que seulement 20 threads sont démarrés, alors qu’il dispose d’une machine 2-Xeon avec 10 coeurs hyperthreaded chacun, pour un total de 40 processeurs logiques.

Le gestionnaire de tâches Windows 2012 Server rapporte: 2 sockets, 20 cœurs, 40 processeurs logiques (j’ai la capture d’écran). Le graphique de chargement de plusieurs processeurs a 40 graphiques (j’ai aussi la capture d’écran)

Mais, je détecte toujours seulement 20 processeurs logiques, en utilisant l’une des trois méthodes suivantes:

  • GetSystemInfo() partir de l’API Win32 C
  • std::thread::hardware_concurrency() partir de C ++ 11 stdlib
  • QThread::idealThreadCount() partir de Qt 5.4

Et de toute façon, il est probable que les deux derniers soient implémentés en utilisant le premier.

Comment puis-je détecter correctement le nombre réel de cœurs logiques?

Merci!