我需要一些关于 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
时,默认调度可能是 STATIC,这意味着根据 vector 的大小,每个线程都会分配一个固定的数据 block 。由于显然无法通过静态划分来平衡工作负载,因此您应该查看 DYNAMIC, GUIDED and RUNTIME条款,看看这是否有助于您重新建立(虚拟)内核的高利用率。根据 block 大小,这当然会导致额外的开销,但与静态调度时内核空闲的时间相比,它可能会变得微不足道。
回答最初的问题:我不认为你可以告诉一个线程继续另一个线程的工作。当工作被分配时,每个线程都必须自己处理它。这是我要尝试的。
#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 对类似的 question 写了一个非常好的答案前一段时间。
关于c++ - OpenMP 优化 for 循环的调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19176265/