浮點計算機

浮點計算機

浮點計算機是指CPU內部添加的“浮點運算功能”的超強計算機。

名詞簡介

浮點計算機,簡單來說,就是指CPU內部添加的“浮點運算功能”的超強計算機。

當我們用不同的電腦計算圓周率時,會發現一台電腦的計算較另一台來講結果更加精確。或者我們在進行槍戰遊戲的時候,當一粒子彈擊中牆壁時,牆上剝落下一塊牆皮,同樣的場面在一台電腦上的表現可能會非常的呆板、做作;而在另外一台電腦上就會非常生動形象,甚至與我們在現實中看到的所差無幾。

以上我們看到的一切,都源於CPU內部添加的“浮點運算功能”。浮點運算能力是關係到CPU的多媒體,3D圖形處理的一個重要指標。P4中只有2個浮點執行單元,而其中一個單元要同時處理FADD FMUL MMX SSE 和SSE2,所以P4處理器的浮點單元設計應該是整個處理器設計中最薄弱的部分。AMD則為Athlon設計了3個並行的浮點、多媒體執行單元。其中一個是浮點的存儲,一個是浮點加,一個是浮點乘,其中浮點加和浮點乘是分開的,所以Athlon中就有兩個並行的浮點通道,三個執行單元,而且相互之間完全不受干擾,這是所謂的超標量的浮點結構,可以說Athlon的浮點運算無疑是目前最強的。

浮點運算

浮點運算簡介

對於習慣於C的靈活多變的數據類型和方便的計算那些人而言,了解底層的浮點運算似乎沒有什麼意義,現在Visual盛行的時代還有多少人關心那些所謂的底層呢?

對了AfOs來說,浮點運算是編程中很重要的一部分,因為我們可能會面臨一些稍微複雜的運算,如果你和我一樣是Die-hard的asm擁護者,不想輕易用C來解決問題,你肯定能想像在asm下用整數運算求sin(2.3)的痛苦,實際上,微機早就為我們準備了解決之道:那就是浮點運算.但現在關於浮點運算的資料較少,相信很多人和我一樣還不掌握這種強有力的技術,那好,我們一起來學習學習。

(一)浮點數

在這之前,先來看幾個術語:

FPU->Floating Point Unit,浮點運算部件

BCD->Binary Coded Decimal 壓縮的二十進制數,是用4個位來表示數字0~9,一個byte表示兩個十進制數,比如01111001表示89

浮點運算使用三種不同的數據:

1)整數(Integer),又分為字,短整數(Short Integer)和長整數(Long Integer)

2)實數(Real)分單精度(Single Real)和雙精度(Double Real)

3)壓縮的二十進制數(BCD)

下面是其位數(bits)和能表示的大致範圍和

Type Length Range

-----------------------------------------------

Word Integer 16 bit -32768 to 32768

Short Integer 32 bit -2.14e9 to 2.14e9

Long Integer 64 bit -9.22e18 to 9.22e18

Single Real 32 bit 1.18e-38 to 3.40e38

Double Real 64 bit 2.23e-308 to 1.79e308

extended Real 80 bit 3.37e-1932 to 1.18e4932

Packed BCD 80 bit -1e18 to 1e18

雙精度數和擴展精度數表示範圍對一般套用來說已經足夠大了!

1)整數,以補碼形式存儲,正數的補碼是其本身,負數補碼是其絕對值的各位變反後加1,下面是實際存儲的例子:

0024 var1 dw 24

FFFE var2 dw -2

000004D2 var3 dd 1234

FFFFFF85 var4 dd -123

0000000000002694var5 dq 9876

FFFFFFFFFFFFFEBFvar6 dq -321

2)BCD數

在FPU中用80位表示正好是浮點堆暫存器的寬度,在其格式如下存儲:

Bit

79___72_71________________________________________0

符號 ---18個二十進制數--------

看下面的例子:

00000000000000012345 var1 dt 12345

80000000000000000100 var2 dt -100

3)浮點數,這個複雜點,有三種格式

單精度:_31_30________23_22___________0

符號 指數 有效數

雙精度:_63_62__________52_51__________________0

符號 指數 有效數

擴展精度數:

_79_78____________64_63___________________0

符號 指數 有效數

例子:

C377999A var1 dd -247.6

40000000 var2 dd 2.0

486F4200 var3 real4 2.45e+5

4059100000000000 var4 dq 100.25

3F543BF727136A40 var5 real8 0.00123

