proceso ejecutar compilar compilacion como c gcc optimization likely-unlikely

ejecutar - muestra de aprendizaje de probables() y poco probables() sugerencias del compilador



compilar y ejecutar c en windows (1)

Aquí está el que uso, una implementación realmente ineficiente de los números de Fibonacci:

#include <stdio.h> #include <inttypes.h> #include <time.h> #include <assert.h> #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; }

Para demostrar, usando 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

Algunos cientos de milisegundos menos. Esta ganancia se debe a la predicción de bifurcación asistida por el programador.

Pero ahora, por lo que el programador realmente debería estar haciendo en su lugar:

~% 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

Con el perfil de tiempo de ejecución ayudado por el compilador, logramos reducir de los 34.290 segundos originales a los 17.760 segundos. ¡Mucho mejor que con la predicción de sucursales asistida por programadores!

¿Cómo puedo demostrar a los estudiantes la usabilidad de sugerencias de compilador likely e unlikely ( __builtin_expect )?

¿Puedes escribir un código de muestra, que será varias veces más rápido con estas sugerencias comparando el código sin pistas?