2013-04-22 11 views
7

Ich analysierte das folgende Programm mit Matlab profile. Double und Uint64 sind 64-Bit-Variablen. Warum vergleicht man zwei Double viel schneller als zwei Uint64 zu vergleichen? Werden sie nicht beide bitweise verglichen?Warum ist das Vergleichen doppelt schneller als 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; 

Dies ist die Messung des Profils:

profile screenshot

Dies ist, was TicToc Maßnahmen:

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

Der Effekt verschwindet, wenn uint8..uint32 oder int8..int32 sind verwendet anstelle von 64-Bit-Datentypen.

+0

Ich weiß nicht über Matlab, aber häufig Doppel werden verglichen, um zu sehen, ob sie innerhalb einer Entfernung Epsilon voneinander sind. Das macht den Vergleich mühsamer. –

+0

@EricJ. Nicht der Fall in Matlab, fürchte ich. Auch etwas verwirrt von dieser Frage. – jazzbassrob

+1

von Ihren Ergebnissen sieht es aus wie Vergleichen Doppel ist viel schneller als Uint64 – Jonas

Antwort

6

Es ist wahrscheinlich eine Kombination des Matlab-Interpreters und der zugrunde liegenden CPU, die 64-Bit-Int-Typen sowie die anderen nicht unterstützt.

Matlab begünstigt double über int Operationen. Die meisten Werte werden in double Typen gespeichert, auch wenn sie ganzzahlige Werte darstellen. Die Operationen double und int== erfordern unterschiedliche Codepfade, und MathWorks hat viel mehr Aufmerksamkeit auf die Optimierung und Optimierung des Codes für double als für Ints, insbesondere int64, verwendet. Tatsächlich unterstützten ältere Versionen von Matlab keine arithmetischen Operationen auf int64 überhaupt. (Und IIRC, es unterstützt immer noch nicht gemischt-ganzzahlige Mathematik.) Wenn Sie int64 Mathe tun, verwenden Sie weniger ausgereiften, weniger abgestimmten Code und das gleiche gilt für ==. Int-Typen haben in Matlab keine Priorität. Die Anwesenheit des int64 kann sogar den JIT stören, der diesen Code optimiert, aber das ist nur eine Vermutung.

Aber es könnte auch einen zugrunde liegenden Hardware-Grund dafür geben. Hier ist eine Hypothese: Wenn Sie auf 32-Bit-x86 sind, arbeiten Sie mit 32-Bit-Allzweck-Registern. Das bedeutet, dass die kleineren Int-Typen in ein Register passen und mit schnellen Anweisungen verglichen werden können, aber die 64-Bit-int-Werte passen nicht in ein Register und erfordern teurere Befehlssequenzen zum Vergleichen. Die double s, obwohl sie 64 Bits breit sind, passen in die breiten Gleitkommaregister der Gleitkommaeinheit x87 und können in Hardware unter Verwendung schneller Gleitkommavergleichsanweisungen verglichen werden. Dies bedeutet, dass [u]int64 s die einzigen sind, die nicht mit schnellen Ein-Register-Operationen mit einem Befehl verglichen werden können.

Wenn dies der Fall ist, wenn Sie den gleichen Code auf 64-Bit x86-64 (in 64-Bit-Matlab) ausführen, kann der Unterschied verschwinden, weil Sie dann 64-Bit breiten Allzweckregistern haben. Es kann aber auch nicht sein, dass der Code des Matlab-Interpreters nicht kompiliert wird, um ihn auszunutzen.

+1

+1, scheint die Hardware ist hier am meisten schuld. Ich habe auf R2010 auf einer APU getestet (die schnelle doppelte Genauigkeit arithmetische, aber schreckliche Integer-Mathematik hat), und das Problem war identisch für 'single' und' (u) int8,16,33'. Dann testete ich auf 64-Bit-CPU, 64-Bit R2012 Matlab (die 64-Bit breiten Allzweckregister hat), und alle Probleme verschwanden. –

+0

@RodyOldenhuis: Ooh, erzähl uns mehr über diese APU, auf der du aktiv bist. Das klingt interessant und ist neu für mich. –

+1

Siehe [diese Liste] (http://en.wikipedia.org/wiki/List_of_AMD_Accelerated_Processing_Unit_MicroProcessors); Ich habe einen AMD A6-3650, vor allem dank der Fetische unseres IT-Managers;) Bisher war es jedoch nicht sehr gut für mich; Es gibt viele seltsame Nebenwirkungen (wie die, die ich bereits erwähnt habe). Für die leistungsfähigen wissenschaftlichen Berechnungen/Simulationen, die ich mache/entwerfe, bevorzuge ich CPU + GPU für den Moment :) Zugegeben, meine APU ist ziemlich neu und nicht wirklich die beste da draußen, also hoffe ich, dass sich dies in Zukunft ändern wird (weil ich glaube, dass sie viel Potenzial haben) –

Verwandte Themen