Reto Intel V Noviembre 2008 Reto Intel 5. Antecedentes Durante el año 2006 y 2007, académicos del ITESO han participado en seminarios organizados por INTEL para dar a conocer y promover la tecnología multicore. Con el objetivo de compartir esto con alumnos del ITESO y de otros centros universitarios, se organizó el Primer Reto INTEL durante los Concursos de Programación del ITESO celebrados en Octubre de 2006. Los alumnos que compitieron en el Concurso Local del ITESO bajo las reglas de la ACM, tuvieron pase gratuito a este evento. La competencia fue individual. Los premios en esta ocasión fueron una computadora portátil Apple Dual Core y dos iPOD. Este evento fue apoyado por INTEL Educación. Debido al éxito del primer certamen, durante la Eliminatoria Regional del ACM ICPC 2006-2007, en la sede ITESO, este centro universitario e INTEL Educación acordaron organizar el Reto INTEL II, para continuar promoviendo la tecnología multicore. Los equipos inscritos en la sede ITESO tuvieron pase gratuito a este evento. La competencia fue por equipos. El premio fue una computadora portatil Apple Dual Core. En el ENCA 2007, que tuvo como sede al ITESO, Universidad Jesuita de Guadalajara no fue la excepción. El primer día del ENCA 2007 se lanzó el Reto INTEL III, y en Septiembre de ese mismo año durante la semana de Ing. En Sistemas Computacionales se llevó a cabo el Reto Intel IV. Objetivo El objetivo del reto es que el participante pueda optimizar un programa que requiere hacer uso intensivo del CPU, para que su ejecución aproveche las ventajas de la arquitectura MultiCore. Reto Intel V Noviembre 2008 Forma de participación Individual1 Requisitos para participar • Ser alumno de nivel preparatoria, licenciatura o primer semestre de posgrado. • Programación estructurada en Lenguaje C con el compilador Intel® C/C++. • Recomendable: Participar en el seminario relacionado con tecnologías Multicore que se impartirá el lunes 3 de Noviembre. Entrega Al inscribirse en el Reto Intel® 5 le será asignado un número a cada participante. La entrega será enviando únicamente el código fuente a través de correo electrónico [email protected], donde el nombre del archivo deberá ser sortXX.cpp donde XX es tu número de competidor asignado. El tiempo límite para entregar es las 2:00 AM Premio El premio que se le otorgará al participante ganador será una computadora Laptop Dell Core 2 Duo. Criterios para determinar el ganador El ganador será el concursante que logre más puntos basándonos en los siguientes criterios: 1 Se entiende que al ser participación individual no se permite ningún tipo de colaboración. Reto Intel V Noviembre 2008 Pts = TE - PNO 1. TE = Puntos Tiempo de ejecución = (50 – t)2 donde t es el tiempo que se lleva la ejecución de la versión ya optimizada. Para evaluar este tiempo de ejecución el jurado hará la ejecución con el número de elementos en los que una ejecución del caso base2 tome 50 segundos. Ejecuciones mayores a 50 segundos quedan descalificadas. 2. PNO = Puntos restados por ejecución no optimizada en paralelo (considerando una arquitectura de dos núcleos) = Punto porcentual * 25. Este puntaje se considerará a partir de donde inicia la paralelización del código, se medirá con Intel® Thread Profiler3y se considerarán todos los porcentajes que esta herramienta indique como no utilización completa del procesador, sobrecarga y ejecución serial. Para hacer la evaluación de este puntaje, el jurado ejecutará el programa en una arquitectura de dos núcleos y con un número de elementos muy alto que incluso puede ser el valor máximo. De esta manera el máximo de puntos es 2500 y no se consideran puntajes menores a 0. Jurado: • José Luis Elvira Valenzuela (Presidente), ITESO. • Víctor Hugo Zaldivar Carrillo, ITESO. • Miguel Bazdresh Sierra, ITESO. El jurado se reserva el derecho de descalificar aquellos proyectos que presenten errores en los resultados ejecución o presenten errores potenciales en la ejecución paralela4. 2 El caso base es el programa que se muestra en la Figura 1. Intel® Thread Profiler es una herramienta que permite encontrar problemas de rendimiento en una aplicación paralela. Los problemas principales pueden ser: sobrecarga, subutilización y ejecución serial por contención de objetos de sincronización (locks, semáforos, etc.), balanceo de carga, etc. 4 Los errores potenciales en la ejecución paralela pueden ser detectados mediante la herramienta Intel® Thread Checker, aunque estos no ocurran durante la ejecución. 3 Reto Intel V Noviembre 2008 El jurado se reserva el derecho de descalificar a todos aquellos participantes que no cumplan con las normas establecidas en el concurso. El jurado se reserva el derecho de decretar empate técnico si considera que la diferencia entre dos o más soluciones no es lo suficiente significativa y tiene la facultad para determinar un criterio o procedimiento de desempate. Uno de los criterios de desempate podrá ser el tiempo de entrega. El jurado se reserva el derecho de decretar el premio desierto si considera que ninguno de los participantes cumple con los requisitos para obtener el premio. La decisión del jurado es final e inapelable. Reto Intel V Noviembre 2008 Problema Descripción Un programa, en este caso un sort puede ordenar desde 100,000 hasta 10,000,000 millones de números enteros que están en un arreglo. El caso base que se presenta en la Figura 1 es el algoritmo del sort de burbuja. Este programa obtiene de los parámetros de la línea de comandos la cantidad de elementos a ordenar que puede ser desde 100,000 hasta 10,000,000. Si no se especifica ningún parámetro tomará un valor por default, en este caso 200,000. Ejemplo: C:\directorio actual> Sort 1000000 Ordenará 1,000,000 de elementos. Los elementos que ordena este sort son números aleatorios generados al inicio de la ejecución, que son almacenados en un arreglo. Después llamará la función sort() que es la función a optimizar. Al final el programa solamente revisará que no haya errores en el ordenamiento comprobando que en el arreglo siempre después de un elemento no hay uno que sea mayor a el. Actividad Crea una función sort de manera que el resultado sea una ejecución óptima en tiempo y que saque provecho de las arquitecturas Multicore. Requisitos • La paralelización deberá hacerse utilizando OpenMP. • El programa ejecutable deberá poder ser generado con el compilador Intel® C++ bajo la plataforma Windows*. Reto Intel V Noviembre 2008 • La primera línea del código debe ser un comentario que indique tu número de competidor. • El nombre del archivo fuente deberá ser sortXX.cpp donde XX es tu número de competidor asignado. Restricciones Tu solución propuesta deberá estar encapsulada en la función sort() de manera que no deberás modificar ninguna de las líneas de código que en este listado estén señaladas en color rojo. Sí está permitido agregar variables globales u otras funciones que necesites llamar desde la función sort(). Recomendaciones El número de hilos deberá ser igual al número de procesadores. No sobrecargues al sistema operativo creando más hilos que núcleos del procesador. El tener más hilos que núcleos lo detecta como sobrecarga el analizador de rendimiento Intel® Thread Profiler que es la herramienta que el jurado utilizará para calificar el porcentaje de ejecución con utilización completa de los núcleos del procesador. // Tu número de competidor va aquí #include <stdlib.h> #include <stdio.h> #include <time.h> #define #define #define #define MAXELEMS 10000000 DEFELEMS 200000 MINELEMS 100000 CORES 2 int elem[MAXELEMS]; int elems; void sort(int *inicio, int elems); // Aquí puedes agregar variables globales y/o predefinición de funciones. Reto Intel V Noviembre 2008 int main(int argc,char *argv[]) { int i; int errores=0; clock_t before, after; if (argc==1) elems=DEFELEMS; else if(argc==2) { elems=atoi(argv[1]); if(elems<MINELEMS || elems>MAXELEMS) { printf("Número inválido, el mínimo es %d y el máximo es %d\n",MINELEMS,MAXELEMS); exit(1); } } else { printf("Número inválido de argumentos\n"); exit(1); } printf("Ordenando %d elementos\n",elems); // Inicializa el arreglo con números random srand(100); for(i=0;i<elems;i++) elem[i]=rand(); before = clock(); sort(elem,elems); after = clock(); printf("Termina sort \n"); // Revisa errores for(i=0;i<elems-1;i++) if(elem[i]>elem[i+1]) { errores++; printf("elem[%d] = %d <--> elem[%d] = %d\n",i,elem[i],i+1,elem[i+1]); } printf("Errores %d\n",errores); printf("El tiempo fue : %7.2f segs\n",(float)(after - before)/ CLOCKS_PER_SEC); } // A partir de aquí puedes modificar y agregar funciones void sort(int *inicio, int elems) Reto Intel V Noviembre 2008 { int i,j; int temp; for(i=0;i<elems-1;i++) for(j=i+1;j<elems;j++) { if(inicio[i]>inicio[j]) { temp=inicio[i]; inicio[i]=inicio[j]; inicio[j]=temp; } } return; } Figura 1.- Sort de burbuja.