在没有重生线程团队的情况下打开 MP

Open MP without respawn team of threads

提问人:Mono 提问时间:11/16/2023 更新时间:11/16/2023 访问量:41

问:

我有以下代码结构,并希望在使用 OpenMP 时并行化循环:function2

// main.cpp
for (int i = 0; i < 1000; ++i) {
 function1();
}

// function1 in module1.cpp
float sum = 0;
std::vector<float> numbers = /* a vector of 20000 random floats */
for (int j = 0; j < 20; ++j) {
 function2(sum, numbers);
}

// function2 in module2.cpp
for (int z = 0; z < numbers.size(); ++z) {
 atomicSum(sum, numbers[z]);
}

我试图用它来并行化循环 in ,但它为 in 的每次迭代创建一个新的线程组,从而导致不必要的开销。#pragma omp parallel forfunction2jfunction1

我的目标是在主模块的开头创建一个线程组,并重用这个组来并行化循环。如何使用 OpenMP 有效地实现这一点?function2

此外,当然,重要的是要注意该行必须是原子的,因为变量“sum”将由每个线程共享。atomicSum(sum, numbers[z]);

C++ 多线程并 行处理 OpenMP 原子

评论

0赞 Daniel Langr 11/16/2023
允许实现重用线程,而实际的实现可以重用线程。现场演示:godbolt.org/z/shW9965M3。因此,每次调用 will 很可能会重用在其第一次调用中创建的线程。无论如何,您也可以折叠嵌套循环,但它们可能需要在同一个块中(我不确定这一点)。function1
0赞 Victor Eijkhout 11/16/2023
1. 你如何观察到鞭刑正在被重新创造?2. 我测试过,发现开销很小,因为线程池通常被重用。3. 既然你正在编写 C++,你应该真正使用基于范围的语法:.它有效,而且看起来要好得多。for ( auto z : numbers)
3赞 PierU 11/16/2023
此外,您不应期望通过并行化仅由原子操作组成的循环来加速。
0赞 Peter Cordes 11/16/2023
您在什么操作系统上使用什么 OpenMP 实现?此外,只需要多一点代码就可以使它成为一个最小的可重现示例,人们可以复制/粘贴和尝试,例如,通过包含定义函数 arg 类型的行,我假设通过引用?float &sum

答: 暂无答案