在OpenBLAS中,如果调用openblas_set_num_threads
要求的线程数大于您拥有的CPU线程数,那么它将被设置为使用的实际线程数就是您的CPU线程数。
可以在source code中看到
我想知道MKL是否具有相同的行为?docs没有明确提及。但他们确实说:
指定的数字只是一个提示,英特尔®MKL实际上可能使用较小的数字。
@ Kristoffer之所以没有在答案中看到此原因,是因为动态调整为enabled per default:
默认情况下,英特尔®MKL可以调整指定的线程数动态地。 [...]如果动态调整线程数禁用,英特尔®MKL尝试使用指定数量的内部并行区域中的线程(有关更多信息,请参阅英特尔®MKL开发人员指南)。使用mkl_set_dynamic函数来控制线程数的动态调整。
因此,如果我们使用mkl_set_dynamic(0)
关闭动态调整,则会看到以下内容:
>>> set_max_threads(44)
>>> get_max_threads()
6
>>> mkl_set_dynamic(0)
>>> get_max_threads()
44
所以我们看到,如果不进行动态调整,MKL可能会使用44个线程。mkl_get_dynamic
的帮助解释了这个问题是否真的是另外一个问题(即使由于mkl_get_dynamic
已经考虑到get_max_threads
的原因,对于我来说信息似乎有些过时了):假设OpenMP的方法在算法2.1get_max_threads
函数返回线程数等于N。[...]如果是动态的调整被禁用,英特尔®MKL要求精确的N个线程内部平行区域([...])。但是,那OpenMP *运行时库可以配置为提供更少线程超过英特尔®MKL的请求,具体取决于动态的OpenMP *设置调整。
mkl_get_max_threads
中给出(我不假装理解)。在我的机器上,重要的值是OpenMP-5.0 specification和
omp_get_thread_limit()=2147483647
,因此禁用omp_get_dynamic()=0
并将其最大线程数设置为更高,由于更多的开销,我确实可以看到性能下降。
MKL_DYNAMIC