问题标签 [false-sharing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
510 浏览

c++ - C++ 避免 OpenMP 中的“错误共享”

我正在尝试在矩阵上并行化一些迭代。

矩阵保存在一维数组中,以便在内存中具有连续数据:

用数字填充“数据”后,我以这种方式索引矩阵:

之后,我将矩阵上的迭代并行化,为每个线程分配一列,因为我必须逐列进行计算。

我认为我遇到了“错误共享”问题,其中写入矩阵单元时缓存数据无效。

我怎么解决这个问题?

0 投票
0 回答
60 浏览

c++ - 为什么这个片段不能产生虚假的分享效果?

我试图制作一个重现虚假共享场景的小片段。这就是我想出的:

但是,在调试版本中在 VS2013 下运行它(因此没有优化),无法产生任何错误 - 没有命中断点并且线程没有退出。我的示例是不准确的,还是有什么东西可以防止在单个物理 CPU 上暴露虚假共享?

0 投票
2 回答
182 浏览

java - ConcurrentHashMap 中的 Dose Segment 存在虚假共享问题?

java.util.concurrent.ConcurrentHashMap使用Segment数组作为Mutex并且Segment Object比缓存线小。

这会导致虚假分享吗?

0 投票
1 回答
429 浏览

java - Java 填充性能破坏

嗨,伙计们,所以我得到了这段代码

}

因此,如果我运行它大约需要 11 秒,但如果我取消注释 qa1 它会在 3 秒内运行。我试图在互联网上找到一些东西,但没有足够的信息出现。据我了解,它与 JVM 优化有关,而长 q1 可能会使内存(或缓存)分布变得更好。无论如何,我的问题是有人知道我在哪里可以阅读更多有关它的信息。谢谢

0 投票
1 回答
1026 浏览

c - 使用填充防止虚假共享

我想计算一个大矩阵的总和,当我使用多个线程或只使用一个线程时,我目前没有看到性能改进。我认为问题与错误共享有关,但我还在结构中添加了填充。请看一看!

0 投票
1 回答
474 浏览

c++ - 错误共享受保护的成员变量?

考虑:

如果互斥锁或受保护的变量连续存储并且在缓存时它们共享一个缓存行,这会导致某种“交叉锁定”吗?

如果是这样,在它们保护的变量之后(或之前)声明互斥锁是一种好习惯吗?

将类与std::hardware_destructive_interference_size( P0154 ) 对齐可能会避免这种影响。潜在的好处值得对象的过度对齐吗?

0 投票
1 回答
656 浏览

multithreading - 防止虚假分享的奇怪代码

我想从此链接讨论golang中的以下结构

使用 Mutex 时,上述结构一次只能访问一个线程。编码器将在线程开始时锁定结构,并在线程完成时将其解锁。所以内存不在线程之间共享。所以只有一个内核可以访问内存。所以,据我了解,这里不会发生虚假分享。如果不能发生虚假共享,为什么编码器用额外的字节(pad [128]byte)填充结构?我的理解错了吗?

0 投票
1 回答
1742 浏览

c++ - Eigen & OpenMP:由于错误共享和线程开销,没有并行化

系统规格:

  1. Intel Xeon E7-v3 处理器(4 插槽,16 核/插槽,2 线程/核)
  2. 使用 Eigen 族和 C++

以下是代码片段的串行实现:

我需要并行化 get_Row 部分,因为 nCols 可以大到 10^6,因此,我尝试了某些技术:

  1. 朴素的并行化:

    /li>
  2. 条带采矿:

    /li>
  3. 来自互联网的某个地方以避免虚假共享:

    /li>

输出:

上述技术都没有帮助减少大型 nCol 执行 get_row 所需的时间,这意味着简单的并行化与其他技术类似(尽管串行更好),有什么建议或方法可以帮助改善时间吗?

正如用户 Avi Ginsburg 所说,我提到了其他一些系统细节:

  • g++(GCC) 是 4.4.7 版本的编译器
  • 特征库版本为 3.3.2
  • 使用的编译器标志:“-c -fopenmp -Wall -march=native -O3 -funroll-all-loops -ffast-math -ffinite-math-only -I header”,这里的 header 是包含 Eigen 的文件夹。
  • gcc -march=native -Q --help=target->的输出(仅提及一些标志的描述):

    -mavx [启用]

    -mfancy-math-387 [启用]

    -mfma [已禁用]

    -三月=核心2

有关标志的完整说明,请参阅

0 投票
1 回答
142 浏览

multithreading - 多处理器系统上的错误共享和缓存对齐

我试图了解错误共享和缓存对齐以及它对多核系统性能的影响。这是我的案例,我试图在非常高的层次上理解。

我有 2 个线程和 4 个内核/CPU,可以在任何给定时间为 2 个线程提供服务。现在我的线程不断地处理写入和读取它们各自的数据结构,这些数据结构相当大,接近 32K 大小。每个线程相互独立,不写入/读取其他线程的数据结构。线程始终持有其时间片开始的锁。

鉴于我的上述情况,是否有任何错误共享的机会或任何可能阻碍性能的负面影响。我认为不会有任何错误共享,因为每个线程都在自己的数据结构上工作,并在线程时间片的一开始就锁定。

0 投票
1 回答
36 浏览

c++ - 多线程 - 效率降低,可能是由“错误共享”引起的

我需要计算 2 个使用相同参数的不同函数(仅用于读取)。在我使程序多线程后,程序运行需要 2 倍的时间(而不是 0.5 倍)。我是多线程编程的新手,但我怀疑false sharing.

我的原始代码(剪切):

工作正常。然后我尝试使用线程:

哪个有效,但慢了 2 倍。然后我尝试“释放”变量“mu、sigma 和 p”,但它仍然慢了 2 倍: