gpt4 book ai didi

c++ - OpenMP 优化 for 循环的调度

转载 作者:行者123 更新时间:2023-11-30 04:13:53 26 4
gpt4 key购买 nike

我需要一些关于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com