2010-12-06 12 views
55

Además, ¿alguien puede indicarme un buen tutorial sobre el tema? No puedo encontrar ninguno.¿Cómo utilizar las optimizaciones guiadas por perfil en g ++?

+0

un buen tutorial sobre el tema de qué? ¿Un interruptor de g ++ que no sabes para qué usar? – jalf

+0

Gracias por el -1. Intenté jugar con '-fprofile-arcs' hace algún tiempo. Y creó algunos archivos que entendí eran perfiles de ramas tomadas y así sucesivamente ... Pero me topé con '-fprofile-use' y' -fprofile-generate' hoy, así que pensé en hacer esta pregunta. Voy a editar mi pregunta. – nakiya

+6

¿Por qué se baja la votación y se vota para cerrar? Es una pregunta perfectamente válida. – nico

Respuesta

44

-fprofile-generate instrumentará la aplicación con código de perfil. La aplicación, mientras se está ejecutando, registrará ciertos eventos que podrían mejorar el rendimiento si este patrón de uso se conociera en tiempo de compilación. Las ramas, la posibilidad de alineación, etc., pueden registrarse, pero no estoy seguro de cómo GCC implementa esto.

Después de que el programa finalice, volcará todos estos datos en archivos * .gcda, que son esencialmente datos de registro para una ejecución de prueba. Después de reconstruir la aplicación con el indicador de uso de perfil, GCC tendrá en cuenta los datos de registro * .gcda al realizar sus optimizaciones, lo que generalmente aumenta el rendimiento de manera significativa. Por supuesto, esto depende de muchos factores.

+4

Por cierto, si su programa tiene varios subprocesos, entonces los datos de perfil generados probablemente serán inconsistentes y es probable que obtenga errores cuando intente usarlos. Entonces, probablemente también deba pasar '-fprofile-correction' para la segunda invocación de GCC. –

+0

No puedo deshacerme del error. El comando que estoy usando es' gcc hello_world.c -o demo_fdo -fprofile- use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch' aún obteniendo el error de falta de coincidencia de cobertura. ¿Qué estoy haciendo mal? –

1

El truco es configurar los archivos make.

Definitivamente necesita directorios de salida separados para los archivos de objeto. Yo recomendaría nombrarlos "perfil" y "lanzamiento". Es posible que tenga que copiar los archivos * .gcda que resultan del perfil ejecutado para que GCC los encuentre en el paso de creación del lanzamiento.

El resultado es casi seguro que será más rápido. Probablemente será más grande también. La opción de uso de perfil habilita muchos otros pasos de optimización que de lo contrario solo están habilitados por -O3.

+0

¿Puede comentar qué pasos de optimización son esos? O cite algún documento? – JohnTortugo

+1

@JohnTortugo: 'info gcc' y búsqueda de perfil-uso. Dice:" Las siguientes opciones están habilitadas: -fbranch-probability ', ' -fvpt ',' -funroll-loops ', '' -fpeel-loops ' , '-ftracer' " –

17

De this example:

g++ -O3 -fprofile-generate [more params here, like -march=native ...] -o executable_name 
// run my program's benchmarks, or something to stress its most common path 
g++ -O3 -fprofile-use [more params here, like -march=native...] -o executable_name 

Básicamente, en un inicio de compilación y enlace con esta bandera adicional tanto para compilar y vincular: -fprofile-generate (de here).

Luego, cuando lo ejecute, de manera predeterminada creará archivos .gcda "al lado" de sus archivos .o, parece (codificado por hardware en la ruta completa donde se crearon).

Opcionalmente puede cambiar dónde crea estos archivos .gcda con -fprofile-dir = XXX setting.

Luego compila y vuelve a vincular usando el parámetro -fprofile-use, y lo compila usando bondad guiada por perfil.

+1

Por cierto, yo Si su programa tiene varios subprocesos, entonces los datos de perfil generados probablemente serán inconsistentes y es probable que obtenga errores cuando intente usarlos. Entonces, probablemente también deba pasar '-fprofile-correction' para la segunda invocación de g ++. –

+0

No me puedo deshacer del error. El comando que estoy usando es 'gcc hello_world.c -o demo_fdo -fprofile-use -freorder-blocks-and-partition -O3 -fprofile-correction -Wcoverage-mismatch' que sigue recibiendo el error de falta de coincidencia de cobertura. ¿Qué estoy haciendo mal? –

Cuestiones relacionadas