OpenMP 如何真正减少时钟周期?

How does OpenMP actually reduce clock cycles?

这可能是一个愚蠢的问题,但是使用 OpenMP,您可以实现在 CPU 拥有的所有内核之间分配操作数。当然,它会在 99% 的时间里更快,因为你从一个内核执行 N 个操作变成了 K 个内核同时执行相同数量的操作。

尽管如此,时钟周期的总数应该是相同的,对吧?因为操作次数是一样的。还是我错了?

我认为答案取决于您如何定义时钟周期总数。如果您将其定义为来自不同内核的所有时钟周期的总和,那么您是正确的,并且不会有更少的时钟周期。但是,如果您将其定义为“主”核心在启动和完成分布式操作之间的时钟周期数,那么它可能会更少。

这个问题或多或少归结为 CPU 时间和经过时间之间的差异。事实上,我们在这里看到的问题比 none 多,这些问题以“我的代码无法扩展,为什么?”开头,第一个答案是“你是如何测量时间的?” (我让你快速搜索,我相信你会找到很多结果)

但为了更多地说明事情是如何运作的,让我们假设您有一个 fixed-size 问题,您有一个完美的算法 parallelized.You 有 120 个动作要做,每个动作需要 1 秒。然后,1 CPU 核心需要 120 秒,2 核心需要 60 秒,3 核心需要 40 秒,等等。 那是正在减少的经过时间。但是,2 个核心,运行 并行 60 秒,将消耗 120 秒的 CPU 时间。这意味着与只有一个 CPU 核心 运行.

相比,时钟周期总数不会减少

总而言之,对于一个完美并行化的问题,您希望看到您的运行时间随着使用的内核数量完美缩减,并且 CPU 时间保持不变。

实际上,由于并行化开销 and/or 不完美的并行化,您经常看到缩减所用时间少于预期。与此同时,出于同样的原因,您会看到 CPU 时间随着使用的内核数量而略有增加。