Arquitectura de Computadores (Ing. Industrial) ArqTecComp - Dpto. Informática e Ingeniería de Sistemas CPS - UniZar Práctica 2: Medida de Prestaciones En esta práctica se determinan las prestaciones de una máquina con un procesador RISC (Sun UltraSPARC IIi) y de otra con procesador CISC (Intel IA-32) mediante la ejecución de un programa de prueba intensivo de cálculo en coma flotante. También se medirá la influencia del compilador. Los índices escogidos van desde medidas independientes de la arquitectura (MFLOPS) hasta índices muy dependientes de la arquitectura/ implementación (CPI). Si hojeáis una revista de informática donde aparezcan anuncios de computadores, encontraréis números acerca de sus prestaciones. No siempre estos índices tienen sentido, están en contexto o son reproducibles. Por ejemplo, ¿para qué sirve saber la máxima velocidad a la que puede trabajar el hardware, velocidad de pico1?. Lo que importa en realidad es resolver problemas en el menor tiempo y/o con la máxima precisión posibles. Una forma de medir la calidad del computador consiste en tomar medidas durante la ejecución de programas de prueba (benchmarks). Cualquier programa de prueba puede orientarnos en la comparación entre computadores si tenemos claro que: a) El compilador va a representar un papel importante, un hardware superior puede ser la base de un computador mediocre si el compilador no es bueno. b) Los resultados deben ser comparables y reproducibles: lista exhaustiva de condiciones de contorno (KBytes de los distintos niveles de cache, MBytes de memoria principal DRAM-, prestaciones de disco y de bus, nivel de optimización del compilador, número de procesos en la máquina, versión del sistema operativo ...). En esta práctica se medirán distintos índices de prestaciones del computador (MIPS, MFLOPS, CPI ...) ejecutando un pequeño programa núcleo (kernel). Siempre teniendo en cuenta el tiempo de ejecución medido, podrán obtenerse índices operaciones/tiempo (a partir del número de operaciones realizadas), instrucciones/tiempo (a partir del número de instrucciones ejecutadas) ... Linpack (Linear Algebra Package) es un programa de prueba muy utilizado para medir la potencia del computador en un ámbito de cálculo vectorial en coma flotante. El programa de 1 De pico, es decir de “boca”. Velocidad que por definición nunca se consigue en problemas reales. prueba Linpack inicializa una matriz y un vector con datos aleatorios, realiza una descomposición triangular superior/inferior -L/U- mediante eliminación Gaussiana con pivotado parcial, sustituye y finalmente verifica la respuesta. Existen variantes en el tamaño del sistema (matriz 100x100 ó 1000x1000) y en la precisión de las variables (simple, 4 bytes o doble, 8 bytes). La resolución del sistema implica (2n3)/3 + o(n2) operaciones. La mayoría de estas operaciones se deben al bucle más interno, que resta un múltiplo de la fila pivote a cada fila de la submatriz implicada. Por tanto, y para simplificar el análisis del programa, podemos experimentar tan sólo con ese bucle más interno sin alterar las conclusiones. En esta práctica vamos a medir prestaciones de dos máquinas a) hendrix: arquitectura SPARC (RISC). b) infbn (n=[2-6]), infbnn (nn=[10-26, 28-31]): arquitectura IA-32 (CISC). Son los PCs con Linux de la sala de prácticas L0.01, a los que se puede acceder de forma remota con ssh. Comparten el sistema de ficheros con hendrix, así que vuestro nombre de usuario, password y directorio de trabajo son los mismos en todas estas máquinas. Utilizaremos como programa de prueba gauss.c, que es una simplificación de Linpack. Podéis encontrar este programa y copiarlo en vuestro directorio desde: hendrix: /export/home/compu/peimarin/gauss/gauss.c hendrix: /home/chus/gauss.c O bien descargaroslo desde la web de la asignatura. El fragmento de código a medir es el siguiente: for (i=0; i<m_size; i++) { for (j=0; j<m_size; j++) { A[i][j] = A[i][j]-P[i]*B[j]; } } Esta pareja de bucles resta a cada fila de la matriz A un vector B escalado por P[i]. Estos bucles, a su vez, están incluido en dos bucles más: limit y repeat. 2 ● El bucle limit (contador s) sirve para repetir la operación matricial y conseguir un tiempo suficientemente grande para ser medido con precisión. Si la medida de tiempo no es mayor que 20 veces la resolución de la rutina de medida de tiempos2, el programa lo advierte: habrá que incrementar el número de iteraciones limit. ● El bucle más externo repeat (contador r) pretende conseguir resultados más fiables (reproducibles), calculando la media de varios experimentos. Si la variabilidad Resolución de la llamada al sistema times() o clock() (varianza) de las medidas de dichos experimentos es alta, el programa lo avisará: habrá que realizar una nueva medición incrementando el valor de repeat. Estudiad con detalle el código para comprender bien el papel de los dos bucles más externos. 1. MFLOPS, Millions of FLOating Point OPerations per Second En este apartado mediremos la eficiencia del computador ejecutando código de alto nivel. Es equivalente a ocultar los detalles del compilador, del lenguaje máquina y de la implementación en un caja negra y hacer medidas desde el exterior. Mediremos prestaciones en términos de operaciones en coma flotante. En primer lugar compilaremos el programa gauss.c en las dos máquinas con dos niveles de optimización en cada una de ellas. Para ello crea dos directorios llamados sparc e ia32, y copia gauss.c en los dos directorios. Compila el programa en cada uno de los directorios desde la máquina que corresponde, con el compilador y con los niveles de optimización que se indican en la siguiente tabla: Sin optimización Con optimización hendrix cc gauss.c -o gauss cc -xO3 gauss.c -o gauss3 infbnn gcc gauss.c -o gauss gcc -O3 gauss.c -o gauss3 Ejecuta las distintas versiones del programa con diferentes tamaños de la matriz A (16x16, 32x32, 64x64, 128x128, 256x256, 512x512). Hay que ajustar el valor de la variable limit para cada tamaño de matriz, de modo que el tiempo de ejecución medido en cada iteración del bucle más externo (bucle repeat) sea mayor que 20 veces la resolución del temporizador. Así se limita el error de medición debido a la resolución del temporizador. Asimismo hay que ajustar el valor de la variable repeat de forma que se eviten medidas poco fiables. Calcula los MFLOPS para cada tamaño y nivel de optimización (velocidad de las operaciones suma y producto de coma flotante efectuados por el programa). La cifra cambia según el tamaño de la matriz, ¿por qué?. Como se especifica en la documentación de la práctica, el procesador IA-32 que estáis usando es un Pentium III a 1 GHz. Dispone de 2 unidades funcionales de coma flotante y por tanto es capaz de ejecutar 2 GFLOPS de pico. Sin embargo la propaganda asegura que ejecuta 4 GFLOPS de pico usando las instrucciones SSE (Streaming SIMD Extensions). En cuanto al procesador SPARC empleado, se trata de un UltraSPARC IIi a 360 MHz, capaz de lanzar 4 instrucciones por ciclo de las que sólo 2 pueden ser de punto flotante. Por tanto, puede ejecutar 720 MFLOPS de pico. ¿Por qué la cifra que habeis obtenido al ejecutar gauss es con toda seguridad muy inferior a los MFLOPS de pico anunciados por la propaganda? ¿Qué tipo de programas rondaría los MFLOPS de pico? 2. MIPS, Millions of Instructions Per Second3 A continuación abriremos parcialmente la caja negra y consideraremos el nivel lenguaje máquina. Conseguid el listado en ensamblador del programa para cada arquitectura y nivel de optimización utilizando la opción -S del compilador. Por ejemplo, para nivel de optimización 3: hendrix:~/ cc -xO3 -S -o gauss3.s gauss.c El bucle más interno de cada una de las versiones se encuentra en las líneas del fichero .s que se indican en la siguiente tabla: SPARC IA-32 sin optimización con optimización sin optimización con optimización Línea inicio 375 462 224 204 Línea final 422 483 258 214 Para cada nivel de optimización y arquitectura, ¿cuántas instrucciones se ejecutan en cada iteración del bucle L/U más interno?. Calcular las velocidades en MIPS suponiendo que los tiempos medidos en el apartado anterior se deben exclusivamente a la ejecución del bucle interno. Un Pentium III puede decodificar hasta 3 instrucciones por ciclo a 1 GHz. Por tanto ejecuta 3000 MIPS de pico. En cuanto al procesador UltraSPARC IIi puede lanzar hasta 4 instrucciones por ciclo a 360 MHz. Por tanto ejecuta 1440 MIPS de pico. ¿Por qué la cifra que habéis obtenido al ejecutar gauss es con toda seguridad muy inferior a los MIPS de pico anunciados por la propaganda? ¿Qué tipo de programas conseguirían los MIPS de pico? 3 Medida desprestigiada. Por ejemplo, algunos dicen que MIPS es Meaningless Indicator of Processor Speed, o sea, indicador inútil de la velocidad del procesador. 3. CPI (Ciclos Por Instrucción) Conociendo el tiempo de ciclo del procesador, calculad el CPI de este programa. ¿Para qué tamaño y nivel de optimización se obtiene el mejor CPI? ¿Y el peor? ¿Cómo se explican las diferencias, si existen? ¿Mejor CPI implica siempre menor tiempo de ejecución? 4. Ancho de banda Para este apartado debéis estudiar cuidadosamente el código ensamblador. Considerad solamente las versiones optimizadas. Calculad el ancho de banda en megabytes por segundo (MBps) de: ● Las instrucciones, es decir, ¿cuántos MBps de instrucciones está consumiendo el procesador? Para determinar los bytes de código buscados en IA-32 sigue el siguiente procedimiento: 1. añade en el fichero ensamblador (.s) etiquetas delimitando el código a medir. 2. compila el fichero ensamblador: gcc gauss.s -o gauss 3. utiliza el comando nm -n gauss para conocer las direcciones de las etiquetas. ● Los datos, es decir el tráfico de datos entre procesador y memoria medido en MBps, tanto en lecturas como en escrituras. ● El banco de registros, o sea MBps de lecturas y escrituras en cualquier registro (salvo el contador de programa -PC-). Rellenad una tabla en la que se especifiquen, para las versiones optimizadas de las dos arquitecturas, los bytes de cada tipo leídos/escritos en una iteración del bucle interno (ver tabla). Rellenad otra tabla en la que, para cada tamaño de matriz y para cada arquitectura, se especifiquen los tiempos de ejecución y los MBps de cada tipo. instrucciones bytes leídos IA-32 SPARC datos memoria bytes leídos bytes escritos datos registros bytes leídos bytes escritos 5. (Optativo) Medidas sobre otras arquitecturas Como trabajo optativo puede realizarse el análisis de otras máquinas. 1.1Alpha La máquina Compaq Alpha paramo.cps.unizar.es con sistema operativo Tru64 5.0 también comparte el sistema de ficheros con hendrix. Vuestro nombre de usuario, password y directorio de trabajo son los mismos que en hendrix. 1.1HP-PA El merlin es un ejemplo fichero gauss.c está en: de máquina de la familia HP-PA. Podéis usar la cuenta que ya tenéis. merlin: /users2/ac/bench_sources/gauss.c 1.1Otras opciones También puede realizarse la práctica en casa analizando vuestro computador. Los binarios compilados -con y sin optimización- para un procesador x86 (AMD, Intel ...) con MS-DOS, junto con el fichero fuente modificado para compilarse en dicha plataforma están en: http://www.cps.unizar.es/~chus/ac/wgauss.zip Si quieres compilar el fichero fuente deberás hacerte con un compilador de C. Si tienes acceso a Internet efectúa una búsqueda (www.google.com) con las palabras clave: "C compiler", "freeware" y la plataforma que utilices (Linux, Windows, MS-DOS, MacOS ...). Para Intel80386 y posteriores puede utilizarse DJGPP, que se encuentra en: http://www.delorie.com/djgpp/ Los resultados obtenidos en tus experimentos deben incluir la lista de condiciones contorno (CPU, memorias cache y RAM, sistema operativo y versión, compilador, opciones de compilación, etc.). Si tienes un computador x86 (AMD, Intel, VIA, Cyrix) con SO Windows, puedes obtener información detallada del sistema con el programa CPU-Z, disponible en: http://www.cpuid.com/cpuz.php 6. Consejos de uso de hendrix/infbnn/paramo La cuenta de hendrix es válida para: ● la máquina Compaq Alpha llamada paramo ● los PCs con Linux 2.4.9 del laboratorio L0.01 (infbnn.cps.unizar.es, con nn=[1026]). Si accedes a estos PCs en local (físicamente en el equipo) utiliza tu nombre de usuario y contraseña de hendrix en la ventana inicial. El acceso remoto deberá realizarse vía ssh (similar a telnet pero utiliza cifrado para la comunicación, así no envía la contraseña en claro por la red), y en principio sólo puede realizarse desde máquinas ubicadas en las redes 155.210.155.0 y 155.210.152.0. Puede sortearse esta limitación para conectarse a paramo o los PCs del L0.01 desde casa, realizando en primera instancia ssh sobre hendrix: ssh hendrix.cps.unizar.es Si tu sistema no soporta ssh, puedes utilizar el programa PuTTY (gratuito), disponible en: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html http://www.cps.unizar.es/~chus/ac/putty.exe Debes seleccionar sesión ssh al puerto 22 de hendrix.cps.unizar.es (al estar fuera del dominio unizar deberás especificar el nombre completo de la máquina). Una vez establecida la conexión con hendrix, efectuar otro ssh a la máquina destino (si usas PuTTY, utiliza la línea de órdenes de UNIX): ssh infbxx.cps.unizar.es ssh paramo.cps.unizar.es 6.1Uso local de infbnn Si utilizas las máquinas infbnn accediendo en local, ten presentes las siguientes consideraciones: ● Primer login: entrar vía remota (telnet/ssh) desde la cuenta de xterminal de los PC's de L0.01 y cambiar el password. Cuando pide "enter login (NIS+) password" está pidiendo el antiguo. ● Uso de la cuenta para trabajar localmente en los PCs (Laboratorio L0.01): el directorio HOME es compartido con hendrix, así resulta más eficiente por ejemplo, editar los ficheros en el PC en el que estás sentado. ● Para usar NEdit como editor por defecto de Gnome, poner el path completo (/usr/local/ bin/X11/nedit). En lo posible se recomienda usar 'nc', como se describe en Nedit->Help- >Server Mode and nc. ● Los terminales que lanza gnome (entorno de ventanas de Linux) por defecto no son de login. Eso hace que las variables de entorno necesarias no estén presentes. Corregirlo en el cuadro de preferencias: ● ● Botón derecho->Preferences...->General->Use --login by default Uso del Netscape: si la cache de netscape os agota la quota una solución puede ser poner la cache de disco a cero en las preferencias. Para correo es mejor usar los programas nativos de correo: mutt, elm, pine, popclient, ● xmh, etc... Quotas: si se os agota la quota no podréis entrar en sesion /usr/local/doc/quotas.txt gráfica. Ver: ● Cuentas antiguas: es posible que los ficheros de configuracion de tu shell no estén actualizados para soportar las 3 arquitecturas disponibles. Puedes encontrar los ficheros necesarios en: /usr/local/etc/proto_user 7. Características de los computadores 7.1 hendrix Nombre / dir.IP: Máquina: CPU: hendrix.cps.unizar.es / 155.210.152.16 Ultra 5 Model 360 Sun UltraSPARC-IIi, 360 MHz Decodifica hasta 4 instrucciones por ciclo, máximo 2 de coma flotante Arquitectura: Sparc (sparcv9+vis) Memoria Cache L1: 16 KB instrucciones + 16 KB datos Memoria Cache L2: 256 KB (en placa) Memoria principal: 320 MB DRAM Memoria virtual: 726 MB Disco duro: 8 GBytes HD SCSI Sistema Operativo: SunOS, version Compiladores: cc (WorkShop 5), gcc (2.95.2), gcc2 (gcc 2.8.1) 5.8, Kernel Version Generic_108528-06 64- bit Para más información, ejecutar la orden sysinfo 7.2 pentiums sala L0.01 Nombre / dir.IP: infbnn, CPU: infbn.cps.unizar.es, n=[2-6] / nn=[10-26, 28-31] / 155.210.154.[156-160] 155.210.154.[164-180, 182-185] 1 GenuineIntel (Coppermine) 999.860 MHz (Pentium III) Decodifica hasta 3 instr. por ciclo, 2 UFs de punto flotante Arquitectura: IA-32 (Intel Arquitecture 32 bits) Memoria cache L1: 16 KB instrucciones + 16 KB datos Memoria cache L2: 256 KB (en chip, funciona a la frecuencia de la CPU) Memoria principal: 256 MB DRAM Disco duro: 37 GB 2 IDE: ST340016A (hda) Sistema operativo: Linux Red Hat 7.2, kernel 2.4.18-27.7.x Compiladores: gcc 2.96 Más información: orden hinv 7.3 paramo Nombre / dir.IP: paramo.cps.unizar.es / Máquina: COMPAQ AlphaServer DS10 466 MHz DEC6600 CPU: 155.210.152.17 Alpha 21264 (EV6), 466 MHz. Decodifica hasta 4 instrucciones por ciclo, máximo 2 de coma flotante Arquitectura: Alpha Memoria cache L1: 64 KB instrucciones + 64 KB datos Memoria cache L2: 2 MB Memoria principal: 256 MB Sistema Operativo: Digital UNIX V5.0 (Rev. 910); Fri Oct 5 10:56:37 MEST 2001 Tru64 UNIX Spanish Support V5.0 (rev. 764) Compiladores: cc (Compaq C V6.1-011), gcc (2.95.2) Ver también /usr/local/doc/soft y /tmp_mnt/home/spd/paramo.html 7.4 merlin4 Nombre / dir.IP: merlin.cps.unizar.es / Máquina: CPU: 155.210.208.10 Servidor HP9000, serie 800, modelo L2000-36 RISC, HP-PA8500 (64 bits), 360 MHz. 4 procesadores (multiprocesador simétrico) Decodifica hasta 4 instrucciones por ciclo, máximo 2 de coma flotante Arquitectura: Memoria cache L1: procesador-) PA (Precission Architecture) 512 KB instr. + 1024 KB datos (1.5 MB en el chip -cada Memoria cache L2: No tiene Memoria principal: 2048 MB Disco duro: 4 discos internos Seagate ST39103LC de 8683 MB. Sistema operativo: UNIX, HP-UX version 11.00 Compiladores: cc (version ¿?) y gcc (interesante contrastar MFLOPS del código generado por ambos compiladores) Más información en: /usr/local/info/merlin 4 Órdenes uname y model 2.8.1 7.5 pentiums sala L0.03 Nombre / dir.IP: CPU: xtnn.cps.unizar.es, nn=[02-23] / 155.210.154.[111-132] 1 Intel(R) Pentium(R) 4 CPU 2.60C GHz Puede lanzar a ejecutar 1 instrucción SSE2 por ciclo, lo que supone un pico de dos operaciones de coma flotante de doble precisión (64 bits) o cuatro de simple precisión (32 bits) por ciclo.5 Arquitectura: IA-32 (Intel Arquitecture 32 bits) Memoria cache L1: 12 Kµops instrucciones + 8 KB datos Memoria cache L2: 512 KB Memoria principal: 512 MB RAM DDR-400 Disco duro: 1 disco IDE de 40GB, 7200rpm : ST340014A Sistema Operativo: MS-DOS y Windows NT Compilador: ¿? 5 Este pico sólo se alcanza entrelazando sumas y productos en ciclos consecutivos. Explicación más precisa en página 10 de G. Hinton, D. Sager, M. Upton, D. Boggs, D. Carmean, A. Kyker, P. Roussel., "The Microarchitecture of the Pentium® 4 Processor". Intel Technology Journal, Q1, 2001