Red de conocimiento informático - Material del sitio web - Cómo utilizar Oprofile para crear perfiles de software

Cómo utilizar Oprofile para crear perfiles de software

Xilinx Zynq-7000 trae un nuevo concepto de diseño de sistema. El objeto de creación de perfiles libjpeg se introdujo en el artículo anterior y no se repetirá aquí.

Introducción a I.Oprofile

La creación de perfiles es un resumen o análisis formal de datos sobre diferentes características de rendimiento, generalmente en forma de gráfico. Proporciona el porcentaje o la cantidad de muestras recopiladas para un evento de procesador específico, como la tasa de errores de caché, la tasa de errores de TLB, etc. El objetivo principal de la creación de perfiles es conocer el rendimiento del procesador. En términos generales, el objetivo principal es identificar cuellos de botella en el rendimiento del software y luego realizar optimizaciones específicas para mejorar el rendimiento general del software.

Oprofile es una de varias herramientas de supervisión del rendimiento y creación de perfiles para Linux. Funciona en diferentes arquitecturas, incluidas ARM, PowerPC, MIPS, IA32, IA64, AMD Athlon y más. Tiene muy poca sobrecarga y se ha incluido en el kernel de Linux desde la versión 2.6 de Linux.

Oprofile recopila información sobre eventos del procesador para ayudar a los usuarios a identificar problemas como desarrollo de bucles, bajo uso de caché, conversiones de tipos ineficientes y operaciones redundantes, y transferencias mal previstas. Oprofile es una herramienta detallada que recopila muestras de conjuntos de instrucciones, funciones, llamadas al sistema o rutinas de manejo de interrupciones. Oprofile funciona mediante muestreo. Utilizando los datos de evaluación recopilados, los usuarios pueden identificar fácilmente problemas de desempeño.

Al monitorear los eventos del hardware de la CPU, Oprofile puede perfilar todo el sistema Linux en tiempo de ejecución, incluido el kernel de Linux (incluidos módulos y controladores de interrupciones), bibliotecas compartidas o aplicaciones.

A partir de la versión 0.9.8, oprofile admite el modo de creación de perfiles Perf_events. La aplicación oprof controla el proceso de creación de perfiles; en modo heredado, esto se realiza a través del script opcontrol y el demonio oprofiled. Con operf, los usuarios pueden configurar sus aplicaciones como un usuario normal, pero si es necesario configurar todo el sistema, aún se requieren privilegios de root.

Si el hardware no admite el uso de contadores de rendimiento por parte de OProfile, entonces OProfile solo puede funcionar en modo temporizador, y el modo temporizador solo puede usarse en el modo de creación de perfiles tradicional, es decir, solo puede ser controlado por el script de control de operación.

Las características de Oprofile son: código de apilamiento (JIT). Puede generar perfiles de todo el sistema. Puede observar detalles dentro de la CPU, como las tasas de errores de caché. Puede anotar múltiples códigos fuente. instrucciones La creación de perfiles de nivel genera perfiles de gráficos de llamadas

Pero OProfile no es una panacea, tiene sus limitaciones: la generación de perfiles de gráficos de llamadas solo es aplicable a arquitecturas x86, ARM y PowerPC. No compatible 100 Perfiles precisos a nivel de construcción El soporte para perfiles de código compilado dinámicamente (JIT) aún no está completo.

En cualquier caso, Oprofile es mucho más potente que gprof, pero es un poco más engorroso de configurar.

II. Compilación de Oprofile

Primero, es mejor verificar el controlador Oprofile en el kernel de Linux para obtener soporte completo.

Descargue el código fuente del kernel de Linux: puede descargar el kernel probado proporcionado por Xilinx desde /Xilinx/linux-xlnx. Si no puede utilizar la herramienta git de Linux, puede descargar la bola tar y buscar la versión correspondiente haciendo clic en lanzamientos en la página.

Es mejor descargar en formato tar.gz en lugar de formato zip, ya que este último puede tener problemas con los enlaces simbólicos.

Como estoy usando Xilinx Linux precompilado 14.7, descargué linux-xlnx-xilinx-v14.7.tar.gz

Después de descomprimir el paquete tar, utilicé el siguiente comando abra la interfaz de configuración del kernel de Linux:

exportar ARCH=arm

exportar CROSS_COMPILE=arm-xilinx-linux-gnueabi-

make xilinx_zynq_defconfig

hacer xconfig o hacer menuconfig.

Marque las siguientes dos casillas en la pantalla de configuración:

Configuración general---gt;

[*] Soporte de creación de perfiles

lt; *gt; análisis del sistema OProfile

y crear uImage. Genere una nueva uImage para reemplazar la imagen del kernel de Linux en la compilación previa de Xilinx Linux 14.7. También necesitamos vmlinux para verificar los resultados de la generación de perfiles.

Oprofile requiere las bibliotecas popt, bfd y liberty. Para usar estas bibliotecas en la placa integrada, necesitamos realizar una compilación cruzada manualmente.

Para popt 1.7, puedes usar el siguiente comando para compilar:

./configure --prefix=/home/wave/xilinx/oprofileprj/rootfs --host=arm- xilinx- linux-gnueabi --with-kernel-support --disable-nls make make install

Para binutils 2.24, use el siguiente comando para completar la compilación:

./configure --host=arm-xilinx-linux-gnueabi--prefix=/home/wave/xilinx/oprofileprj/rootfs--enable-install-libbfd--enable-install-libiberty--enable-shared amp; make install

Sin embargo, enable-install-libiberty no tiene ningún efecto, por lo que debe copiar manualmente libiberty.a y libiberty.h en las ubicaciones adecuadas.

Para oprofile 0.9.9, utilice el siguiente comando para completar la compilación:

