OpenMP优化for循环的调度

时间:2013-10-04 08:05:06

标签: c++ multithreading parallel-processing openmp scheduling

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

谢谢。

1 个答案:

答案 0 :(得分:2)

for循环中循环迭代的默认除法/ SCHEDULE取决于实现。在你的情况下,当使用omp parallel for时,默认的shedule可能是STATIC,这意味着根据向量的大小,每个线程被分配一个固定的数据块。由于显然工作负载无法通过静态划分来平衡,因此您应该查看DYNAMIC, GUIDED and 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不久前给类似的question写了一个非常好的答案。