`mkl_set_num_threads`是否会超出CPU线程数的上限?

问题描述 投票:5回答:2

在OpenBLAS中,如果调用openblas_set_num_threads要求的线程数大于您拥有的CPU线程数,那么它将被设置为使用的实际线程数就是您的CPU线程数。

可以在source code中看到

我想知道MKL是否具有相同的行为?docs没有明确提及。但他们确实说:

指定的数字只是一个提示,英特尔®MKL实际上可能使用较小的数字。

multithreading blas intel-mkl
2个回答
1
投票
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的原因,对于我来说信息似乎有些过时了):

假设get_max_threads函数返回线程数等于N。[...]如果是动态的调整被禁用,英特尔®MKL要求精确的N个线程内部平行区域([...])。但是,那OpenMP *运行时库可以配置为提供

更少线程超过英特尔®MKL的请求,具体取决于动态的OpenMP *设置调整。

OpenMP的方法在算法2.1 mkl_get_max_threads中给出(我不假装理解)。

在我的机器上,重要的值是OpenMP-5.0 specificationomp_get_thread_limit()=2147483647,因此禁用omp_get_dynamic()=0并将其最大线程数设置为更高,由于更多的开销,我确实可以看到性能下降。


4
投票
似乎限制了核心数量(而不是线程数量)。下面的代码在6核Intel Core i7上运行:

MKL_DYNAMIC

© www.soinside.com 2019 - 2024. All rights reserved.