C377999A var1 dd -247.6

40000000 var2 dd 2.0

486F4200 var3 real4 2.45e+5

4059100000000000 var4 dq 100.25

3F543BF727136A40 var5 real8 0.001235

400487F34D6A161E4F76 var6 real10 33.9876

DD和real4都可以在asm中來定義單精度浮點數,4 bytes

DQ和real8都可以在asm中來定義雙精度浮點數,8 bytes

DT和real10都可以在asm中來定義擴展精度浮點數,10 bytes

(二)浮點部件

FPU從功能上分為兩個部分:控制單元和運算單元,控制單元主要面向CPU,而算數單元負責具體算數運算.

FPU即浮點部件包括8個通用暫存器,5個錯誤指針暫存器和三個控制暫存器.

1)8個通用暫存器每個80 bit,形成一個暫存器堆疊,所有的計算結果都保存在暫存器堆疊中,其中數據全部是80位的擴展精度格式,即使是BCD,整數,單精度和雙精度等在裝入暫存器的時候都要被FPU自動轉化為80位的擴展精度格式,注意棧頂通常表示為ST(0),然後是ST(1)...ST(i),ST(i)是相對於棧頂而言的.

和堆疊很相似,只不過寬度為80bit,映像如下:

_______________________

| ST(0) |

|_______________________|

| ST(1) |

|_______________________|

| ...... |

| ...... |

| ST(i) |

|_______________________|

2)控制暫存器,FPU有三個控制暫存器:狀態暫存器,控制暫存器和標記暫存器

狀態暫存器->SW

_M_____D________10___9____8___7_________5_________________________0__

| B | C3| TOP| C2 | C1 | C0 | ES | | PE | UE | OE | ZE | DE | IE |

|____|____|____|____|____|____|____|____|____|____|____|____|____|____|

B: 浮點部件正忙

C0-C3 指示浮點運算的結果,不同指令有不同含義

TOP 指示棧頂,通常是0

ES 以下任何位置位 (pe, ue, oe, ze, de, or ie) 則置位

PE 精度故障

UE 數字太小無法表示溢出

OE 現有精度無法表示,數字太大溢出

ZE 除0錯

DE 指示至少有一個運算元未規格化

IE 無效錯誤,指示堆疊上溢或下溢,無效運算元等

控制暫存器:

_15____________10___9____8___7_________5______________________0__

| |IC | RC | PC | | PM | UM | OM | ZM | DM | IM |

|____|____|____|___|__|_|__|__|____|____|____|____|____|____|____|

IC 無窮大控制,對486,已經無效

RC 捨入控制

00 = 朝最接近或者偶數捨入

01 = 朝負無窮大方向捨入

10 = 朝正無窮大方向捨入

11 = 超0方向截斷

PC 精度控制

00 = 單精度

01 = 保留

10 = 雙精度

11 = 擴展精度

PM~IM 禁止狀態暫存器低5位指示的錯誤.為1則禁止.

標記暫存器:

每2 bit表示一個對應堆疊暫存器的狀態,具體含義如下:

15________________________________________3_____0

|Tag7 |...................................|tag1|

|_____|___________________________________|____|

含義:

00 = 有效

01 = 零

10 = 無效或無窮大

11 = 為空

(三)浮點指令系統及MASM下浮點程式設計

事實上最重要和比較難於找到資料在(一)和(二)部分中已經介紹,下面是為了完整性的考慮,如果你是第一次接觸浮點指令,看看下面的摘要也無妨.另外本文未涉及到的一個方面是關於浮點處理異常的情況,因為涉及到保護模式和中斷、任務切換以及SEH等較多內容,我相信介紹之後只會令人更加迷惑,況且我現在似乎也無法把這幾個問題完全說清除,一般我們幾乎不需要知道這些.讓我們先來看主要內容.

關於浮點程式設計是一個大的話題,我只是提綱挈領地簡述Masm32V7(/V6)中的設計方法,因為486以上的CPU內建了浮點部件所以可以在程式里直接使用浮點指令.下面是一個小例子:

__MASMSTD equ 1

.386p

.model flat, stdcall

option casemap :none ; case sensitive

include c:\hd\hd.h

include c:\hd\mac.h

;;--------------

.DATA

num1 dq 12345

num2 dq 98765

res dd 0

.DATA?

buf db 200 dup(?)

;;-----------------------------------------

.CODE

__Start:

finit ;初始化浮點部件

fild num1 ;裝入num1

