2010-04-29 23 views
10

¿Cómo puedo demostrar a los estudiantes la usabilidad de likely y unlikely consejos del compilador (__builtin_expect)?muestra de aprendizaje de probables() y poco probables() consejos del compilador

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

+2

http://kerneltrap.org/node/4705 –

+0

@ T.J. Crowder, sí. pero quiero una muestra de programa en la que los estudiantes puedan SENTIR la diferencia, no leerla en ensamblador. – osgx

+1

@osgx: No obtendrá esa muestra, porque no hay diferencia para sentirse. Esta es la peor y más fea de las micro-optimizaciones inútiles. –

Respuesta

22

Aquí es el que yo uso, una aplicación muy 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 

A unos 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 debe realmente 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 perfiles compilador de ejecución asistida, hemos conseguido reducir de los 34.290s originales a 17.760s. ¡Mucho mejor que con la predicción de sucursales asistida por programadores!

+1

uso de perfil es la buena opción, pero tengo que demostrar 'likely' y' poco probable' – osgx

+19

aah, tm = -clock(); tm + = reloj(); es hermoso, no lo he visto antes, ¡gracias! –

+0

Creo que lo que esto demuestra es que "probable" y "poco probable" no son muy útiles. También quizás esta es una implementación realmente mala de 'fib()' ... –

Cuestiones relacionadas