当线程数大于逻辑cpu的数量时,为什么MCS锁的吞吐量会很差

时间:2013-11-17 21:09:10

标签: multithreading computer-architecture microprocessors

当线程数大于逻辑cpu数时,为什么mcs的吞吐量锁定不佳。 可能是因为cpu上的地方争用增加导致许多线程被抢占?

1 个答案:

答案 0 :(得分:1)

我不是100%,但Microsoft库提供了Sleep()函数的定义:

  

休眠间隔过后,线程就可以运行了。如果指定0>毫秒,则线程将放弃其时间片的剩余部分,但保持>准备好。请注意,不保证立即运行就绪线程。因此,>线程可能在睡眠间隔过去一段时间后才会运行。

根据我的经验,如果我使用MCS锁,让我们说,更新一个数据结构,我运行它的线程数是16,从8开始下降(不包括1-2个线程的大量下降)到16个线程(假设你只是加倍线程数)是非常大的。吞吐量在一个线程之后下降到大约三分之一,然后慢慢减少到正在使用的线程数接近CPU的数量。显然,如果你正在使用一个锁,那么试图获取锁的线程越多,你就会有更多的缓存一致性工作供CPU使用。

如果您使用任何原子指令(再次假设您),您添加的线程越多,这将变得越慢。

  

"我不认为问题在于原子操作会花费更长的时间;真正的问题可能是原子操作可能会阻塞其他处理器上的总线操作(即使它们执行非原子操作)。"

这是从stackoverflow的另一个成员获取的类似问题。结合线程可能会或可能不会睡眠的事实,即使使用Sleep(),并且可能会或可能不会立即唤醒,这可能会导致吞吐量的严重损失。您还需要增加总线流量来处理...