Lyn*_*ite 5 multithreading blas intel-mkl
在 OpenBLAS 中,如果您调用openblas_set_num_threads请求的线程数高于您拥有的 CPU 线程数,那么它将被设置为使用的实际线程数就是您的 CPU 线程数。
这可以在源代码中看到
我想知道 MKL 是否有相同的行为?该文档没有明确提及。但他们确实说:
指定的数字是一个提示,英特尔® MKL 实际上可能使用较小的数字。
MKL 行为是不同的,事实上,您可以拥有比内核更多的线程。
\n\n@Kristoffer 在他的答案中没有看到这一点的原因是因为默认启用动态调整:
\n\n\n\n\n默认情况下,Intel\xc2\xae MKL 可以动态调整指定的线程数。[...] 如果禁用线程数的动态调整,Intel\xc2\xae MKL 会尝试在内部并行区域中使用指定的\n 线程数(有关详细信息,请参阅\n Intel\xc2\ xae MKL 开发人员指南)。使用 mkl_set_dynamic 函数来控制线程数量的动态调整。
\n
因此,如果我们mkl_set_dynamic(0)关闭动态调整,我们将看到以下内容:
>>> set_max_threads(44)\n>>> get_max_threads() \n6\n>>> mkl_set_dynamic(0)\n>>> get_max_threads()\n44\nRun Code Online (Sandbox Code Playgroud)\n\n所以我们看到,如果没有动态调整,MKL 可以使用 44 个线程。情况是否确实如此是另一个问题,请帮助mkl_get_dynamic解释(即使这些信息对我来说似乎有点过时,因为get_max_threads已经在 中考虑到了get_max_threads):
\n\n\n假设该
\nmkl_get_max_threads函数返回的线程数等于 N。[...]如果禁用动态调整,英特尔\xc2\xae MKL 会为\n 内部并行区域请求恰好 N 个线程([...] )。但是,OpenMP* 运行时库可能配置为提供比英特尔\xc2\xae MKL 请求更少的线程,具体取决于动态调整的 OpenMP* 设置。
OpenMP 的方法在 Algorithm 2.1 OpenMP-5.0 规范中给出(我并不假装理解)。
\n\n在我的机器上,重要的值是omp_get_thread_limit()=2147483647和 omp_get_dynamic()=0,因此禁用MKL_DYNAMIC最大线程数并将最大线程数设置得更高,我确实可以看到由于更多开销而导致性能下降。
| 归档时间: |
|
| 查看次数: |
281 次 |
| 最近记录: |