2011-10-13 20 views
5

me gustaría saber si hay herramientas que puedenHerramientas para visualizar el grafo de llamada de aplicación C++ multiproceso, cobertura de código multiproceso?

  • ayudar a visualizar gráfico de llamadas de una gran aplicación multi-hilo.
  • Específicamente, quiero ver cómo se entrelazan varios hilos en un núcleo/se ejecuta simultáneamente en múltiples núcleos.
  • La herramienta idealmente identificaría posibles condiciones de espera/estancamiento/carrera.
  • En última instancia quiero hacer la cobertura de código en términos de cómo interactúa con los hilos entre sí en tiempo de ejecución (sabia multi-hilo-herramienta de cobertura de código) con el fin de encontrar posibles errores de subprocesos múltiples.

    pido disculpas si no he explicado claramente mi pregunta y me gustaría dar detalles.

+0

Buena suerte, estaré pendiente de una respuesta razonable. Creo que necesitas tener una comprensión completa del hilo de ejecución que estás dividiendo en múltiples. Hay muchas herramientas para perfilar y producir gráficos de ejecución (fav es el perfilador de rendimiento de Redgate, caro pero impresionante) pero sin detalles estás disparando en la oscuridad. – Justin

+0

@Justin Ah Olvidé mencionar que la aplicación en la que estoy trabajando está en C++. – fantasticsid

+0

@fantasticid: he editado su título para reflejar su interés. –

Respuesta

1

El VTune Profiler de Intel puede hacer algo de lo que se le pregunte. Desde el sitio VTune:

Cerraduras y espera: Utilice el rendimiento Intel® herramientas de perfilado para encontrar rápidamente una causa común de rendimiento lento en programas paralelos: esperar demasiado tiempo en una cerradura, mientras que los núcleos están infrautilizados durante la espera.

Timeline Visualiza el comportamiento del subproceso: Vea cuándo se están ejecutando los subprocesos y esperando, y cuándo ocurren las transiciones.

Si buscaba algo que sea de código abierto/gratuito, entonces Valgrind tiene una herramienta experimental llamada Helgrind que supuestamente encuentra carreras en programas de subprocesos múltiples. No puedo comentar sobre eso, no lo he usado.

Debo señalar que no he tenido éxito en la utilización de estos u otros perfiladores para la depuración y optimización multi-hilo, y en su lugar he desarrollado mis propias técnicas.

Para la identificación de contención de bloqueo mi técnica preferida es el uso de una clase de objeto mutex extendida que registra todas las operaciones realizadas en cada instancia. Hago esto de una manera muy ligera, para que el rendimiento de la aplicación no cambie a lo grande.

Para identificar las condiciones de carrera que encuentro la fuerza bruta se acercan a los mejores. Solo diseño una prueba que se puede ejecutar durante un período de tiempo prolongado, algunas veces esto es horas o días, dependiendo del caso. Y siempre corro mi prueba en al menos dos plataformas diferentes (más si puedo), ya que los diferentes sistemas operativos utilizan diferentes programadores y eso le da una mejor cobertura.

1

Aunque no puedo ayudar (¡todavía!) En la mayoría de sus problemas, creo que nuestra herramienta C++ Test Coverage podría proporcionarle datos de cobertura de prueba multiproceso con bastante facilidad.

Esta herramienta instrumentos de su código fuente; compilas y ejecutas eso. Usted termina con (barato) sondas de instrumentación en su código que representan varios bloques. La instrumentación registra qué partes de su programa se ejecutan, nominalmente como un vector de bits con un bit por sonda de instrumentación. Al final de la ejecución (o cuando lo desee), este vector de bits se descarta y un visor lo mostrará superpuesto al código.

El truco para obtener la cobertura de prueba multihilo es saber que le brindamos control total sobre la definición de cómo funcionan las sondas del instrumento; ellos son macros. Así que en lugar de usando la macro por defecto de esencialmente

probe[n]=true; 

en una matriz booleana, en su lugar puede aplicar

probe[n]|=1<<threadid; 

en una matriz int (o algo más barato hábilmente por precomputación de este valor). Esto probablemente solo requiera unas pocas líneas de código para implementar.

La gente podría notar esto técnicamente tiene problemas de sincronización. Eso es cierto, pero a lo sumo pierde un poco de datos de cobertura, y las probabilidades en contra son bastante altas. La mayoría de las personas están contentos con los datos "bastante buenos" en lugar de perfectos. Si insistes en la perfección, pagarás un alto precio de sincronización utilizando algunas instrucciones de actualización atómica .

También le ofrecemos control sobre la lógica de descarga de la sonda; puede revisarlo para escribir datos de cobertura específicos de subprocesos (en las decenas de líneas del rango de código personalizado). El visor de datos de cobertura de prueba le permitirá ver cobertura específica de subprocesos (simplemente elija el vector de cobertura correcto); también tiene una función incorporada para que computa/muestra fácilmente intersection/union/diff en vectores de cobertura, lo que le proporciona exactamente su relación de cobertura por hilo.