fild num2 ;裝入num2

fmul ;執行乘法

fist res ;存儲

invoke wsprintf,addr buf,CTEXT("the result is: %ld"),res

invoke StdOut,addr buf ;顯示,注意是控制台顯示,編譯用/SUBSYSTEM:CONSOLE

invoke StdIn,addr buf,20

invoke ExitProcess,0

END __Start

具體你要怎樣運用指令,那就得看你自己所要進行的操作和要執行的算法了.注意在fpu內部暫存器總是以擴展精度數來表示數值的,因此進行整數運算最後要用fist來存儲,這樣才能得到正確的結果,這些轉換是由fpu自動完成的.

浮點指令系統分為五類:數據傳送類、算術運算類、超越函式類、比較類、環境及系統控制類.

我並不想列出所有函式的參數以及用法,因為這會是勞動力的浪費.我打字用拼音的!:D)具體參考資料見文章最後,別的我就幫不上你了.

1)數據傳送類,主要包括

這類指令主要是從記憶體裝入浮點暫存器堆數據,一般目的地址總是棧頂ST(0),用調試器你可以清除的看到這一點.注意帶P結尾的操作,是在前面操作完成之後出棧,也就是原來ST(1)的內容現在成了ST(0)的內容,注意到這一點,你可以方便地設計出靈活多變的程式.

裝入:

FLD Push real onto stack

FILD Convert two's complement integer to real and push

FBLD Convert BCD to real and push to stack

存儲:

FST Store floating-point number from stack

FSTP Convert top of stack to integer

FIST

FISTP Convert top of stack to integer

FBSTP Store BCD to integer and pop stack

交換:

FXCH Exchange top two stack elements

常數裝載:

FLD1 裝入常數1.0

FLDZ 裝入常數0.0

FLDPI 裝入常數pi (=3.1415926....精度足夠,放心使用)

FLDL2E 裝入常數log(2)e

FLDL2T 裝入常數log(2)10

FLDLG2 裝入常數log(10)2

FLDLN2 裝入常數Log(e)2

我逼併不想列出所有的浮點指令的詳細格式,因為沒有必要!很多資料都有這些指令格式的介紹,浮點指令均以F開頭,LD表示Load,ILD表示整數的Load,BLD是二十進制數的Load,這樣記起來就很容易了,很多指令功能都可以根據指令一眼看出來.

2)算術運算類

加法:

FADD/FADDP Add/add and pop

FIADD Integer add

減法:

FSUB/FSUBP Subtract/subtract and pop

FSUBR/FSUBRP Subtract/subtract and pop with reversed operands

FISUB Integer subtract

FISUBR Integer subtract/subtract with reversed operands

乘法:

FMUL/FMULP Multiply/multiply and pop

FIMUL Integer multiply

除法:

FDIV/FDIVP Divide/divide and pop

FIDIV Integer divide

FDIVR/FDIVRP Divide/divide and pop with reversed operands

FIDIVR integer divide with reversed operands

其他:

FABS Calculate absolute value

FCHS Change sign

FRNDINT Round to integer

FSQRT Calculate square root

FSCALE Scale top of stack by power of 2

FXTRACT Separate exponent and mantissa

FPREM Calculate partial remainder

FPREM1 Calculate partial remainder in IEEE format

如果指令後面未帶運算元,其默認的運算元為ST(0)和ST(1),關於帶R後綴的指令是正常運算元的順序變反,比如fsub執行的是x-y,fsubr執行的就是y-x.

3)超越函式類

三角函式

FSIN Calculate sine

FCOS Calculate cosine

FSINCOS Calculate quick sine and cosine

FPTAN Calculate partial tangent

FPATAN Calculate partial arctangent

Log類

FYL2X Calculate y times log base 2 of x

FYL2XP1 Calculate y times log base 2 of (x+1)

F2XM1 Calculate (2^x)-1

4)比較類

FCOM Compare

FCOMP Compare and pop

FICOM Integer compare

FTST Integer compare and pop

FUCOM Unordered compare

FUCOMP Unordered compare and pop

FXAM Set condition code bits for value at top of stack

FSTSW Store status word

會根據結果設定,C0~C3,在上面並未就C0~C3進行具體介紹,C1是用來判斷上溢或者下溢的,C0相當於EFLAGS裡面的CF,作用也基本一致,C2相當於PF,C3相當於ZF,你可能會看到如下指令

FSTSW ax

SAHF

JZ label

