arm指令集的U性能明顯不如x86架構的U,為什麼有人說x86架構落後?

x86的硬傷在微碼器上燒晶體管? arm的指令密度低? 他們各自都有些什麼優缺點?


哪聽說的x86架構落後的?請給出來源鏈接,如果給不出來,那麼:


x86的CISC內部也是解釋成 risc的微碼來運行,所以 x86還有一遍解釋翻譯工作,相當於risc處理器上又加了一層cisc的虛擬機,把編譯器和虛擬機該做的事情自己實時做了,肯定更耗電和笨重呀。其實對比x86和powerpc, arm指令集會發現,risc指令數少,而且更加靈活。cisc象basic,risc象彙編。而且risc本來就是更高效的東西,同樣C代碼編譯器產生的risc位元組碼更少,因為risc更精確。cisc抽象了太多高級概念,做了本來該編譯器做的事情,導致指令數盤大。又貴又費電又笨重。x86的優勢是流水線並行運行畫了很大力氣,這是intel的優勢,和risc/cisc無關。這個做得好,不代表cisc更科學。

----

上面是去年(2015-5-24)寫的,評論同學覺得cisc指令數多,應該更短,就像寫文章,字母越多的語言,寫出來的越短,直觀想來是這麼回事情,問題是x86的cisc太粗糙了,描述邏輯不夠細緻,舉個例子,就只能從源寄存器加到目標寄存器,你要計算x=a+b,就需要兩條指令,而arm下面支持源1+源2到另外一個目標,只需要一條指令;再比如說棧操作,x86指令雖多,棧操作卻遠沒有arm那麼靈活;x86指令很多都是雙操作數,arm指令很多三到四個操作數。

下面給段具體例子:近似計算混色

unsigned int AlphaBlend(unsigned int c1, unsigned int c2)
{
unsigned char a1 = (c1 &>&> 24) 0xff;
unsigned char r1 = (c1 &>&> 16) 0xff;
unsigned char g1 = (c1 &>&> 8) 0xff;
unsigned char b1 = (c1 0xff);
unsigned char a2 = (c2 &>&> 24) 0xff;
unsigned char r2 = (c2 &>&> 16) 0xff;
unsigned char g2 = (c2 &>&> 8) 0xff;
unsigned char b2 = (c2 0xff);
r1 = (r1 * a1 + r2 * (255 - a1)) &>&> 8;
g1 = (g1 * a1 + g2 * (255 - g1)) &>&> 8;
b1 = (b1 * a1 + b2 * (255 - b1)) &>&> 8;
a1 = (a1 + a2 * (255 - a1)) &>&> 8;
return (a1 &<&< 24) | (r1 &<&< 16) | (g1 &<&< 8) | b1; }

同樣使用 gcc來編譯,同樣加上了 -Os 優化選項(為代碼尺寸進行優化),結果如下:

arm:32條指令,共計128位元組

x86:60條指令,共計140位元組

修改為 gcc -O2 優化編譯,結果如下:

arm:33條指令,132位元組

x86:55條指令,153位元組

下面附上兩個平台 -Os編譯的結果:

arm代碼:RISC,32條指令,128位元組,

00000000 &:
0: e1a03c20 lsr r3, r0, #24
4: e92d4070 push {r4, r5, r6, lr}
8: e1a06821 lsr r6, r1, #16
c: e26340ff rsb r4, r3, #255 ; 0xff
10: e1a05c21 lsr r5, r1, #24
14: e20660ff and r6, r6, #255 ; 0xff
18: e0253594 mla r5, r4, r5, r3
1c: e0040496 mul r4, r6, r4
20: e200c0ff and ip, r0, #255 ; 0xff
24: e1a02420 lsr r2, r0, #8
28: e1a00820 lsr r0, r0, #16
2c: e20000ff and r0, r0, #255 ; 0xff
30: e0244093 mla r4, r3, r0, r4
34: e1a05445 asr r5, r5, #8
38: e1a04404 lsl r4, r4, #8
3c: e20448ff and r4, r4, #16711680 ; 0xff0000
40: e1844c05 orr r4, r4, r5, lsl #24
44: e20100ff and r0, r1, #255 ; 0xff
48: e26c50ff rsb r5, ip, #255 ; 0xff
4c: e0000095 mul r0, r5, r0
50: e20220ff and r2, r2, #255 ; 0xff
54: e1a01421 lsr r1, r1, #8
58: e0200c93 mla r0, r3, ip, r0
5c: e20110ff and r1, r1, #255 ; 0xff
60: e262c0ff rsb ip, r2, #255 ; 0xff
64: e001019c mul r1, ip, r1
68: e1a00800 lsl r0, r0, #16
6c: e0231392 mla r3, r2, r3, r1
70: e1840c20 orr r0, r4, r0, lsr #24
74: e2033cff and r3, r3, #65280 ; 0xff00
78: e1800003 orr r0, r0, r3
7c: e8bd8070 pop {r4, r5, r6, pc}

