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?
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-goto
S 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.
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:
- zrób Jeśli (X) Jeśli X jest bardziej prawdopodobne niż !X
- spróbuj ocenić A jak najwcześniej, tak aby procesor mógł dynmicznie zoptymalizować rurociąg.
:
evaluate(A)
do more stuff
if (A)
...
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.)
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.
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ę.
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