我对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的库链接,所以这可能就是问题所在。有谁知道什么可能导致这种行为?在我过去的所有开放经验中,它刚刚起作用。
答案 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