Skip to content Skip to navigation Skip to collection information

OpenStax_CNX

You are here: Home » Content » Cómputo de Alto Rendimiento » Cronometraje y Perfilado - Perfiladores de Bloques Básicos

Navigation

Table of Contents

Recently Viewed

This feature requires Javascript to be enabled.
 

Cronometraje y Perfilado - Perfiladores de Bloques Básicos

Module by: José Enrique Alvarez Estrada. E-mail the authorTranslated By: José Enrique Alvarez Estrada

Based on: Timing and Profiling - Basic Block Profilers by Charles Severance, Kevin Dowd

Existen varias buenas razones para desear un nivel de detalle más fine que el que puede obtener usando un perfilador a nivel de subrutina. Para los humanos que tratan de entender cómo se usa una subrutina o función, un perfilador que indique cuáles líneas de código fuente se están ejecutando realmente, y cuán a menudo, resulta invaluable; unas pocas pistas acerca de dónde enfocar sus esfuerzos de afinación pueden ahorrarle mucho tiempo. Además, tal tipo de perfilador le ahora el descubrimiento de que una optimización particularmente inteligente no resulta en diferencia alguna, porque la colocó en una sección cuyo código nunca se ejecuta.

Como parte de una estrategia global, un perfilador de subrutinas puede dirigirlo hacia un puñado de rutinas que contabilizan la mayor parte del tiempo de ejecución, pero se necesita de un perfilador de bloques básicos1 para que pueda usted obtener las líneas de código asociadas.

Los perfiladores de bloques básicos también proporcionan a los compiladores la información que necesitan para realizar sus propias optimizaciones. Muchos compiladores trabajan a ciegas: pueden reestructurar y desenrollar ciclos, pero no pueden decir cuándo merece la pena hacerlo. Y lo que es todavía peor, a veces las optimizaciones mal ubicadas ¡tienen el efecto adverso de volver más lento el código! Ello puede deberse al gravamen a que se ve sometida la cache de instrucciones, a las pruebas innecesarias introducidas por el compilador, o a hipótesis incorrectas acerca de qué camino tomará una bifurcación a tiempo de ejecución. Si el compilador puede interpretar automáticamente los resultados de un perfilador de bloques básicos, o si puede usted proporcionarle algunos indicios, a menudo significa un tiempo de ejecución reducido con poco esfuerzo de su parte.

Existen muchísimos perfiladores de bloques básicos en el Mundo. Lo más parecido a un estándar, tcov, se distribuye con las estaciones de trabajo Sun. Es estándar porque la base instalada es muy grande. En las estaciones de trabajo basadas en MIPS, tales como las Silicon Graphics y las DEC, el perfilador (empaquetado como una extensión de prof) se llama pixie. Explicaremos brevemente cómo ejecutar cada perfilador, usando un conjunto razonable de opciones. Puede consultar sus respectivas páginas de manual en busca de otras opciones.

tcov

tcov, disponible para estaciones de trabajo Sun y otras máquinas SPARC que ejecuten SunOS, proporciona estadísticas de ejecución que describen el número de veces que fue ejecutada cada sentencia del código fuente. Es muy fácil de usar. Para ilustrarlo, asumamos que tenemos un programa fuente llamado foo.c. Los siguientes pasos crean un perfil de bloques básicos:


% cc -a foo.c -o foo % foo % tcov foo.c

La opción -a le indica al compilador que incluya el soporte necesario para tcov.2 Se crean varios archivos durante el proceso. Uno llamado foo.d acumula una historia de las frecuencias de ejecución adentro del programa foo. Esto es, los datos antiguos se actualizan con datos nuevos cada vez que se ejecuta foo, así que puede usted obtener una imagen panorámica de qué sucede adentro de foo, dada una variedad de conjuntos de datos. Sólo recuerde limpiar los datos antiguos se quiere comenzar desde cero. El perfil en sí se guarda en un archivo llamado foo.tcov.

Veamos una ilustración. A continuación está un pequeño programa en C que realiza una ordenación de 10 enteros mediante el algoritmo de la burbuja:


int n[] = {23,12,43,2,98,78,2,51,77,8}; main () { int i, j, ktemp; for (i=10; i>0; i--) { for (j=0; j<i; j++) { if (n[j] < n[j+1]) { ktemp = n[j+1], n[j+1] = n[j], n[j] = ktemp; } } } }

tcov produce un perfil de bloques básicos que contiene el conteo de la ejecución de cada línea del código fuente, además de algunas estadísticas de resumen (que no se muestran):


int n[] = {23,12,43,2,98,78,2,51,77,8}; main () 1 -> { int i, j, ktemp; 10 -> for (i=10; i>0; i--) { 10, 55 -> for (j=0; j<i; j++) { 55 -> if (n[j] < n[j+1]) { 23 -> ktemp = n[j+1], n[j+1] = n[j], n[j] = ktemp; } } } 1 -> }

Los números a la izquierda le indican el número de veces que se entró a cada bloque. Por ejemplo, puede ver que a la rutina sólo se entró una vez, y que el conteo más alto ocurre en la condición n[j] < n[j+1]. tcov muestra más de un conteo sobre una línea en lugares donde el compilador ha creado más de un bloque.

