c++ - 为什么使用给定一个线程的 OpenMP schedule(dynamic) 并行化循环中的所有迭代? (MSVS 2010)

标签 c++ visual-studio-2010 scheduling openmp

直接问题:我有一个简单的循环,它可能是一个计算密集型函数。我们假设每次迭代花费相同的时间(因此负载平衡应该很容易)。

#pragma omp parallel
{

#pragma omp for schedule(dynamic)
for ( int i=0; i < 30; i++ )
{
     MyExpensiveFunction();
}

}  // parallel block

为什么所有迭代都分配给一个线程?我可以添加:

std::cout << "tID = " << omp_get_thread_num() << "\n\n";

它打印出一堆零,只有最后一次迭代分配给线程 1。

我的系统:我必须支持交叉编译。所以我使用的是 gcc 4.4.3 和 4.5.0,它们都按预期工作,但是对于 MS 2010,我看到上面的行为,其中 29 次迭代分配给线程 0,一次迭代分配给线程 1。

真的很奇怪:我花了一点时间才意识到这可能只是一个日程安排问题。我用谷歌搜索并找到了 this website ,如果您跳到底部,它有一个必须自动生成输出的示例。使用动态引导 调度的所有迭代都分配给线程零??!?

任何指导将不胜感激!!

最佳答案

这很可能是因为 Visual Studio 中的 OMP 实现决定您所做的工作远远不够值得将其放在多个线程上。如果您只是简单地增加迭代次数,那么您很可能会发现其他线程的利用率更高。动态调度意味着实现仅在需要时 fork 新线程,因此如果不需要它们,它不会让它们工作或分配它们工作。

关于c++ - 为什么使用给定一个线程的 OpenMP schedule(dynamic) 并行化循环中的所有迭代? (MSVS 2010),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4176464/

相关文章:

c++ - 是否可以将 va_list 传递给可变参数模板?

c++ - std::list 的部分排序

visual-studio - 在一种配置中同时编译 x86 和 x64?

C:逐行读取文件

c - 比赛排类表C算法

javascript - dlib http 服务器将网站显示为纯 html,没有 javascript/css

visual-studio-2010 - 为所有用户部署从 Visual Studio 2010 创建的 Outlook 2007 外接程序

c - 在 VS 调试器 : any way to hover and see values? 中使用#define

java - 如何在一定次数的执行后停止计划重复执行的 Runnable

c++ - 为什么这个输出?