性能方面的OpenMP共享与firstprivate

时间:2011-10-23 10:20:45

标签: c++ performance optimization openmp

我在类方法中有一个#pragma omp parallel for循环。每个线程只读取几个方法局部变量,很少调用私有数据和方法的参数。所有这些都在shared子句中声明。 我的问题:

  • 表现明智不应该有任何不同声明这些 变量sharedfirstprivate。正确?
  • 如果我不小心让变量不共享同一个缓存行,那么它是一样的吗?
  • 如果其中一个共享变量是一个指针并且在线程中我通过它读取了一个值,是否存在像普通循环中的别名问题?

明天我将尝试描述我的代码。在此期间感谢您的建议!

1 个答案:

答案 0 :(得分:10)

  1. 嗯,他们不是一回事。使用shared,它们在所有线程之间共享。使用firstprivate,每个线程都获得它自己的副本。如果您只是阅读变量,那么最好将其保留为shared以避免复制它。 (在C ++中,firstprivate将隐式调用复制构造函数。)

  2. 正确,多个线程读取和写入位于同一个高速缓存行的值称为false sharing。缓存行将在访问它的核心之间来回反弹 - 如果经常发生这种情况,可能会导致显着减速。

  3. 如果您只是通过共享指针读取数据,那么应该没有问题。但如果你也写信,那么你需要确保你没有竞争条件。