主存储器带宽测量

时间:2011-11-12 21:38:21

标签: bandwidth

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

  1. 许多人使用'bcopy'函数将字节从源复制到目标,然后测量它们作为带宽报告的时间。
  2. 其他方法是分配和数组并遍历数组(有一些步幅) - 这基本上给了时间来读取整个数组。
  3. 我尝试做1(1)数据大小为1GB,我得到的带宽为'700MB /秒'(我使用rdtsc计算副本经过的周期数)。但我怀疑这是不正确的,因为我的RAM配置如下:

    1. 速度:1333 MHz
    2. 总线宽度:32位
    3. 根据维基百科,理论带宽计算如下:

        

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

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

      ======

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

1 个答案:

答案 0 :(得分:1)

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

1333Mhz * 64bit /(8bits / byte)= 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);