c++ - OpenMP shared vs. firstprivate performancewise

标签 c++ performance optimization openmp

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

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

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

最佳答案

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

  2. 正确,多个线程读取和写入位于同一缓存线上的值称为 false sharing .缓存行将在访问它的内核之间来回反弹 - 如果这种情况发生得足够频繁,可能会导致速度显着下降。

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

关于c++ - OpenMP shared vs. firstprivate performancewise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7865555/

相关文章:

android - Android 上的运算符 new 不会抛出 bad_alloc

ANDROID:图像快捷方式导致图库重建相册

node.js - 如何在 Nodejs 中使用监听器的回调函数而无需内联编写?

java - Java编译器可以优化递归方法中添加到集合中的操作吗

ios - 优化 iOS 应用程序的迭代循环

c++ - 如何降低最低值?

c++ - 在内存中对大 vector 进行排序的有效方法

javascript - 如何通过多个相同的属性过滤对象数组

c - 用 C 语言优化国际象棋游戏

C++/Qt 对象到 vector 并返回到对象