|
||||
我們已經知道,AMD推土機架構采用了模塊化設計,每個模塊內有兩個整數核心和一個浮點核心,各自搭配專用的調度器,而且浮點核心可為兩個整數核心所共享使用。因為有自己的調度器,浮點核心不必依賴整數調度器去安排浮點命令,也無需借助整數資源去執行256位命令。相比之下,Intel的架構中整數和浮點核心共用一個調度器,它必須同時處理整數和浮點命令。
推土機架構圖
推土機架構會在指令集方面做出大幅度的擴展,加入支持SSSE3、SSE 4.1/4.2、AVX、AES、FMA4、XOP、PCLMULQDQ等等,其中最關鍵的就是AVX。
AVX指令集可以執行256位浮點指令,但需要澄清的是,並沒有什麼所謂的『256位命令』。單精度命令都是32位的,雙精度則是64位。使用今天標准的128位浮點單元,可以在一個時鍾周期內並行執行四個單精度命令或者兩個雙精度命令。有了AVX效率就可以翻一番,亦即每時鍾周期內執行八個32位單精度命令,或者兩個64位雙精度命令。
當然了,這得要應用程序支持AVX纔行,否則的話256位浮點單元只會運行在128位模式下——正因為如此,AMD提出了彈性浮點單元。
如今的典型數據中心負載都以整數運算為主,浮點運算只佔很小一部分,所以絕大多數情況下一個龐大的256位浮點單元只會白白消耗內核面積和功耗,坐視整數單元忙得要死。推土機通過在兩個整數核心之間共享一個256位浮點單元,既節省了內核面積和功耗,也能靈活滿足實際負載需求。
Flex FP彈性浮點單元由兩個128位FMAC(乘法累加器)組成,每一個都可以在每時鍾周期內執行FMAC、FADD(浮點加法)、FMUL(浮點乘法),而Intel的架構中只能通過單個FADD管線執行FADD指令,FMUL亦然。有了FMAC單元,乘法和加法命令不會像標准FADD、FMUL那樣擁堵在一起,兩個單元都可以靈活處理這些計算命令。如果一個程序只使用FADD,那麼兩個FMAC單元都可以全力執行FADD。
這種設計的其他好處還有:支持FMA4指令而實現非破壞性DEST,降低寄存器的壓力;消除中間反復步驟,提高精確度。
順便再說說AES。如果應用程序符合美國商務部FIPS 197加密標准,AES就能為其實現硬件加速。推土機的Flex FP單元也能執行這些一次16個字節的指令,速度為每時鍾周期一個,是現有帶寬的兩倍。
Flex FP的設計理念對降低功耗也大有好處,能讓設計人員在同樣的功耗指標下放入更多繁忙的整數單元。事實上,Flex FP的設計目標之一就是將其空閑功耗降至峰值功耗的區區2%。
Flex FP的美妙之處在於它既是單個256位浮點單元,又被兩個整數核心所共享。每個時鍾周期內,每個整數核心都可以通過兩個128位指令或者一個256位指令來來操作256位並行數據,或者每個整數核心同時執行128位命令。
這種硬件設計對BIOS、軟件編程來說也並不復雜,可以隨著每個處理器時鍾周期兒變化,以滿足特定時刻的需求。以下是每個周期內的四種可能場景:
1、核心1:兩個128位AVX或者未編譯SSE命令;核心2:無浮點命令
2、核心1:無浮點命令;核心2:兩個128位AVX或者未編譯SSE命令
3、核心1:128位浮點命令;核心2:128位浮點命令
4、核心1:無浮點命令;核心2:無浮點命令
可以看出,浮點單元的彈性設計使得整個系統都更加靈活,也優化了每個周期內每個核心的性能。
對於應用程序來說,256位AVX指令集需要它們重新編譯纔能充分利用,這顯然需要時間和反復測試,因此AVX的普及也不會是一朝一夕的事情,而靈活的Flex FP浮點單元設計有望加速這一進程。