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? –