x86代碼:CISC,60條指令,140位元組,

00000000 &<_AlphaBlend&>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 57 push %edi
4: 56 push %esi
5: be ff 00 00 00 mov $0xff,%esi
a: 53 push %ebx
b: 89 f1 mov %esi,%ecx
d: 83 ec 04 sub $0x4,%esp
10: 8b 5d 08 mov 0x8(%ebp),%ebx
13: 8b 55 0c mov 0xc(%ebp),%edx
16: 89 d8 mov %ebx,%eax
18: 0f b6 ff movzbl %bh,%edi
1b: c1 e8 18 shr $0x18,%eax
1e: 89 45 f0 mov %eax,-0x10(%ebp)
21: 29 c1 sub %eax,%ecx
23: 89 d8 mov %ebx,%eax
25: c1 ea 10 shr $0x10,%edx
28: 0f b6 db movzbl %bl,%ebx
2b: 0f b6 d2 movzbl %dl,%edx
2e: c1 e8 10 shr $0x10,%eax
31: 0f af d1 imul %ecx,%edx
34: 0f b6 c0 movzbl %al,%eax
37: 0f af 45 f0 imul -0x10(%ebp),%eax
3b: 01 c2 add %eax,%edx
3d: 8b 45 0c mov 0xc(%ebp),%eax
40: 0f b6 d6 movzbl %dh,%edx
43: c1 e2 10 shl $0x10,%edx
46: c1 e8 18 shr $0x18,%eax
49: 0f af c1 imul %ecx,%eax
4c: 0f b6 4d 0c movzbl 0xc(%ebp),%ecx
50: 03 45 f0 add -0x10(%ebp),%eax
53: 0f b6 c4 movzbl %ah,%eax
56: c1 e0 18 shl $0x18,%eax
59: 09 d0 or %edx,%eax
5b: 89 f2 mov %esi,%edx
5d: 29 da sub %ebx,%edx
5f: 29 fe sub %edi,%esi
61: 0f af 5d f0 imul -0x10(%ebp),%ebx
65: 0f af d1 imul %ecx,%edx
68: 8b 4d 0c mov 0xc(%ebp),%ecx
6b: 0f af 7d f0 imul -0x10(%ebp),%edi
6f: 01 da add %ebx,%edx
71: 0f b6 d6 movzbl %dh,%edx
74: 09 d0 or %edx,%eax
76: 0f b6 d5 movzbl %ch,%edx
79: 0f af f2 imul %edx,%esi
7c: 5a pop %edx
7d: 5b pop %ebx
7e: 01 fe add %edi,%esi
80: 81 e6 00 ff 00 00 and $0xff00,%esi
86: 09 f0 or %esi,%eax
88: 5e pop %esi
89: 5f pop %edi
8a: 5d pop %ebp
8b: c3 ret

--


ISA理論上x86不如risc,但是到個體上,x86已經做到極致。


[arm]RISC本來就是[x86]CISC的簡化版,簡化80%不常用的指令集,為了達到相當高的性耗比以在相當的性能上達到更低的發熱,定位就不同,為何要比較。x86確實可能落後,但是intel做的很不錯,性能很高了


x86與ARM的對比永遠不對從技術角度上對比,這個角度上對比的話完全沒有意義。

從系統架構的角度上講,x86也不並落後。從功耗角度講,ARM也沒啥優勢。為啥?

因為中央處理器早就已經不是一台機器唯一核心的部件了。

對於一個台式機而言最核心的是啥?CPU、顯卡、硬碟、內存。排名不分先後。

對於一個伺服器而言最核心的是啥?CPU、內存、硬碟、網卡,排名不分先後。

現代計算機的性能瓶頸主要是啥?I/O。

現代計算機的功耗主要是啥?CPU點三分之一、內存點三分之一,硬碟可能佔得還不止三分之一。

so...


推薦閱讀:

TAG:彙編語言 | 精簡指令集RISC | 複雜指令集CISC | CPU指令集 | ARM指令 |