Przenośne wskazówki do przewidywania gałęzi

Czy Jest jakiś przenośny sposób robienia podpowiedzi do przewidywania gałęzi? Rozważ następujący przykład:

  if (unlikely_condition) {
    /* ..A.. */
  } else {
    /* ..B.. */
  }

Czy to coś innego niż robienie:

  if (!unlikely_condition) {
    /* ..B.. */
  } else {
    /* ..A.. */
  }

Czy jest jedynym sposobem na użycie podpowiedzi specyficznych dla kompilatora? (np. _ _ builtin _ expect na GCC)

Czy Kompilatory będą traktować Warunki if inaczej w zależności od kolejności warunków?

Author: Mysticial, 2010-09-13

5 answers

Kanonicznym sposobem przewidywania gałęzi statycznej jest to, że if jest przewidywana nie-rozgałęziona (tzn. każda if klauzula jest wykonywana, a nie else), a pętle i Wstecz-gotoS są brane. Więc nie umieszczaj wspólnego przypadku w else, jeśli oczekujesz, że przewidywanie statyczne będzie znaczące. Poruszanie się po pętli untaken nie jest takie łatwe; nigdy nie próbowałem, ale przypuszczam, że umieszczenie jej klauzuli an else powinno działać dość przenośnie.

Wiele kompilatorów obsługuje jakąś formę #pragma unroll, ale nadal będzie to konieczne aby zabezpieczyć go jakimś rodzajem #if, aby chronić inne Kompilatory.

Wskazówki dotyczące przewidywania gałęzi mogą teoretycznie wyrazić pełny opis przekształcenia wykresu kontroli przepływu programu i uporządkowania podstawowych bloków w pamięci wykonywalnej ... więc istnieje wiele rzeczy do wyrażenia, a większość z nich nie będzie zbyt przenośna.

Zgodnie z zaleceniami GNU w dokumentacji __builtin_expect, optymalizacja prowadzona przez profile jest lepsza od podpowiedzi i przy mniejszym wysiłku.

 25
Author: Potatoswatter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-13 17:44:52

W większości przypadków następujący kod

if (a)
{
   ...
}
else
{
    ...
}

Jest rzeczywiście

evaluate(A)

if (!A)
{
   jmp p1
}

... code A

   jmp p2

p1:

... code !A

p2:

Zauważ, że jeśli A jest prawdą, "kod a" jest już w potoku. Procesor zobaczy przed sobą polecenie" jmp p2 " i załaduje kod p2 do potoku.

Jeśli a jest false, "Kod !"Może nie znajdować się w pipleline, dlatego może być wolniejszy.

Wnioski:

  1. zrób Jeśli (X) Jeśli X jest bardziej prawdopodobne niż !X
  2. spróbuj ocenić A jak najwcześniej, tak aby procesor mógł dynmicznie zoptymalizować rurociąg.

:

evaluate(A)

do more stuff

if (A)
   ...
 16
Author: Lior Kogan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-01 09:36:05

Optymalizacja jest z natury rzeczą kompilatora, więc musisz użyć funkcji kompilatora, aby mu pomóc. Sam język nie dba o optymalizacje.

Więc najlepsze co możesz zrobić Bez rozszerzeń specyficznych dla kompilatorów, to zorganizować swój kod w taki sposób, aby Kompilatory "zrobiły właściwą rzecz" bez pomocy. Ale jeśli chcesz się upewnić, stuknij w Rozszerzenia kompilatora. (Możesz spróbować abstrakcji ich za preprocesorem, więc Twój kod pozostaje przenośny.)

 7
Author: GManNickG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-13 17:38:14

Bądź konsekwentny w tym, co robisz. Lubię używać

if (!(someExpression))

Ale kompilator powinien traktować to jednakowo.

 1
Author: JonH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-13 17:37:47

Co jest złego w sprawdzaniu konkretnego kompilatora przez {[0] } i ukrywaniu tych rzeczy za niestandardowym makrem? Możesz #define to rozszerzyć do zwykłego wyrażenia w przypadkach, gdy nie masz kompilatora, który obsługuje te wskazówki optymalizacji. Ostatnio zrobiłem coś podobnego z jawnymi prefetches cache, które GCC obsługuje poprzez wewnętrzną funkcję.

 1
Author: sellibitze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-13 18:06:25