在for循环中打开mp和chunksize

问题描述 投票:0回答:1

我正在使用 OpenMP 并行化(内部)循环。 每次迭代的工作量不是很大,因此更多的线程会带来重要的开销。 因此,我将循环安排为静态(也尝试动态),块大小=16。

我期望当迭代次数小于16时,使用单线程。 因此我预计时间本质上是串行时间。

所以我希望对于 num_iter=16,以下两个版本是相同的:

#pragma omp parallel for schedule(static,16) if (num_iter>16)
for (index_t i = 0; i != num_iter; ++i)
    // do work
#pragma omp parallel for schedule(static,16)
for (index_t i = 0; i != num_iter; ++i)
    // do work

第一个版本运行时间与 num_iter=16 时预期的顺序时间相同。 然而,第二个版本的运行时间随着线程数量的增加而降低。

为什么 OpenMP 表现如此糟糕?

openmp
1个回答
0
投票

在第二个版本中,您始终要支付进入和离开并行区域的 fork-join 成本,因为这是您告诉编译器生成的。在第一个版本中,只有当迭代次数超过 16 次并且启用

omp parallel
时,您才需要支付该费用。该成本实际上与集中式屏障的成本相同(因为它可以被认为是从后到前执行的屏障的连接/分叉),因此随着线程数量的增加而增加。

在“”中,我测量了树屏障的性能(因此,隐含了并行区域的分叉连接成本),结果如下:-

Tree Barrier scaling

显然,不同机器上的性能会有所不同,但一般的想法是,成本随着线程数量的增加以及跨越机器边界时而增加。

如果您在并行区域内几乎没有什么工作,那么 fork-join 的成本变得很大也就不足为奇了,而且您使用的线程数量越大(不是:-)),成本就越高。

© www.soinside.com 2019 - 2024. All rights reserved.