我有一个 C++ 代码,在 8 线程计算机上包含许多与 openMP 并行的 for 循环。
但是单线程的执行速度比并行8线程快。有人告诉我,如果 for 循环的负载增加,并行化将变得高效。
这里的负载是指例如循环的最大迭代次数。问题是我没有机会比较大量数据的单线程和 8 线程并行代码。
我应该使用并行代码吗?并行化效率是否会随着 for 循环的负载而增加?
我有一个 C++ 代码,在 8 线程计算机上包含许多与 openMP 并行的 for 循环。
但是单线程的执行速度比并行8线程快。有人告诉我,如果 for 循环的负载增加,并行化将变得高效。
这里的负载是指例如循环的最大迭代次数。问题是我没有机会比较大量数据的单线程和 8 线程并行代码。
我应该使用并行代码吗?并行化效率是否会随着 for 循环的负载而增加?
OpenMP 的规范用例是高迭代计数循环的迭代在一组线程之间的分布,条件是循环迭代没有直接或间接的依赖关系。
通过考虑循环迭代执行的顺序会影响结果吗?. 例如,如果迭代 N+1 使用迭代 N 的结果,那么您有这样的依赖关系,以相反的顺序运行循环迭代将改变例程的输出。
间接依赖主要是指数据竞争,其中线程必须协调它们对共享数据的访问,特别是它们必须确保对共享变量的写入以正确的顺序发生。
在许多情况下,您可以重新设计带有依赖项的循环以删除这些依赖项。
如果您有一个没有此类依赖关系的高迭代计数循环,那么您有一个使用 OpenMP 进行良好加速的候选人。这是但是:
现在,转向您的问题:
最后,如果不测量各种环境组合下的运行时间并了解您所做的测量告诉您什么,您将无法成为一名认真的并行计算专家。如果您无法比较大量数据的顺序执行和并行执行,则必须针对少量数据对其进行测量,并在对处理大量数据时的行为进行预测之前了解您学到的经验教训。