./configure --host=arm-xilinx-linux-gnueabi --prefix=/home /wave/ xilinx/oprofileprj/rootfs --with-kernel-support --with-binutils=/home/ wave/xilinx/oprofileprj/rootfs amp;amp;amp;amp; al final del proceso de configuración El siguiente mensaje puede aparecer y puede ignorarse porque no tiene intención de utilizar la interfaz gráfica de usuario y el código JIT de perfil.

config.status: Ejecutando el comando libtool

Advertencia: Se solicitó la versión 3 de QT pero no se encontró. La GUI no se construirá.

Advertencia:

Para configurar el código JIT, esta cuenta de usuario especial debe existir.

Pregunte

Para configurar el código JIT, esta cuenta de usuario especial debe existir.

Solicite al administrador del sistema que agregue los siguientes usuarios y grupos:

Nombre de usuario: "oprofile"

Nombre de grupo: "oprofile"

El grupo "oprofile" debe ser el grupo predeterminado para el usuario "oprofile".

Empaque los binarios compilados de uImage, vmlinux y oprofile, el binario libjpeg recompilado (sin -pg) y libc desde la cadena de herramientas a la tarjeta SD. Empaquételos en una tarjeta SD y prepárese para probar el perfil djpeg en la placa de desarrollo ZC706.

Ejecute Oprofile

Después de iniciar Embedded Linux normalmente, ingrese los siguientes comandos uno tras otro en la consola de la placa de desarrollo:

mount /dev/mmcblk0p1 /mnt

mkdir -p /home/root/work

cd /home/root/work

tar zxvf /mnt/jpeg-bin-nopg.tar.gz

cd jpeg-bin/bin

cp /mnt/park-2880x1800.jpg .

exportar LD_LIBRARY_PATH=/home/root/work/jpeg-bin/lib

cd /home/root/work

tar zxvf /mnt/rootfs.tar.gz

cd rootfs

chown root:root -R *

cp -R bin/* /usr/bin

cp -R lib/* /lib

cp /bin/cuál /usr/bin

cp /bin/dirname /usr/bin

mkdir -p /home/wave/xilinx/oprofileprj/rootfs/share

cp -R ./rootfs /* /home/wave/xilinx/oprofileprj/rootfs

cd /home/root/work

tar zxvf /mnt/libc.tar.gz

cp /lib/libstdc*.* /lib

mkdir -p /home/wave/xilinx/libjpeg

cd /home/wave/xilinx/libjpeg

tar zxvf /mnt/jpeg-9.tar.gz

cp /mnt/ vmlinux /home/root/work

cd /home/root/work/jpeg-bin /bin

opcontrol --init

opcontrol --vmlinux=/home/root/work/vmlinux

opcontrol --setup --event=CPU_CYCLES: 100000: :0:1 --session-dir=/home/root/

operf --vmlinux /home/root/work/vmlinux ./djpeg -bmp park-2880x1800.jpg gt; bmp

opreport -l .

root@zynq:~/work/jpeg-bin/bin# opreport -l .

Utilice /home/root/ work/ jpeg-bin/bin/oprofile_data/samples/ Como directorio de muestras: ARM Cortex-A9, velocidad 666667 MHz (estimada)

Evento CPU_CYCLES (ciclos de CPU) con máscara de unidad 0x00 (sin máscara de unidad)) contar 100000

muestra

es nombre de la imagen nombre del símbolo

15293 58.6253 libc-2.17.so /lib/libc-2.17.so

2044 7.8356 libjpeg.so.9.0.0 ycc_rgb_convert

1964 7.5289 libjpeg.so.9.0.0 jpeg_ idct_16x16

1918 7.3526 libjpeg.so.9.0.0 decode_mcu

1570 6.0186 libjpeg.so.9.0.0 jpeg_idct_islow

1567 6.0071 djpeg finish_output_bmp

528 2.0241 libjpeg.so.9.0.0 jpeg_fill_bit_buffer

397 1.5219 djpeg put_pixel_rows

73 0.2798 vmlinux __copy_from _user p>

70 0.2683 libjpeg.so.9.0.0 decompress_onepass

65 0.2492 libjpeg.so.9.0.0 jpeg_huff_decode

56 0.2147 vmlinux get_ page_from_freelist

50 0.1917 vmlinux __memzero

45 0.1725 vmlinux __copy_too_user_std

41 0.1572 vmlinux _raw_spin_unlock_ irqrestore

15 0.0575 vmlinux do_page_fault

14 0.053 7 vmlinux __generic_file_aio_write

13 0.0498 vmlinux _raw_spin_unlock_ irq

11 0.0422 vmlinux free_hot_cold_page

11 0.0422 vmlinux vector_swi

10 0.0383 vmlinux handle_pte_fault

A partir de los resultados, podemos ver que los nombres de los símbolos en libjpeg.so.9.0.0, djpeg y vmlinux se pueden analizar correctamente, lo que básicamente es consistente con los resultados de gprof.

También podemos utilizar el siguiente comando para observar el tiempo de ejecución de líneas específicas en el código fuente, reduciendo así aún más el alcance de la optimización y logrando el doble de resultado con la mitad de esfuerzo.

opannotate --source ./djpeg gt; opannotate.txt

IV.Resumen

A través de experimentos, podemos ver que Oprofile puede proporcionar un análisis más rico de los resultados. puede ayudar mejor a los desarrolladores a encontrar cuellos de botella y mejorar el rendimiento del software mediante la optimización específica. Los resultados de la creación de perfiles también pueden ayudar a los desarrolladores a darse cuenta de los cuellos de botella en el rendimiento del código a través del acelerador del hardware de las herramientas Xilinx HLS. Esto abre la puerta a mayores mejoras en el rendimiento general del sistema integrado.