30 c memory performance multithreading
我正在开发一个高度并发的C程序,当核心数小于8时,它可以很好地扩展,但是拒绝扩展到超过8个核心.
我怀疑内存带宽是瓶颈,我该如何验证是否属实?
是否有任何工具/技术/操作系统功能可以帮助诊断?
Ser*_* L. 12
我自己在NUMA 96x8核心机器上遇到过这个问题.
90%的时间问题出在内存/缓存同步上.如果经常调用同步例程(原子,互斥),则必须在所有套接字上使相应的高速缓存行无效,从而导致整个内存总线完全锁定多个周期.
您可以通过运行像英特尔VTune或Perfsuite这样的探查器对其进行分析,并让它们记录您的原子需要多长时间.如果你正确使用它们,那么它们应该采取10-40个周期之间的东西.最糟糕的情况是,在将多线程应用程序扩展到8个套接字(Intel Xeon上的8x8内核)时,我有300个周期.
您可以做的另一个简单的分析步骤是在没有任何原子/互斥体的情况下编译(如果您的代码允许)并在多个套接字上运行它 - 它应该快速运行(不正确但快速).
您的代码在8个内核上快速运行的原因是因为只要您将所有代码放在同一个物理芯片(套接字)上,英特尔处理器在执行原子时就会使用缓存锁定.如果一个锁必须进入内存总线 - 这就是事情变得丑陋的时候.
我唯一可以建议的是:缩小您调用原子/同步例程的频率.
至于我的应用程序:我必须实现一个几乎无锁的数据结构,以便将我的代码扩展到一个套接字之外.每个线程都会累积需要锁定的操作,并定期检查它是否可以冲洗它们.然后传递令牌并轮流刷新同步操作.显然只有在等待时有足够的工作要做才有效.