466 Stimmen

Wie funktionieren die wahrscheinlich/unwahrscheinlich-Makros im Linux-Kernel und was ist ihr Nutzen?

Ich habe mich durch einige Teile des Linux-Kernels gewühlt und dabei Aufrufe wie diesen gefunden:

if (unlikely(fd < 0))
{
    /* Do something */
}

o

if (likely(!err))
{
    /* Do something */
}

Ich habe die Definition von ihnen gefunden:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

Ich weiß, dass sie der Optimierung dienen, aber wie funktionieren sie? Und wie viel Leistungs-/Größenverlust kann man von ihrer Verwendung erwarten? Und ist es die Mühe wert (und verlieren die Portabilität wahrscheinlich) zumindest in Engpass-Code (in Userspace, natürlich).

5voto

Andrew Edgecombe Punkte 37795

(allgemeiner Kommentar - andere Antworten behandeln die Details)

Es gibt keinen Grund, warum man durch die Verwendung dieser Geräte seine Mobilität verlieren sollte.

Sie haben immer die Möglichkeit, einen einfachen Null-Effekt "inline" oder ein Makro zu erstellen, mit dem Sie auf anderen Plattformen mit anderen Compilern kompilieren können.

Wenn Sie auf anderen Plattformen unterwegs sind, können Sie die Vorteile der Optimierung nicht nutzen.

4voto

Finaldie Punkte 51

In vielen Linux-Versionen finden Sie complier.h in /usr/linux/, Sie können es für die Verwendung einfach einbinden. Und eine andere Meinung, unlikely() ist nützlicher als likely(), weil

if ( likely( ... ) ) {
     doSomething();
}

es kann auch in vielen Compilern optimiert werden.

Übrigens, wenn Sie das Verhalten des Codes im Detail beobachten wollen, können Sie einfach wie folgt vorgehen:

gcc -c test.c objdump -d test.o > obj.s

Öffnen Sie dann obj.s, und Sie finden die Antwort.

3voto

artless noise Punkte 19566

Wie in dem Kommentar von Cody Dies hat nichts mit Linux zu tun, sondern ist ein Hinweis für den Compiler. Was passiert, hängt von der Architektur und der Compiler-Version ab.

Diese spezielle Funktion von Linux wird in Treibern etwas missbraucht. Wie osgx weist darauf hin in Semantik des Attributs hot jede hot o cold Funktion, die in einem Block aufgerufen wird, kann automatisch darauf hinweisen, dass die Bedingung wahrscheinlich ist oder nicht. Zum Beispiel, dump_stack() markiert ist cold dies ist also überflüssig,

 if(unlikely(err)) {
     printk("Driver error found. %d\n", err);
     dump_stack();
 }

Künftige Versionen von gcc kann eine Funktion auf der Grundlage dieser Hinweise selektiv einbinden. Es wurden auch Vorschläge gemacht, dass es nicht boolean sondern eine Partitur wie in höchstwahrscheinlich , usw. Im Allgemeinen sollte ein alternativer Mechanismus bevorzugt werden, wie cold . Es gibt keinen Grund, ihn an irgendeiner Stelle außer in Hotpaths zu verwenden. Was ein Compiler auf einer Architektur tut, kann auf einer anderen völlig anders sein.

1voto

Serafina Brocious Punkte 29935

Sie sind Hinweise für den Compiler, um die Hint-Präfixe auf Verzweigungen zu erzeugen. Auf x86/x64 benötigen sie ein Byte, so dass man höchstens ein Byte mehr für jede Verzweigung erhält. Was die Leistung angeht, so hängt das ganz von der Anwendung ab - in den meisten Fällen ignoriert der Branch Predictor des Prozessors sie heutzutage.

Edit: Ich habe eine Stelle vergessen, bei der sie wirklich helfen können. Es kann dem Compiler erlauben, den Kontrollflussgraphen neu zu ordnen, um die Anzahl der Verzweigungen für den "wahrscheinlichen" Pfad zu reduzieren. Dies kann in Schleifen, in denen mehrere Ausgänge geprüft werden, eine deutliche Verbesserung bewirken.

1voto

dcgibbons Punkte 376

Dies sind GCC-Funktionen, mit denen der Programmierer dem Compiler einen Hinweis auf die wahrscheinlichste Verzweigungsbedingung in einem bestimmten Ausdruck geben kann. Dies ermöglicht dem Compiler, die Verzweigungsanweisungen so zu erstellen, dass der häufigste Fall die geringste Anzahl von Anweisungen zur Ausführung benötigt.

Wie die Verzweigungsbefehle aufgebaut sind, hängt von der Prozessorarchitektur ab.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X