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

标签 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;
    }
}

谢谢。

最佳答案

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/

相关文章:

c# - 创建特定数量的任务\线程后如何等待特定时间?

c++ - dtor 中的 unique_lock 有什么用处吗?

c# - BigInteger阶乘的并行计算

r - R 中的异步编程

c++ - 如何使用对象池为 std::map 创建分配器

python - Pycassa,线程池, "Exception in thread Thread-3 (most likely raised during interpreter shutdown):"

c++ - size_t 是否保证是其中一种整数类型的别名类型?

java - 为并行处理数据选择最佳线程数

c++ - C/C++ : Calling function with no arguments with function which returns nothing

c++ - boost 信号有问题