assembly - LOCK CMPXCHG 的线程执行速度

标签 assembly locking x86 performance parallel-processing

我编写了一个多线程应用程序来对 LOCK CMPXCHG (x86 ASM) 的运行速度进行基准测试。

在我的机器(双核 - Core 2)上,有 2 个线程运行并访问同一变量,我每秒可以执行大约 40M 操作。

然后我给每个线程一个唯一的变量来操作。显然,这意味着线程之间不存在锁定争用,因此我期望速度性能。然而,速度却没有改变。为什么?

最佳答案

如果有 2 个线程同时访问同一缓存行上的数据,则会出现错误共享,其中每个核心都必须不断更新其缓存,因为缓存的同一部分已被更改其他核心。

确保唯一变量分配在不同的内存块中(例如,至少相距 128 个字节),以确保这不是您遇到的问题。

DDJ 有一篇很好的文章描述了虚假共享的可怕影响:http://www.drdobbs.com/go-parallel/article/showArticle.jhtml?articleID=217500206

这是维基百科的条目:http://en.wikipedia.org/wiki/False_sharing

关于assembly - LOCK CMPXCHG 的线程执行速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3427061/

相关文章:

multithreading - 同步线程以同时读取不同的资源

linux - 内核如何设置注册cr3?

assembly - jng 在汇编中如何工作?

python - 如何锁定 AWS S3 上的文件?

gcc - C 中的内联汇编

haskell - withMVar和bracket_的行为不同

c - 为什么复杂的 memcpy/memset 更胜一筹?

c++ - 为什么我的 x86 汇编代码会导致段错误?

assembly - ADDC 与 ADD

c - 使用 x86 asm 制作 MMAP 宏