Ich habe das folgende C ++ - Code-Snippet (der C ++ - Teil ist die Profiler-Klasse, die hier weggelassen wird), kompiliert mit VS2010 (64-Bit-Intel-Maschine). Der Code multipliziert einfach ein Array von Schwimmern ( arr2
) mit einem Skalar und setzt das Ergebnis in ein anderes Array ( arr1
):
Der Lese-aus-Datei-Teil und die Profilierung (d. h. Laufzeitmessung) sind hier der Einfachheit halber weggelassen.
Wenn arr2
auf Zufallszahlen im Bereich [0 1] initialisiert wird, läuft der Code etwa 10 mal schneller im Vergleich zu einem Fall, in dem arr2
auf ein Sparse-Array initialisiert wird, in dem etwa 2/3 des Werte sind Nullen. Ich habe mit den Compiler-Optionen /fp
und /O
gespielt, was die Laufzeit ein wenig verändert hat, aber das Verhältnis von 1:10 wurde ungefähr eingehalten.
BEARBEITEN
Der vollständige Code ist hier: Ссылка , die Befehlszeile zum Kompilieren befindet sich in einem Kommentar in test.cpp
.
Die Datendateien sind hier:
Wahrscheinlich liegt das daran, dass Ihre "schnellen" Daten nur aus normalen Gleitkommazahlen bestehen, aber Ihre "langsamen" Daten viele demormierte Zahlen enthalten.
Wie bei Ihrer zweiten Frage können Sie versuchen, die Geschwindigkeit zu verbessern (und alle denormierten Zahlen als exakte Nullen zu behandeln):
%Vor%Ich kann mir zwei Gründe dafür vorstellen.
Erstens kann der Verzweigungsprädiktor falsche Entscheidungen treffen. Dies ist eine mögliche Ursache für Leistungslücken, die durch Datenänderungen ohne Codeänderungen verursacht werden. In diesem Fall scheint es jedoch sehr unwahrscheinlich.
Der zweite mögliche Grund ist, dass Ihre "meist Nullen" -Daten nicht wirklich aus Nullen bestehen, sondern eher aus Nullen bestehen, oder dass Sie arr1
in dem Bereich von fast Null behalten. Siehe diesen Wikipedia-Link .
Es ist nicht verwunderlich, dass die Daten von I.Bin länger verarbeitet werden müssen: Sie haben viele Zahlen wie '1.401e-045 # DEN' oder '2.214e-043 # DEN', wobei #DEN bedeutet, dass die Zahl nicht möglich ist auf die Standard-Float-Genauigkeit normalisiert werden. Vorausgesetzt, dass Sie es mit 6.6e-14 multiplizieren werden Sie definitiv Unterlauf Ausnahmen haben, die Berechnungen erheblich verlangsamt.
Tags und Links c c++ visual-studio-2010 performance