bob.s
.data
variable:
.word 0,0,0,0
.word 0,0,0,0
.word 0,0,0,0
.word 0,0,0,0
.word 0,0,0,0
.word 0,0,0,0
.text
.globl runAssemblyCode
runAssemblyCode:
mov $0xFFFFFFFF,%eax
start_loop:
decl variable+0
decl variable+8
decl variable+16
;decl variable+24
dec %eax
jne start_loop
retq
ted.c
#include <stdio.h>
#include <time.h>
void runAssemblyCode (void);
int main (void)
{
volatile unsigned int ra,rb;
ra=(unsigned int)time(NULL);
runAssemblyCode();
rb=(unsigned int)time(NULL);
printf("%u\n",rb-ra);
return(0);
}
GCC -02 ted.c bob.s -o特德
,这是与额外的指令:
00000000004005d4 <runAssemblyCode>:
4005d4: b8 ff ff ff ff mov $0xffffffff,%eax
00000000004005d9 <start_loop>:
4005d9: ff 0c 25 28 10 60 00 decl 0x601028
4005e0: ff 0c 25 30 10 60 00 decl 0x601030
4005e7: ff 0c 25 38 10 60 00 decl 0x601038
4005ee: ff 0c 25 40 10 60 00 decl 0x601040
4005f5: ff c8 dec %eax
4005f7: 75 e0 jne 4005d9 <start_loop>
4005f9: c3 retq
4005fa: 90 nop
我没有看到区别,也许你可以纠正我的代码或其他人可以尝试在他们的系统,看看他们看到了什么......
这是一个非常痛苦的指令,如果你正在做的东西以外的字节为基础的内存递减未对齐,并将痛苦的内存系统。所以这个例程应该对高速缓存行以及内核数量敏感。
无论有没有额外的指令,它都需要大约13秒。
的AMD Phenom 9950四核处理器
上
英特尔(R)核心(TM)2 CPU 6300
历时约9-10秒有或没有额外的指令。
两个处理器: 英特尔(R)至强(TM)CPU
了约13秒,或没有额外的指令。
在此: 英特尔(R)核心(TM)2 Duo处理器T7500
8秒有或无。
所有正在运行的Ubuntu 64位10.04或10.10,可能是11.04在那里。
一些更多的机器中,64位,的ubuntu
英特尔(R)至强(R)CPU X5450(8芯)
6秒具有或不具有额外的指令。
英特尔(R)至强(R)CPU E5405(8芯)
9秒有或无。
系统中DDR/DRAM的速度是多少?你正在运行什么样的处理器(如果在Linux上是cat/proc/cpuinfo)。
英特尔(R)至强(R)CPU E5440(8芯)
6秒具有或不具有
稀释,发现单核,至强虽然: 英特尔(R)至强(TM) CPU
15秒,或者没有额外的指令
出于好奇,你尝试开始与空指令来调整从该端缓存行之前填充?您可能只是简化了解码和执行路径上的任务分配,可能会发现一个加剧它们的序列,然后通过额外的指令提供补救措施。 –
愚蠢的问题:我如何组装这个,这是英特尔语法是吗?我可以使用gcc/gas吗? –
明白了,你是否想要减少字节,单词,dword? –