openMP的并行化效率 我有一个C++代码,它包含了许多与8线程计算机上OpenMP并行的循环。p>

openMP的并行化效率 我有一个C++代码,它包含了许多与8线程计算机上OpenMP并行的循环。p>,c++,parallel-processing,openmp,execution-time,C++,Parallel Processing,Openmp,Execution Time,但是单线程的执行速度比并行8线程快。有人告诉我,如果for循环的负载增加,并行化将变得高效 这里的load是指循环的最大迭代次数。问题是我没有机会比较单线程和8线程并行代码中的大量数据 我应该使用并行代码吗?并行化效率真的会随着for循环的负载而提高吗?OpenMP的标准用例是在循环迭代没有直接或间接依赖关系的情况下,高迭代次数循环的迭代在一组线程之间的分布 通过考虑循环迭代执行的顺序是否会影响结果这个问题,您可以发现我所说的直接依赖是什么意思?。例如,如果迭代N+1使用了迭代N的结果,那么您有

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

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


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

OpenMP的标准用例是在循环迭代没有直接或间接依赖关系的情况下,高迭代次数循环的迭代在一组线程之间的分布

通过考虑循环迭代执行的顺序是否会影响结果这个问题,您可以发现我所说的直接依赖是什么意思?。例如,如果迭代N+1使用了迭代N的结果,那么您有这样的依赖关系,以相反的顺序运行循环迭代将更改例程的输出

我所说的间接依赖主要是指线程必须协调对共享数据的访问,特别是必须确保对共享变量的写入以正确的顺序进行

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

如果您有一个高迭代计数的循环,而该循环没有这样的依赖项,那么您就有了一个OpenMP良好加速的候选者。以下是一些要点:

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

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

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

你的问题太宽泛,不适合这样做。考虑缩小它并提供一些代码示例。