我在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
我想在这个pramga中使用多核处理器的所有内核(第n个值)。 但我希望每个核心独立计算一个mkl_ddot函数(每个mkl_ddot函数1个线程)。
我想知道在这种情况下mkl_ddot函数使用了多少个线程。我在一些论坛中读到,默认情况下mkl函数在pragma并行运行中仅使用1个核心(这就是我想要的)。 但我不确定这种行为,我无法在手册中找到解释这种情况的具体部分。
提前致谢。
答案 0 :(得分:3)
这是正确的 - 默认情况下,如果MKL检测到它是从并行区域内调用的,则它会运行单个线程。我在this answer中解释了改变这种行为的方法。你可以简单地在那里反转布尔参数,以确保MKL只使用一个线程。
然而,如果您只希望MKL函数以单线程运行,例如你只能从并行区域内部使用它,你最好用连续的MKL驱动程序链接。使用英特尔的编译器很容易 - 只需指定-mkl=sequential
即可。对于其他编译器,您应该查看库的手册,了解如何将程序与顺序驱动程序链接。
答案 1 :(得分:1)
Intel MKL Library使用OPENMP线程软件进行多线程处理。创建的线程数将基于环境变量“OMP_NUM_THREADS
”。 OMP_NUM_THREADS
的默认值取决于Intel MKL version and OPENMP libraries。
但在你的情况下,你正在做一个嵌套的并行性。但默认情况下,嵌套并行性已关闭。因此,mkl_ddot函数使用的线程数将为1(这意味着在mkl_ddot函数级别没有并行性)。
您可以通过调用omp_set_nested(1)
来启用嵌套并行性。通过这种方式,在您的情况下,将启用嵌套并行性,并且mkl_ddot函数将使用多个线程。