gpt4 book ai didi

c++ - http ://tinyurl. com/pzpyvb9 上的无锁堆栈的性能数据是否真实?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:48:31 26 4
gpt4 key购买 nike

http://blog.memsql.com/common-pitfalls-in-writing-lock-free-algorithms/ 的末尾, David Stolp 展示了无锁堆栈的性能数据,显示无锁版本比受互斥锁保护的顺序版本慢,即使争用增加也是如此。结果很有趣,但有两件事让我担心:

  • 充其量,“总体吞吐量”会随着线程数量的增加而下降,然后趋于平稳。总吞吐量不应该随着线程数量的增加而增加吗?
  • 在最终图表中,1 个线程的性能值范围从大约 35M 到 55M。对于 1 个线程(没有任何争用),这似乎是一个非常广泛的范围。

我试图找到一种方法就这些问题联系作者,但没有成功,所以我转向 SO 社区看看结果是否切合实际。是吗?

最佳答案

At best, "overall throughput" decreases and then levels out as the number of threads increases. Shouldn't overall throughput increase as the number of threads increases?

这很正常!堆栈只有一个!瓶颈是线程之间的内存同步,而不是代码执行。因此,如果更多线程填满堆栈,那么更多的内存冲突应该会发生(出现竞争条件),因此吞吐量会降低。

In the final chart, the performance values for 1 thread range from about 35M to 55M. This seems like an awfully wide range for 1 thread (where there can't be any contention).

这个测试代码不切实际,因为它只是将节点弹出并压入堆栈。因此,相对较短代码的最小差异会对吞吐量产生显着影响。

如果你检查代码,你会发现 SpinLock 版本非常简单并且可能比 LockFree 更快,因为它是用 test_and_set 原子函数创建的,通常比原子 CAS(比较和交换),用于 LockFree 版本。

编辑:

在 LockFree 版本中使用 cmpxchg16b,这是 16 字节的 CAS 在 SpinLock 中仅使用 8 字节的 test_and_set 函数(用 cmpxchg8b 实现)所以存在速度差异!

关于c++ - http ://tinyurl. com/pzpyvb9 上的无锁堆栈的性能数据是否真实?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19164342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com