OMP 并行区域内英特尔 MKL 函数的线程数

jml*_*ero 2 c multithreading openmp intel-mkl

我有一个 C 多线程代码,使用 OpenMP 和 Intel MKL 函数。我有以下代码:

    omp_set_num_threads(nth);
#pragma omp parallel for private(l,s) schedule(static)
for(l=0;l<lines;l++)
{
    for(s=0;s<samples;s++)
    {
        out[l*samples+s]=mkl_ddot(&bands, &hi[s*bands+l], &inc_one, &hi_[s*bands+l], &inc_one);
    }
}//fin for l
Run Code Online (Sandbox Code Playgroud)

我想在这个 pramga 中使用多核处理器的所有核心(第 n 个值)。但我希望每个核心独立计算一个 mkl_ddot 函数(每个 mkl_ddot 函数 1 个线程)。

我想知道在这种情况下 mkl_ddot 函数使用了多少个线程。我在一些论坛上读到,默认情况下,mkl 在仅使用 1 个核心的 pragma 并行运行中起作用(这就是我想要的)。但我不确定这种行为,也找不到手册中解释这种情况的具体部分。

提前致谢。

Hri*_*iev 6

这是正确的 - 默认情况下,如果 MKL 检测到从并行区域内部调用它,则它会以单个线程运行。我已经在这个答案中解释了改变这种行为的方法。您可以简单地反转布尔参数,以确保 MKL 仅使用单个线程。

然而,如果您只希望 MKL 函数以单线程方式运行,例如您仅在并行区域内使用它,则最好改为链接到顺序 MKL 驱动程序。使用英特尔的编译器,这很容易 - 只需指定-mkl=sequential. 对于其他编译器,您应该查看库的手册,了解如何将程序链接到顺序驱动程序。