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