2013-04-22 96 views
7

我使用Matlab的profile分析了以下程序。 double和uint64都是64位變量。爲什麼比較兩個double要比比較兩個uint64快得多?它們都不是按比例對比的嗎?爲什麼比uint64快兩倍?

big = 1000000; 

a = uint64(randi(100,big,1)); 
b = uint64(randi(100,big,1)); 
c = uint64(zeros(big,1)); 
tic; 
for i=1:big 
    if a(i) == b(i) 
     c(i) = c(i) + 1; 
    end 
end 
toc; 

a = randi(100,big,1); 
b = randi(100,big,1); 
c = zeros(big,1); 
tic; 
for i=1:big 
    if a(i) == b(i) 
     c(i) = c(i) + 1; 
    end 
end 
toc; 

這是曲線的測量:

profile screenshot

這是tictoc措施:

Elapsed time is 6.259040 seconds. 
Elapsed time is 0.015387 seconds. 

效果消失時uint8..uint32或int8..int32是而不是64位數據類型。

+0

我不知道Matlab的,但比較,看它們是否彼此的距離小量內頻繁一倍。這使得比較更加繁瑣。 – 2013-04-22 23:04:49

+0

@EricJ。恐怕不是這種情況。這個問題也有點困惑。 – jazzbassrob 2013-04-22 23:05:55

+1

從你的結果看來,比較雙打比uint64快得多 – Jonas 2013-04-22 23:09:07

回答

6

這也許是Matlab的解釋,不支持64位int類型以及其他潛在的CPU的組合。

Matlab的有利於doubleint操作。大多數值都存儲在double類型中,即使它們表示整數值。該doubleint==操作將採取不同的代碼路徑,以及MathWorks公司將會把時間用在調整了很多更多的關注和優化代碼double比整數,特別是int64。事實上,老版本的Matlab完全不支持算術運算。 (和IIRC,它仍然不支持混合整數數學)。當你做int64數學,你使用不太成熟,少調代碼,同樣可以適用於==。在Matlab中,Int類型不是優先級。 int64的存在甚至可能會干擾優化該代碼的JIT,但這只是一種猜測。

但有可能是一個底層硬件原因了。這裏有一個假設:如果你在32位x86上,那麼你正在使用32位通用(整數)寄存器。這意味着較小的整數類型可以放入一個寄存器,並使用快速指令進行比較,但64位整型值不適合寄存器,可能需要更多昂貴的指令序列進行比較。 double即使是64位寬,也可以裝入x87浮點單元的寬浮點寄存器中,並且可以使用快速浮點比較指令在硬件中進行比較。這意味着[u]int64是唯一不能使用快速單寄存器,單指令操作進行比較的。

如果是這種情況,如果您在64位x86-64(64位Matlab)上運行相同的代碼,則差異可能會消失,因爲您隨後具有64位寬的通用寄存器。但是,如果Matlab解釋器的代碼沒有被編譯來利用它,它可能不會。

+1

+1,看起來這裏的硬件主要是錯誤的。我在R2010上測試了一個APU(它具有快速雙精度算術,但可怕的整數數學),並且這個問題對於'single'和'(u)int8,16,33'是一樣的。然後我測試了64位CPU,64位R2012 Matlab(它有64位寬的通用寄存器),所有問題都消失了。 – 2013-04-23 08:16:08

+0

@RodyOldenhuis:哦,告訴我們關於你正在運行的這個APU的更多信息。這聽起來很有趣,對我來說是新的。 – 2013-04-24 20:09:37

+1

請參閱[此列表](http://en.wikipedia.org/wiki/List_of_AMD_Accelerated_Processing_Unit_microprocessors);我有一臺AMD A6-3650,主要得益於我們的IT經理的迷戀;)但是,迄今爲止,這對我來說並不是很好;有很多奇怪的副作用(就像我之前提到的那樣)。對於我正在做/設計的高性能科學計算/模擬,我現在更喜歡CPU + GPU)。當然,我的APU相當新穎,並不是那裏最好的,所以我希望這將在未來改變(因爲我確信他們有很大的潛力) – 2013-04-25 05:39:20

相關問題