2015-10-27 1 views
2

Dans conda,mkl_set_num_threads() est plafonné par les cœurs physiques?

dans un PC I ont CPU i7 4790 qui est 4 noyaux 8 fils. Chaque fois que j'utilise mkl.set_num_threads(n) où le n > 4, il est mis à 4 lorsque je le vérifie plus tard à partir de mkl.get_max_threads(). Cela a du sens car mkl ne bénéficie pas de Hyper Thread.

Dans un autre pc I ont E5 2643 qui est également 4 noyaux 8 fils. Cependant, cette fois, il est possible de définir le nombre de threads à 8. Pourquoi est-ce?

Dans les deux machines, si I mkl.set_num_threads(2), mkl.get_max_threads() renvoie 2 comme prévu.

Répondre

2

droite à partir de:https://software.intel.com/en-us/node/522117

int mkl_get_max_threads (void); 

Cette fonction retourne le nombre de threads OpenMP pour Intel MKL à utiliser dans des zones parallèles internes. Ce nombre varie selon que le réglage dynamique du nombre de threads par Intel MKL est désactivé (par un paramètre d'environnement ou un appel de fonction):

Si le réglage dynamique est désactivé, la fonction vérifie les paramètres d'environnement et renvoie les valeurs de la fonction ci-dessous appelle dans l'ordre où ils sont énumérés jusqu'à ce qu'il trouve une valeur non nulle:

  1. un appel à mkl_set_num_threads_local
  2. le dernier des appels à mkl_set_num_threads ou mkl_domain_set_num_threads (..., MKL_DOMAIN_ALL)
  3. le MKL_DOMAIN_NUM_THREADS variable d'environnement avec l'étiquette MKL_DOMAIN_ALL
  4. La variable d'environnement MKL_NUM_THREADS
  5. Un appel à omp_set_num_threads
  6. Le OMP_NUM_THREADS variable d'environnement

Si le réglage dynamique est activée, la fonction retourne le nombre de cœurs physiques sur votre système . Le nombre de threads renvoyés par cette fonction est un indice, et Intel MKL peut en fait utiliser un nombre différent.

+0

Impliquez-vous que j'ai un ajustement dynamique activé sur i7 mais pas sur E5? Mais pourquoi puis-je définir des threads inférieurs au nombre de cœurs physiques dans ce cas? – colinfang

+0

@colinfang Oui, je le pense. Vous pouvez toujours définir des threads inférieurs au nombre de cœurs physiques, en définissant un nombre supérieur à celui du nombre de cœurs physiques ne semble pas fonctionner. – CrakC