mkl_set_num_threads()受物理内核的限制?

时间:2015-10-27 12:04:53

标签: python multithreading intel-mkl conda

conda

在一台电脑中我有 CPU i7 4790 ,它是 4核8线程。每当我在mkl.set_num_threads(n)使用n > 4时,我会在mkl.get_max_threads()稍后检查时将其设置为4。这是有道理的,因为mkl不会受益于Hyper Thread。

在另一台电脑中我有 E5 2643 ,它也是 4核8线程。但是这次可以将线程数设置为8.为什么会这样?

在这两台机器中,如果我mkl.set_num_threads(2),则mkl.get_max_threads()会按预期返回2.

1 个答案:

答案 0 :(得分:2)

直接来自: https://software.intel.com/en-us/node/522117

int mkl_get_max_threads (void);
  

此函数返回英特尔MKL在内部并行区域中使用的OpenMP线程数。此数字取决于是否禁用英特尔MKL对线程数的动态调整(通过环境设置或函数调用):

     

如果禁用动态调整,该函数将按照列出的顺序检查环境设置并返回下面函数调用的值,直到找到非零值:

     
      
  1. 调用mkl_set_num_threads_local
  2.   
  3. 最后一次调用mkl_set_num_threads或mkl_domain_set_num_threads(...,MKL_DOMAIN_ALL)
  4.   
  5. 带有MKL_DOMAIN_ALL标记的MKL_DOMAIN_NUM_THREADS环境变量
  6.   
  7. MKL_NUM_THREADS环境变量
  8.   
  9. 调用omp_set_num_threads
  10.   
  11. OMP_NUM_THREADS环境变量
  12.         

    如果启用了动态调整,则该函数将返回系统上的物理内核数。   此函数返回的线程数是一个提示,而英特尔MKL实际上可能使用不同的数字。