0

我有一个 C++ 代码,在 8 线程计算机上包含许多与 openMP 并行的 for 循环。

但是单线程的执行速度比并行8线程快。有人告诉我,如果 for 循环的负载增加,并行化将变得高效。

这里的负载是指例如循环的最大迭代次数。问题是我没有机会比较大量数据的单线程和 8 线程并行代码。

我应该使用并行代码吗?并行化效率是否会随着 for 循环的负载而增加?

4

1 回答 1

3

OpenMP 的规范用例是高迭代计数循环的迭代在一组线程之间的分布,条件是循环迭代没有直接或间接的依赖关系。

通过考虑循环迭代执行的顺序会影响结果吗?. 例如,如果迭代 N+1 使用迭代 N 的结果,那么您有这样的依赖关系,以相反的顺序运行循环迭代将改变例程的输出。

间接依赖主要是指数据竞争,其中线程必须协调它们对共享数据的访问,特别是它们必须确保对共享变量的写入以正确的顺序发生。

在许多情况下,您可以重新设计带有依赖项的循环以删除这些依赖项。

如果您有一个没有此类依赖关系的高迭代计数循环,那么您有一个使用 OpenMP 进行良好加速的候选人。这是但是:

  • 在每个此类循环的开始和结束时,计算都会产生一些并行开销,如果循环计数不够高,则此开销可能部分或全部超过并行运行迭代的加速。确定这是否影响您的代码的唯一方法是测试和测量。
  • 循环迭代之间的依赖关系可能比我已经概述的更微妙。根据您的系统架构和循环内的计算,您可能(没有意识到)对线程进行编程以争夺对缓存或 I/O 资源或任何其他资源的访问。在最坏的情况下,这可能会导致线程数量增加,从而导致执行率下降。
  • 您必须确保每个 OpenMP 线程都由硬件支持,而不是由超线程所代表的伪硬件支持。每个 OpenMP 线程一个核心,超线程是这个领域的蛇油。
  • 我希望这里还有其他的但可以放在这里,也许其他人会帮忙。

现在,转向您的问题:

  • 我应该使用并行代码吗? 测试和测量。
  • 并行化效率是否会随着 for 循环的负载而增加? 大约,但对于您的硬件上的代码,测试和测量。

最后,如果不测量各种环境组合下的运行时间并了解您所做的测量告诉您什么,您将无法成为一名认真的并行计算专家。如果您无法比较大量数据的顺序执行和并行执行,则必须针对少量数据对其进行测量,并在对处理大量数据时的行为进行预测之前了解您学到的经验教训。

于 2012-06-26T12:44:45.493 回答