openMP的并行化效率

时间:2012-06-26 11:55:48

标签: c++ parallel-processing openmp execution-time

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

通过考虑问题循环迭代执行的顺序是否影响结果,您可以发现直接依赖关系的含义?。例如,如果迭代N + 1使用迭代结果N你有这样的依赖关系,以相反的顺序运行循环迭代将改变例程的输出。

通过间接依赖关系,我的意思是data races,其中线程必须协调对共享数据的访问,特别是它们必须确保对共享变量的写入以正确的顺序发生。

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

如果你有一个没有这种依赖关系的高迭代计数循环那么你有一个候选人可以通过OpenMP获得良好的加速。这是buts:

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

现在,转向你的问题:

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

最后,如果不在各种情况组合下测量运行时间并了解您所做的测量结果告诉您,您就不能成为一名严肃的并行计算员。如果您无法比较大量数据的顺序执行和并行执行,那么在处理大量数据时,必须先测量它们以获得适量的数据并理解您学习的经验教训。