主存带宽测量

3
我想要测量主内存带宽,当我搜索方法时发现:
1. 许多人使用“bcopy”函数将字节从源复制到目标,并报告他们称之为带宽的时间。
2. 其他方法是分配一个数组并遍历该数组(带有一些步幅) - 这基本上给出了读取整个数组所需的时间。
我尝试过使用(1)的数据大小为1GB,我得到的带宽为“700MB / sec”(我使用rdtsc来计算复制所用的时钟周期数)。但我怀疑这不正确,因为我的RAM配置如下:
1. 速度:1333 MHz
2. 总线宽度:32位
根据维基百科,理论带宽的计算公式如下:
时钟速度*总线宽度*每行每个时钟周期的位数(DDR3 RAM为2)1333 MHz * 32 * 2≈8GB / sec。
因此我的配置与预估带宽完全不同。您是否知道我做错了什么?
另一个问题是,bcopy包括读和写两方面。那么意味着我应该将计算出的带宽除以2才能获得只读或只写带宽吗?请问带宽是否只是延迟的倒数?请建议其他测量带宽的方法。

你似乎忘记了在当前计算机上缓存的重要性。你如何定义你的内存带宽?从程序员的角度来看,这基本上是memcpy正在获取的内容。此外,你的机器上可能还有其他进程在运行(因此会有额外的上下文切换等)。我不明白你想要精确测量什么!! - Basile Starynkevitch
1
Basile的评论触及了问题的核心......现代消费级个人电脑是非常复杂的生物,你所看到的性能取决于你正在做什么。有多个级别的缓存;CPU中的分支预测、推测执行管道;中断;其他进程;DMA外设想要使用(多个!)总线等等......这个问题在我那台Apple ][+上会更有意义。 - dmckee --- ex-moderator kitten
1个回答

1

我无法评论bcopy的有效性,但最直接的方法是您提到的第二种方法(步幅为1)。此外,您在内存带宽方程式中混淆了位和字节。32位=4字节。现代计算机使用64位宽的内存总线。因此,您的有效传输速率(假设DDR3技术)

1333MHz * 64位/(8位/字节)= 10666MB/s(也被归类为PC3-10666)

1333MHz已经考虑了每个时钟的2次传输。

查看维基页面以获取更多信息:http://en.wikipedia.org/wiki/DDR3_SDRAM

关于您的结果,请尝试使用数组访问再次运行。Malloc 1GB并遍历整个内容。您可以对数组的每个元素求和并将其打印出来,以便编译器不认为它是死代码。

像这样:

double time;
int size = 1024*1024*1024;
int sum;
*char *array = (char*)malloc(size);
//start timer here
for(int i=0; i < size; i++)
  sum += array[i];
//end timer
printf("time taken: %f \tsum is %d\n", time, sum);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接