pixie

pixie 3 es ligeramente diferente de tcov. En vez de reportar el número de veces que se ejecuta cada línea de código, pixie reporta el número de ciclos de reloj de máquina dedicados a cada línea. En teoría, puede usted usarlos para calcular la cantidad de tiempo gastada por sentencia, aunque no se representan anomalías como las fallas de cache.

pixie funciona “pixificando” un archivo ejecutable que fue compilado y enlazado normalmente. A continuación mostramos la ejecución de pixie sobre el programa foo para crear un nuevo ejecutable llamado foo.pixie:


% cc foo.c -o foo % pixie foo % foo.pixie % prof -pixie foo

También se creó un archivo llamado foo.Addrs, el cual contiene las direcciones de los bloques básicos dentro de foo. Cuando se ejecuta el nuevo programa, foo.pixie, crea un archivo llamado foo.Counts , que contiene la contabilidad de la ejecución de los bloques básicos cuyas direcciones están almacenadas en foo.Addrs. Los datos de pixie se acumulan de ejecución en ejecución. Las estadísticas se recuperan usando prof y la bandera especial –pixie.

La salida por defecto de pixie se divide en tres secciones, como sigue:

  • Ciclos por rutina
  • Conteo de la invocación de procedimientos
  • Ciclos por línea básica

A continuación mostramos el listado de salida de la tercera sección para el programa de ordenación por el método de la burbuja:


procedure (file) line bytes cycles % cum % main (foo.c) 7 44 605 12.11 12.11 _cleanup (flsbuf.c) 59 20 500 10.01 22.13 fclose (flsbuf.c) 81 20 500 10.01 32.14 fclose (flsbuf.c) 94 20 500 10.01 42.15 _cleanup (flsbuf.c) 54 20 500 10.01 52.16 fclose (flsbuf.c) 76 16 400 8.01 60.17 main (foo.c) 10 24 298 5.97 66.14 main (foo.c) 8 36 207 4.14 70.28 .... .. .. .. ... ...

Aquí puede usted ver tres entradas para la rutina principal de foo.c, además de un número de rutinas de bibliotecas del sistema. Las entradas muestran el número de línea asociado y el número de ciclos de máquina dedicados a ejecutar dicha línea, conforme se corrió el programa. Por ejemplo, la línea 7 de foo.c tomó 605 ciclos (12% del tiempo de ejecución).

Footnotes

  1. Un bloque básico es una sección de código con un único punto de entrada y un único punto de salida. Si sabe cuántas veces se entró al bloque, sabe cuántas veces se ejecutó cada sentencia en el bloque, lo cuál le está dando un perfil línea por línea. El concepto de bloque básico se explica con más detalle en (Reference)
  2. En los sistemas Solaris de Sun se usa a opción –xa.
  3. duendecillo, si se traduce literalmente. N. del T.

Collection Navigation

Content actions

Download:

Collection as:

PDF | EPUB (?)

What is an EPUB file?

EPUB is an electronic book format that can be read on a variety of mobile devices.

Downloading to a reading device

For detailed instructions on how to download this content's EPUB to your specific device, click the "(?)" link.

| More downloads ...

Module as:

PDF | EPUB (?)

What is an EPUB file?

EPUB is an electronic book format that can be read on a variety of mobile devices.

Downloading to a reading device

For detailed instructions on how to download this content's EPUB to your specific device, click the "(?)" link.

| More downloads ...

Add:

Collection to:

My Favorites (?)

'My Favorites' is a special kind of lens which you can use to bookmark modules and collections. 'My Favorites' can only be seen by you, and collections saved in 'My Favorites' can remember the last module you were on. You need an account to use 'My Favorites'.

| A lens I own (?)

Definition of a lens

Lenses

A lens is a custom view of the content in the repository. You can think of it as a fancy kind of list that will let you see content through the eyes of organizations and people you trust.

What is in a lens?

Lens makers point to materials (modules and collections), creating a guide that includes their own comments and descriptive tags about the content.

Who can create a lens?

Any individual member, a community, or a respected organization.

What are tags? tag icon

Tags are descriptors added by lens makers to help label content, attaching a vocabulary that is meaningful in the context of the lens.

| External bookmarks

Module to:

My Favorites (?)

'My Favorites' is a special kind of lens which you can use to bookmark modules and collections. 'My Favorites' can only be seen by you, and collections saved in 'My Favorites' can remember the last module you were on. You need an account to use 'My Favorites'.

| A lens I own (?)

Definition of a lens

Lenses

A lens is a custom view of the content in the repository. You can think of it as a fancy kind of list that will let you see content through the eyes of organizations and people you trust.

What is in a lens?

Lens makers point to materials (modules and collections), creating a guide that includes their own comments and descriptive tags about the content.

Who can create a lens?

Any individual member, a community, or a respected organization.

What are tags? tag icon

Tags are descriptors added by lens makers to help label content, attaching a vocabulary that is meaningful in the context of the lens.

| External bookmarks