2011-10-23 76 views
5

我有一个#pragma omp parallel for循环内的类方法。每个线程只读访问少数方法局部变量,很少调用私有数据和一个方法的参数。所有这些都在shared条款中声明。 我的问题:OpenMP共享与firstprivate performancewise

  • 性能方面不应有任何区别声明这些 变量sharedfirstprivate。对?
  • 如果我不小心使变量不共享相同的缓存行,是否也是如此?
  • 如果其中一个共享变量是一个指针,并且在线程内部,我通过它读取一个值,是否有像普通循环中的别名问题?

明天我会尝试剖析我的代码。同时感谢您的建议!

回答

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

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

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