【问题标题】:Number of threads of Intel MKL functions inside OMP parallel regionsOMP 并行区域内英特尔 MKL 函数的线程数
【发布时间】:2014-02-04 18:32:23
【问题描述】:

我有一个 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 中使用多核处理器的所有内核(nth 的值)。 但我希望每个内核独立计算一个 mkl_ddot 函数(每个 mkl_ddot 函数 1 个线程)。

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

提前致谢。

【问题讨论】:

    标签: c multithreading intel-mkl openmp


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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 函数将使用多个线程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多