2016-04-09 7 views
-2

Hallo Ich bin auf dem Weg, eine Funktion zu optimieren, die mir das "nächste" von etwas geben soll. Bisher, was ich habe istSchleife in Arithmetik um die Funktion zu beschleunigen

int fun(int a){ 
    const int k = ...; 
    for(;test_value(a++) != k;); 
    return a; 
    } 

Das war eine schnelle und schmutzige Art und Weise zu testen, dass mein Algorithmus tatsächlich gearbeitet, aber jetzt im Nachhinein bin ich besorgt, dass die Schleife einen Test macht bei jeder Iteration zur Verzweigung (wenn nicht der Compiler ist sehr gut im Umgang hinter den Kulissen?). Nehmen wir an, die Wahrscheinlichkeit, dass ein a den Test erfüllt, beträgt höchstens 1/5 und der schlechteste Fall einer von einer Million, aber dieser Testwert ist nur ein oder zwei Taktzyklen. Gibt es einen systematischen Weg, wie ich meinem Compiler helfen kann, alle Zweige mit Arithmetik zu handeln, um die CPU-Pipelines besser zu nutzen?

+0

Sie denken nicht, dass das nur davon abhängen würde, was "test_value" ist? –

+0

Es ist eine Funktion, die in wenigen Zyklen ohne Verzweigungsgefahr ausgeführt werden sollte. Vermutlich existiert sie als SSE-Befehl auf modernen Maschinen. – mathreadler

Antwort

1

Sie könnten „abrollen“ Ihre Schleife ein bisschen, so etwas wie:

int nomatch = 1; 
while(nomatch){ 
    nomatch = (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
} 

Dies würde weniger Iterationen, und Kurzschlüsse würde verhindern, dass die Bewertungen der test_value einmal eine Übereinstimmung gefunden wurde, ergeben.

Wie bei Ihrem ursprünglichen Code wird davon ausgegangen, dass zu einem bestimmten Zeitpunkt eine Übereinstimmung gefunden wird.

+0

Großartige Idee, hat mir geholfen, eine Lösung zu finden. – mathreadler