OpenMP 优化了 for 循环的调度
OpenMP optimize scheduling of for loop
我需要一些关于OpenMP的帮助。如果一个线程以 for 循环结束,是否有可能对另一个线程有所帮助,将其划分?我有一个循环中的循环,其中有中断;线程不会同时结束,所以有些线程有很多工作,而其他线程已经完成。(所以有未使用的内核(。我在 corei7 上运行我的程序,似乎 OpenMP 将循环划分为 8 个线程。但是,当一个线程完成作业一段时间后,利用率开始下降。
#pragma omp parallel for
for(i = 0; i < Vector.size(); i++) {
for(j = 0; j < othervector.size(); j++) {
{some code}
if(sth is true) break;
}
}
谢谢。
for 循环
中循环迭代的默认划分/SCHEDULE
取决于实现。在您的情况下,使用 omp parallel for
时,默认的 shedule 可能是 STATIC,这意味着根据向量的大小,每个线程都会被分配一个固定的数据块。由于显然无法通过静态划分来平衡工作负载,因此您应该查看 DYNAMIC、GUIDED 和 RUNTIME 子句,看看这是否有助于您重新建立(虚拟(内核的高利用率。根据块大小,这当然会导致额外的开销,但与静态调度时核心处于空闲状态的时间相比,它可能变得可以忽略不计。
回答最初的问题:我认为你不能告诉一个线程继续另一个线程的工作。当工作被分配时,每个线程都必须自己处理它。这是我要尝试的。
#define CHUNKSIZE 100
#pragma omp parallel for schedule(dynamic,chunk) nowait
for(i = 0; i < Vector.size(); i++) {
for(j = 0; j < othervector.size(); j++) {
{some code}
if(sth is true) break;
}
}
实际上,Hristo Iliev前段时间对一个类似的问题写了一个非常好的答案。
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- 如何在c++中实现处理器调度模拟器
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我将如何实现循环调度模拟器
- 我将如何实现SJF和循环调度模拟器
- 如何打破 libevent 的调度循环
- 具有双重调度的C++多态循环函数
- 是否可以捕获翻译/调度消息循环中的窗口消息/事件
- OpenMP 优化了 for 循环的调度
- OpenMP:循环'std::map'基准测试(动态调度)
- VM解释器-更大指令集/调度循环的加权性能优点和缺点
- 可以是OpenMP中的静态调度循环块
- OpenMP中调度程序对循环变量的处理