OpenMP只使用一个线程

时间:2018-06-01 09:28:52

标签: c++ c gcc openmp

我对openmp有点令人沮丧的问题。当我运行以下代码时,它似乎只在一个线程上运行。

    omp_set_num_threads(8);    
#pragma omp parallel for schedule(dynamic)
    for(size_t i = 0; i < jobs.size(); i++) //jobs is a vector
    {
        std::cout << omp_get_thread_num() << "\t" << omp_get_num_threads() << "\t" << omp_in_parallel() << std::endl;
        jobs[i].run();
    }

这打印......

  

0 1 1

每一行。

我可以看到使用top,openmp正在产生与我有进程任务集一样多的线程。它们在运行时大多闲置。该程序已编译并与-fopenmp标志与gcc链接。我正在使用redhat 6.我也尝试在pragma中使用num_threads(8)参数,这没有任何区别。该程序与另一个也使用openmp的库链接,所以这可能就是问题所在。有谁知道什么可能导致这种行为?在我过去的所有开放经验中,它刚刚起作用。

1 个答案:

答案 0 :(得分:0)

你能打印你的jobs.size()吗?

我做了一个快速测试,确实有效:

#include <stdio.h>
#include <omp.h>
#include <iostream>

int main()
{
    omp_set_num_threads(2);

#pragma omp parallel for ordered schedule(dynamic) 
    for(size_t i = 0; i < 4; i++) //jobs is a vector
    {
#pragma omp ordered
        std::cout << i << "\t" << omp_get_thread_num() << "\t" << omp_get_num_threads() << "\t" << omp_in_parallel() << std::endl;
    }
     return 0;
}

我得到了:

icpc -qopenmp test.cpp&amp;&amp; ./a.out

0 0 2 1
1 1 2 1
2 0 2 1
3 1 2 1