主内存带宽测量

我想测量主内存带宽,在寻找方法时,我发现,

  1. 许多人使用' bcopy '函数将字节从源复制到目标,然后测量它们报告的带宽时间。
  2. 其他方法是分配和数组并遍历数组(有一些步幅) - 这基本上给了时间来读取整个数组。

我尝试做(1)数据大小为1GB,我得到的带宽是'700MB /秒'(我用 rdtsc 来计算复制经过的周期数)。但我怀疑这是不正确的,因为我的RAM配置如下:

  1. 速度:1333 MHz
  2. 总线宽度:32位

根据维基百科,理论带宽计算如下:

时钟速度*总线宽度*每行每个时钟周期的#位数(ddr 3为2)   ram)1333 MHz * 32 * 2~ = 8GB/sec。

因此,我的估计带宽完全不同。我知道我做错了什么吗?

=========

其他问题是,bcopy涉及读写。那么这是否意味着我应该将计算出的带宽除以2以仅获得读取带宽或仅写入带宽?我想确认带宽是否只是延迟的倒数?请建议任何其他测量带宽的方法。

2
您似乎忘记了在当前计算机上缓存的重要性。你如何定义你的内存带宽?从程序员的角度来看,它基本上就是memcpy所获得的。此外,您可能还在计算机上运行其他进程(因此需要额外的上下文切换等)。我不明白你想要准确测量的是什么!!
额外 作者 Basile Starynkevitch,
Basile的评论涉及问题的核心......现代消费者PC是凶猛复杂的野兽,你看到的表现非常依赖于你正在做的事情。缓存有多个级别;分支预测,在CPU中推测性地执行流水线;中断;其他过程; DMA外设想要使用(多个!)总线;等......这个问题在我的Apple上会更有意义] [+。
额外 作者 dmckee,

1 答案

我不能评论bcopy的有效性,但最简单的方法是你说的第二种方法(步幅为1)。此外,您在内存带宽等式中将位与字节混淆。 32位= 4字节。现代计算机使用64位宽的内存总线。所以你的有效传输率(假设DDR3技术)

1333Mhz * 64bit /(8bits/byte)= 10666MB/s(也归类为PC3-10666)

1333Mhz已经考虑了2个传输/时钟。

Check out the wiki page for more info: 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);
0
额外