2012-10-16 60 views
5

我知道在浮點數和整數之間進行轉換時可能發生的錯誤,但性能如何(請忽略精度問題)?浮點轉換和性能

請問性能,在一般情況下,受苦,如果我做不同的算術類型的操作數n元操作,也就是在不同的浮點類型(例如floatdouble)和浮點/整數類型組合(例如floatint)?是否存在經驗法則,如保持所有操作數是相同的類型?

P.S .:我在問,因爲我正在寫一個表達式模板庫,並想知道是否允許對包含不同算術類型值的向量執行二進制操作。

+1

是的,有不同類型之間轉換的成本。如果沒有人從我的中期回來,我可能會給出深入的答案。 – Mysticial

+0

由於浮點運算在base-2算術方面並不重要,編譯器通常會發出幫助函數(請參閱爲什麼需要libgcc?),這會嚴重影響性能。 – 2012-10-16 18:06:39

+0

問題是,你的程序不會**對不同類型的操作數進行n元操作。它根據例如C99的6.3.1。8通常的算術轉換,然後發生n元操作,通常使用相同類型的參數(有一些例外,但不涉及浮點類型)。 –

回答

5

我懷疑這個問題的答案會因目標架構而異,因爲轉換可能(但可能不會)發生在硬件中。例如,考慮下面的代碼,這導致int和浮子之間的一些互變:

int main (int argc, char** argv) 
{ 
    int precoarced = 35; 
    // precoarced gets forced to float 
    float result = 0.5 + precoarced; 

    // and now we force it back to int 
    return (int)result; 

    // I wonder what the disassembly looks like in different environments? 
} 

當我試圖用克編譯此++(我在Ubuntu,x86)的使用默認設置,並用gdb拆卸:

0x00000000004004b4 <+0>: push %rbp 
    0x00000000004004b5 <+1>: mov %rsp,%rbp 
    0x00000000004004b8 <+4>: mov %edi,-0x14(%rbp) 
    0x00000000004004bb <+7>: mov %rsi,-0x20(%rbp) 
    0x00000000004004bf <+11>: movl $0x23,-0x8(%rbp) 
    0x00000000004004c6 <+18>: cvtsi2sdl -0x8(%rbp),%xmm0 
    0x00000000004004cb <+23>: movsd 0x10d(%rip),%xmm1  # 0x4005e0 
    0x00000000004004d3 <+31>: addsd %xmm1,%xmm0 
    0x00000000004004d7 <+35>: unpcklpd %xmm0,%xmm0 
    0x00000000004004db <+39>: cvtpd2ps %xmm0,%xmm0 
    0x00000000004004df <+43>: movss %xmm0,-0x4(%rbp) 
    0x00000000004004e4 <+48>: movss -0x4(%rbp),%xmm0 
    0x00000000004004e9 <+53>: cvttss2si %xmm0,%eax 
    0x00000000004004ed <+57>: pop %rbp 
    0x00000000004004ee <+58>: retq 

請注意以cvt爲前綴的助記符的說明。這些是轉換說明。所以在這種情況下,轉換是通過少量指令在硬件中進行的。所以,根據這些指令花費多少個週期,它可能相當快。但是,不同的架構(或不同的編譯器)可以改變這個故事。

編輯:在有趣的一面,有一個額外的轉換,因爲我意外地指定0.5而不是0.5f。這就是爲什麼cvtpd2ps運行在那裏。編程:x86已經有很長時間(從80年代起)FP支持,所以針對x86的C++編譯器通常會使用硬件(除非編譯器嚴重落後於時代)。感謝熱舔指出這一點。

+0

編譯器本來可以在編譯時做足夠的智能轉換,但它不是...... – user1095108

+0

@ user1095108的確。儘管這並不令我吃驚,我是在默認設置,一個。像這樣的字面上的浮點數不是一個典型的「實際」用例。此外,編譯器實現者可能會害怕任何與浮點相關的優化,因爲他們必須非常小心。例如,你可能認爲加法的交換性(A + B = B + A)是浮動加法優化的有效基礎,但由於fp不精確,它不是;它可能會破壞一些FP算法的精度。 – WeirdlyCheezy

+0

請注意,自原始8087協處理器以來,轉換指令一直以某種形式存在。因此幾乎所有具有浮點硬件的系統都將具有硬件轉換。 –

2

在大多數機器上,float和int格式之間的轉換速度相當快,並且得到了浮點硬件功能的支持。

但是,當然,如果僅用於文檔目的,則應該努力以「正確」格式表示文字。對於文檔而言,使用明確的轉換也不會造成傷害。

2

通常有一些性能損失,雖然與其他事情相比可以忽略不計。這是由於整數和浮點寄存器之間的數據遷移以及其他可能的ABI問題。

這些問題的答案總是相同的。懷疑? 它的基準。性能在理論上難以預測。

+2

別忘了,我已經問過關於經驗法則。我知道板凳法則。 – user1095108