OpenMP 优化了 for 循环的调度

OpenMP optimize scheduling of for loop

本文关键字:调度 循环 for 优化 OpenMP      更新时间:2023-10-16

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