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