1

我需要一些有关 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;
    }
}

谢谢你。

4

1 回答 1

2

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前段时间对类似问题写了一个非常好的答案。

于 2013-10-04T09:12:07.393 回答