嗨,这是我在这里发表的第一篇文章,大家好。
我在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字节的数组时,时间都会上升,对不对?
我会感激任何建议,为什么它无法正常工作。
答案 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