為什麼如此呢,因為用如上指令將狀態字存入EFLAGS,C0正好置於CF位,C3正好置於ZF位.

5)環境及系統控制類

FLDCW Load control word

FSTCW Store control word

FSTSW Store status word

FLDENV Load environment block

FSTENV Store environment block

FSAVE Save coprocessor state

FRSTOR Restore coprocessor state

FINIT Initialize coprocessor

FCLEX Clear exception flags

FINCSTP Increment stack pointer

FDECSTP Decrement stack pointer

FFREE Mark element as free

FNOP No operation

FWAIT Wait until floating-point instruction complete

資訊連結

中國2010年實現petaflop浮點計算機

2008年9月,據一名中國的高級工程師所說,國內已經開始在龍芯(Godson)微處理器上逐步加大投資,並且希望使用該晶片在2010年建立自己的第一台千萬億次浮點級別超級計算機。

20年前,中國曾經決定不在微處理器方面進行投資。而僅僅在2001年,政府就改變了原來的觀點並且在這一領域做出了艱苦的努力。隨著而來的結果就是,中國的技術在世界領先的晶片製造商Intel、AMD以及IBM面前比較落後並苦苦追趕。

但是,中國目前已經開始針對龍芯做一個的長期的打算,並且自從2006年就開始逐步增加對龍芯的投入,中國科學院計算技術研究所的首席信息官許志偉談到。

在加利福尼亞州Palo Alto召開的Hot Chips大會上,許工程師做了演講並且稱,中國目前仍然落後於國際上晶片方面的競爭對手,但是國內在做最大努力進行追趕。

中國目前已經生產了4代龍芯處理器,最新的就是Godson 2f。去年,國家已經和ST微處理器製造商達成協定,生產並銷售該處理器晶片。而且,該晶片目前已經被40家公司所使用,主要放在機頂盒、筆記本以及其它產品上,許工程師談到。晶片的商業名稱叫做Loongson。

下個月,中國將完成新類型晶片的設計,也就是Godson 2g,它集成了更多功能在晶片上。明年,國內希望將圖形功能集成到同一個矽晶片上,作為主處理器,就像當前AMD和Intel所做的那樣。

同時,中國還在努力的製造Godson 3處理器晶片,它主要定位在伺服器端,並且將是第一個使用多核設計的Godson晶片。該晶片的版本將在2009年發布,會擁有4個通用處理器核和4個專用處理器核,後者用於處理一些類似科學計算的工作。通用目的的處理器核將在1GHz的主頻上運行,並且和Godson 2比較類似,許工程師談到。

中國希望Godson 3可以讓它在2010年創建國內的第一個高性能計算機,性能可以達到每秒千萬億次浮點運算,許工程師談到。這樣,它就會和IBM的基於Cell處理器的系統相匹配,後者是今年世界最快的超級計算機Top500中的第一位。

在被問及是否該目標現實的這一問題時,許工程師談到:“這是可能的,但是,工作將非常艱苦。”除了開發該系統,中國還需要尋找市場來銷售晶片,他表示。美國對於將中國製造業用於本國政府表示很冷淡,主要是考慮到安全方面的問題。

龍芯在PC級別的使用之所以受到了限制,主要是因為它是基於MIPS的核,和Intel以及AMD設計的x86架構完全不同。為了運行Windows,它必須使用轉換軟體來獲得x86方面的兼容性,但是,龍芯就會丟失掉本身MIPS架構的一些方面的優勢。

Godson 3增加了新的指令集,它使得x86到MIPS的轉化效率提高了10倍,許工程師談到。我們的最終目標就是接近80%的本身MIPS的性能,他談到。“當前我們可以達到40%,因此,還有很長的路要走。”

In-Stat的高級分析師Tom Halfhill在談到2010年千萬億次計算機的可能性時,表示認可。“為什麼中國要設定一個他們認為不可能達到的目標呢?如果是那樣的話,只會讓他們到時候尷尬”,他談到。

Halfhill還給出了兩年前北京在龍芯處理器方面努力的一個概況。中國當時正在設計運行在龍芯PC上的套用軟體,他談到,包括基於OpenOffice的軟體。

人口眾多的中國在微處理器市場利於起著越來越重要的作用,即使它目前只是在國內銷售晶片,他談到。

“中國目前想做的就是使用它自己的技術,這樣它的製造業就不用受制於其它國家的著作權費用和其它費用的要求”,他談到。

相關詞條

相關搜尋

熱門詞條

聯絡我們