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

C OMP并行区域内英特尔MKL函数的线程数,c,multithreading,intel-mkl,openmp,C,Multithreading,Intel Mkl,Openmp,我有一个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

我有一个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
omp\u set\u num\u线程(第n个);
#专用(l,s)计划的pragma omp并行(静态)
对于(l=0;l使用OPENMP线程软件进行多线程处理。创建的线程数将基于环境变量“
OMP_NUM_threads
”。OMP_threads
的默认值取决于

但在您的情况下,您正在执行嵌套并行。但默认情况下,嵌套并行是关闭的。因此,mkl_ddot函数使用的线程数将是一个(这意味着在mkl_ddot函数级别没有并行)

您可以通过调用
omp\u set\u nested(1)
来启用嵌套并行。这样,在您的情况下,嵌套并行将被启用,mkl\u ddot函数将使用多个线程。

使用OPENMP线程软件进行多线程处理。创建的线程数将基于环境变量“
OMP_NUM_THREADS
”。
OMP_NUM_THREADS
的默认值取决于

但在您的情况下,您正在执行嵌套并行。但默认情况下,嵌套并行是关闭的。因此,mkl_ddot函数使用的线程数将是一个(这意味着在mkl_ddot函数级别没有并行)


您可以通过调用
omp\u set\u nested(1)来启用嵌套并行性
。这样,在您的情况下,嵌套并行将被启用,mkl_ddot函数将使用多个线程。

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


但是,如果您只希望MKL函数以单线程方式运行,例如,您只能在并行区域内使用它,则最好使用顺序MKL驱动程序。使用英特尔编译器,这很容易-只需指定
-MKL=sequential
。对于其他编译器,您应该查阅库手册,了解如何再次链接程序nst顺序驱动程序。

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

但是,如果您只希望MKL函数以单线程方式运行,例如,您只能在并行区域内使用它,则最好使用顺序MKL驱动程序。使用英特尔编译器,这很容易-只需指定
-MKL=sequential
。对于其他编译器,您应该查阅库手册,了解如何再次链接程序nst顺序驱动程序