c++ - 有没有办法告诉 openmp 共享数据是不变的?

标签 c++ memory-management constants openmp shared

我猜测即使从 openmp 中的共享数据读取也会导致一些并行开销,因为取决于处理器架构(如果不同的内核有自己的缓存......)可能需要刷新缓存以确保没有其他 cpu在读取之前修改了数据。

我这样想对吗?

如果是这样,有没有办法告诉 openmp(在英特尔编译器 fwiw 上)一些共享数据是常量,因此不需要这样的缓存刷新?

如果答案是 c++ const 是否有一种简单的方法可以将非常量数据转换为 const 数据,而无需实际重新分配内存,一旦程序在运行时通过了某个点?

更新

啊,好的。我现在记得我的印象是 const 在这种情况下是一件好事:http://www.akkadia.org/drepper/cpumemory.pdf ,第 6.4.1 节。这与错误共享有关,其中与读写变量共享缓存行的只读变量会导致缓存行被读写变量标记为独占的惩罚。链接文档建议,例如使用 gcc,将这些变量标记为 __attribute__((section(something.else))) 以确保它们存储在别处。

碰巧这与我自己的情况无关——大型数组和 STL 数据容器,其中读/写粒度将跨越许多缓存行,并且在任何情况下都是从不同的内存池分配的。所以这些自然会位于不同的缓存行。没问题!

最佳答案

我也在看这个话题,发现了 Oracle 的一般性能建议:

If a SHARED variable in a parallel region is read by the threads executing the region, but not written to by any of the threads, then specify that variable to be FIRSTPRIVATE instead of SHARED. This avoids accessing the variable by dereferencing a pointer, and avoids cache conflicts.

Oracle OpenMP API User's Guide - Chapter 7 - Performance Considerations

关于c++ - 有没有办法告诉 openmp 共享数据是不变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7418518/

相关文章:

c++ - 线性探测哈希函数不起作用?

c++ - 对静态 const int 的 undefined reference

c++ - 在 C++ 中修改 3D 坐标

iphone - Instruments 说我有内存泄漏,但我没有看到它

ios - 具有大量数据 Swift 的 CollectionView

wolfram-mathematica - 没有单位的 mathematica 物理常数

c++ - 无法在 C++ 中调用 const 引用参数的方法

c++ - byte* 不在 Library 中保留 "000000"

c - 为什么 free() 在释放内存之前不将其清零?

c++ - 从派生结构初始化 const 父结构成员