échantillon d’apprentissage d’indices de compilation probables () et improbables ()

Comment puis-je démontrer aux étudiants que des astuces du compilateur likely et unlikely ( __builtin_expect ) sont __builtin_expect ?

Pouvez-vous écrire un exemple de code, qui sera plusieurs fois plus rapide avec ces astuces, en comparant le code sans astuces.

Voici celui que j’utilise, une implémentation vraiment inefficace des nombres de Fibonacci:

 #include  #include  #include  #include  #define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0) uint64_t fib(uint64_t n) { if (opt(n == 0 || n == 1)) { return n; } else { return fib(n - 2) + fib(n - 1); } } int main(int argc, char **argv) { int i, max = 45; clock_t tm; if (argc == 2) { max = atoi(argv[1]); assert(max > 0); } else { assert(argc == 1); } tm = -clock(); for (i = 0; i <= max; ++i) printf("fib(%d) = %" PRIu64 "\n", i, fib(i)); tm += clock(); printf("Time elapsed: %.3fs\n", (double)tm / CLOCKS_PER_SEC); return 0; } 

Pour démontrer, en utilisant GCC:

 ~% gcc -O2 -Dopt= -o test-nrm test.c ~% ./test-nrm ... fib(45) = 1134903170 Time elapsed: 34.290s ~% gcc -O2 -Dopt=unlikely -o test-opt test.c ~% ./test-opt ... fib(45) = 1134903170 Time elapsed: 33.530s 

Quelques centaines de millisecondes de moins. Ce gain est dû à la prédiction de twig assistée par le programmeur.

Mais maintenant, pour ce que le programmeur devrait vraiment faire à la place:

 ~% gcc -O2 -Dopt= -fprofile-generate -o test.prof test.c ~% ./test.prof ... fib(45) = 1134903170 Time elapsed: 77.530s /this run is slowed down by profile generation. ~% gcc -O2 -Dopt= -fprofile-use -o test.good test.c ~% ./test.good fib(45) = 1134903170 Time elapsed: 17.760s 

Avec le profilage d'exécution à l'aide du compilateur, nous avons réussi à réduire le nombre initial de 34.290 à 17.760. Bien mieux qu'avec la prédiction de twig assistée par programmeur!