如何使内存总线饱和

时间:2012-06-27 13:01:04

标签: c optimization memory hardware

我想测试具有各种内存总线使用级别的程序。例如,我想知道当其他进程使用50%的内存总线时,我的程序是否按预期工作。 我该如何模拟这种干扰?

我的尝试是运行一个包含多个线程的进程,每个线程从一大块内存中随机读取。这似乎对我的计划没什么影响。我的程序有很多内存操作,所以我预计会有明显的干扰。 我想让总线饱和,但不要使用太多的CPU周期,因此只会因总线争用而导致性能下降。

注意:

  • 我使用的是Xeon E5645处理器,DDR3内存

3 个答案:

答案 0 :(得分:3)

“进程使用50%的内存总线”的心理模型并不是很好。获取核心并访问不在高速缓存中的内存的线程使用内存总线。

获取线程使总线饱和很简单,只需使用memcpy()即可。复制适合最后一个缓存的数量的几倍,并通过多次运行来预热它,这样就没有页面错误来减慢代码的速度。

答案 1 :(得分:1)

我的第一直觉是设置一堆DMA操作来反弹数据,而不会过多地使用CPU。这完全取决于您运行的操作系统和硬件。这是嵌入式系统吗?我很乐意在评论中提供更多细节。

答案 2 :(得分:0)

我使用SSE2 movntps指令来传输数据,以避免同一核心中其他线程的缓存冲突。也许将该循环展开16次以最小化每次内存传输的指令数。虽然DMA的想法听起来不错,但链接的手册很老,对于32位的linux和你的处理器型号让我觉得你可能有64位操作系统,这让我想知道它有多少是正确的。在最坏的情况下,您的测试代码中的错误可能会使您的硬盘变得棘手