___ answer13406266 ___
Jeder freie Code für die Verzweigung muss eine Berechnung von %code% enthalten, um den "normalen" Fall abzudecken.
Bevor Sie also versuchen, diesen zweigfreien Code zu entwickeln, messen Sie die Geschwindigkeit von %code% allein. Sofern es nicht wesentlich schneller ist als der Code, den Sie haben, gibt es hier nichts Wesentliches. Und ich vermute, dass es nicht sein wird.
___ qstntxt ___
Ich habe diese C-Funktion:
%Vor%
Ich rufe in einer engen Schleife an und möchte den Zweig loswerden, um zu sehen, ob er die Leistung verbessert.
Ich kann das nicht verwenden:
%Vor%
weil es %code% zurückgibt, wenn %code% (was ungefähr 25% der Zeit entspricht).
Gibt es eine andere Möglichkeit, es zu implementieren, so dass es %code% zurückgibt, wenn %code% , aber immer noch die Verzweigung loswerden?
(Ich bin weniger besorgt über negative Eingaben, weil diese Fehler sind, während Nullen nicht sind.)
___ answer13403444 ___
Compiler-Erweiterungen können hier helfen. In GCC würden Sie dies tun:
%Vor%
GCC generiert dann Maschinencode, der den Zweig %code% bevorzugt.
Wenn Sie negative Zahlen nicht interessieren, können Sie stattdessen %code% als unwahrscheinlichen Zweig behandeln:
%Vor%
Wenn Sie nicht in GCC sind, sollten Sie die Dokumentation Ihres Compilers überprüfen und sehen, ob es eine analoge Funktion bietet.
Beachten Sie, dass es immer noch nicht zweigfrei ist. Es ist nur so, dass der wahrscheinliche Zweig weniger Zeit benötigt.
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt.
___ tag123optimierung ___ Optimierung ist der Akt der Verbesserung einer Methode oder eines Designs. In der Programmierung nimmt die Optimierung normalerweise die Form an, die Geschwindigkeit eines Algorithmus zu erhöhen oder die benötigten Ressourcen zu reduzieren. Eine weitere Bedeutung der Optimierung sind numerische Optimierungsalgorithmen.
___ tag123logarithmus ___ Der Logarithmus einer Zahl ist der Exponent, um den ein anderer fester Wert, die Basis, erhöht werden muss, um diese Zahl zu erzeugen.
___ tag123nan ___ NaN ist eine Abkürzung für "Not a Number". NaN ist manchmal nicht gleich selbst.
___ tag123branchprediction ___ In der Computerarchitektur ist ein Verzweigungsvorhersager eine digitale Schaltung, die versucht zu erraten, auf welche Weise eine Verzweigung (z. B. eine Wenn-Dann-Else-Struktur) gehen wird, bevor dies sicher bekannt ist. Der Zweck des Verzweigungsprädiktors besteht darin, den Fluss in der Befehlspipeline zu verbessern. Verzweigungsvorhersager spielen eine kritische Rolle beim Erreichen einer hohen effektiven Leistungsfähigkeit in vielen modernen Pipelinemikroprozessorarchitekturen, wie zum Beispiel x86.
___ qstnhdr ___ Verzweigungsfreie Implementierung von f (x): = wenn x == 0 dann 0 else (x * log (x))
___ answer13403711 ___
Beachten Sie zuerst, dass log (1) = 0 ist. Dann können Sie das Problem als x * log (y) schreiben, wobei y = 1, wenn x & lt; = 0, und ansonsten gleich x ist; Wenn y = 1, dann spielt x keine Rolle, weil log (y) = 0 ist.
Etwas wie y = (x & gt; 0) * x + (x & lt; = 0) wird dies tun, und dann:
%Vor%
Es hängt nur davon ab, ob log (1) und vier ganzzahlige Ops schlechter sind als eine Verzweigung.
___