c / expert
Snippet
Zweiglose bedingte Logik zur CPU-Pipeline-Optimierung
Fehlprognosen bei Verzweigungen in leistungskritischen Schleifen führen zu schwerwiegenden CPU-Pipeline-Flushes. Durch die Nutzung arithmetischer Bitverschiebungen zur Konstruktion von Vorzeichenmasken können bedingte Auswahlen wie Maximum- oder Absolutwertberechnungen komplett ohne Verzweigungsanweisungen (if/else) durchgeführt werden, was zu vorhersehbarem Durchsatz auf modernen Out-of-Order-Prozessoren führt.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>#include <stdint.h>int32_t branchless_max(int32_t a, int32_t b) {int32_t diff = a - b;int32_t mask = diff >> 31;return a - (diff & mask);}int32_t branchless_abs(int32_t x) {int32_t mask = x >> 31;return (x + mask) ^ mask;}int main(void) {printf("Max(-5, 10) = %d\n", branchless_max(-5, 10));printf("Abs(-42) = %d\n", branchless_abs(-42));return 0;}
Erklärung
1
int32_t mask = diff >> 31;
Erzeugt durch arithmetischen Rechtsschub eine Bitmaske aus lauter 1en (0xFFFFFFFF), wenn diff negativ ist, sonst lauter 0en.
2
return a - (diff & mask);
Verwendet bitweises UND mit der Maske, um die Differenz ohne Sprungbefehle bedingt zu subtrahieren.
3
int32_t mask = x >> 31;
Extrahiert das Vorzeichenbit erweitert über alle 32 Bits (-1 für negative Zahlen, 0 für positive).
4
return (x + mask) ^ mask;
Berechnet die Zweierkomplement-Negation zweiglos über die mathematische Identität.