`mkl_set_num_threads` 会限制 CPU 线程的数量吗?

Lyn*_*ite 5 multithreading blas intel-mkl

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

这可以在源代码中看到

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

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

ead*_*ead 1

MKL 行为是不同的,事实上,您可以拥有比内核更多的线程。

\n\n

@Kristoffer 在他的答案中没有看到这一点的原因是因为默认启用动态调整:

\n\n
\n

默认情况下,Intel\xc2\xae MKL 可以动态调整指定的线程数。[...] 如果禁用线程数的动态调整,Intel\xc2\xae MKL 会尝试在内部并行区域中使用指定的\n 线程数(有关详细信息,请参阅\n Intel\xc2\ xae MKL 开发人员指南)。使用 mkl_set_dynamic 函数来控制线程数量的动态调整。

\n
\n\n

因此,如果我们mkl_set_dynamic(0)关闭动态调整,我们将看到以下内容:

\n\n
>>> set_max_threads(44)\n>>> get_max_threads()  \n6\n>>> mkl_set_dynamic(0)\n>>> get_max_threads()\n44\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我们看到,如果没有动态调整,MKL 可以使用 44 个线程。情况是否确实如此是另一个问题,请帮助mkl_get_dynamic解释(即使这些信息对我来说似乎有点过时,因为get_max_threads已经在 中考虑到了get_max_threads):

\n\n
\n

假设该mkl_get_max_threads函数返回的线程数等于 N。[...]如果禁用动态调整,英特尔\xc2\xae MKL 会为\n 内部并行区域请求恰好 N 个线程([...] )。但是,OpenMP* 运行时库可能配置为提供比英特尔\xc2\xae MKL 请求更少的线程,具体取决于动态调整的 OpenMP* 设置。

\n
\n\n

OpenMP 的方法在 Algorithm 2.1 OpenMP-5.0 规范中给出(我并不假装理解)。

\n\n

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

\n