在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.
答案 0 :(得分:2)
直接来自: https://software.intel.com/en-us/node/522117
int mkl_get_max_threads (void);
此函数返回英特尔MKL在内部并行区域中使用的OpenMP线程数。此数字取决于是否禁用英特尔MKL对线程数的动态调整(通过环境设置或函数调用):
如果禁用动态调整,该函数将按照列出的顺序检查环境设置并返回下面函数调用的值,直到找到非零值:
- 调用mkl_set_num_threads_local
- 最后一次调用mkl_set_num_threads或mkl_domain_set_num_threads(...,MKL_DOMAIN_ALL)
- 带有MKL_DOMAIN_ALL标记的MKL_DOMAIN_NUM_THREADS环境变量
- MKL_NUM_THREADS环境变量
- 调用omp_set_num_threads
- OMP_NUM_THREADS环境变量
醇>如果启用了动态调整,则该函数将返回系统上的物理内核数。 此函数返回的线程数是一个提示,而英特尔MKL实际上可能使用不同的数字。