0

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

我在 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 字节的数组时,时间都应该增加,对吗?

我将不胜感激任何建议为什么它不能正常工作。

4

1 回答 1

0

我认为有3个问题。

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

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

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

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

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

于 2013-05-06T03:54:18.433 回答