使用时间度量预测缓存行长度

时间:2013-05-05 21:20:22

标签: caching assembly size line

嗨,这是我在这里发表的第一篇文章,大家好。

我在GNU AS中预测缓存行大小时遇到​​问题。我在C中编写了一个调用函数编写的函数。

这是这个功能

.section .text
.section .data

.global time

time:
pushl %ebp
xor %edx, %edx
xor %eax, %eax
CPUID
RDTSC
popl %ebp   
ret

测量CPU周期

C代码是:

#include <stdio.h>

const int size = 256;

void main(){

unsigned long long cykl, cykl1, cykl2;

unsigned char matrix[size];

char bla;

int i,j,k;

    for(i=0 ; i<size; i++)
        {
        cykl1 = time();
        bla = matrix[i];
        cykl2 = time();
        cykl = cykl2 - cykl1;

        printf("i=%d: %lld \n",i, cykl);
        }       
}

我运行了这个程序,但我看不出任何时间差异。据我所知,我的缓存行长度为64字节。

每次加载下一个64字节的数组时,时间都会上升,对不对?

我会感激任何建议,为什么它无法正常工作。

1 个答案:

答案 0 :(得分:0)

我认为有3个问题。

首先,您的程序调用可能不是您的汇编例程,而是time(2)系统调用,它返回seonds中的当前时间。 汇编例程名称应在* .s文件中以下划线为前缀,即_time。

您还可以使用__asm__关键字声明例程。看到: http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Asm-Labels.html

其次,GCC优化器可能会消除(或重新排序)内存访问。 您应该检查从C代码生成的汇编代码。

第三,RDTSC未序列化。 换句话说,CPU可能会重新排序对内存的访问和RDTSC操作,或者它们是并行执行的。 您应该插入一些指令以防止重新排序。

请参阅“英特尔®64和IA-32架构软件开发人员手册第2B卷:指令集参考,M-Z”中RDTSC的说明: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html