El Procesamiento Paralelo en las Carreras de Computación Juan José Vargas e Ileana Alpı́zar Escuela de Ciencias de la Computación e Informática (ECCI) Universidad de Costa Rica (UCR) {juanjose.vargas,ileana.alpizar}@ecci.ucr.ac.cr http://www.ecci.ucr.ac.cr 1. Introducción El progreso en la fabricación de semiconductores y la imposibilidad de continuar incrementando la velocidad de los relojes hizo surgir los procesadores multinúcleos (multi-core) en los que, en su mayorı́a, cada núcleo puede ejecutar varios hilos simultáneamente. Esto hizo que la programación paralela y la tecnologı́a en la que ésta se basa llegaran a convertirse en un asunto de primera importancia. Sin embargo, como menciona Uzi Vishkin en un tutorial (http://www.umiacs.umd.edu/ ~vishkin/TUTORIAL/tutorial6-07/), los diseñadores de estos procesadores multinúcleos esperaban que el proceso de pensamiento que respalda la programación paralela emergiera una vez que sus máquinas se diseminaron por el mundo. Pero esto no fue ası́, las pequeñas y no tan pequeñas nuevas “supercomputadoras” llegaron a ser asequibles para la gran mayorı́a, sin que realmente se lograra aprovechar muy bien su potencial. Pero no hay vuelta atrás, las arquitecturas paralelas llegaron para quedarse; incluso recientemente se ha acuñado otro término, many-core, para referirse a procesadores con más de 32 núcleos, posiblemente combinando diferentes tipos, tales como núcleos de diferentes capacidades y núcleos para procesamiento de gráficos [9]. Algunas universidades ya comienzan a enseñar estas arquitecturas a sus estudiantes. Por ejemplo, en [10] se presenta el uso de ambientes multi-core y many-core en cursos avanzados del bachillerato. 2. Justificación de su importancia Después de más de 10 años de esta invasión de procesadores multinúcleos en el mercado, los planes académicos de muchas de las carreras universitarias en computación miran de largo el reto ineludible de modificarse sustancialmente para que los graduados realmente dominen el procesamiento paralelo. Al respecto, Vishkin (http://www.umiacs.umd.edu/users/vishkin/XMT/ teaching-platform.html) considera que los docentes en computación podrı́an ser acusados de mala praxis si la enseñanza del procesamiento paralelo se sigue posponiendo. Agrega que además se comete un grave error al seguir incentivando hábitos de programación secuencial en los actuales estudiantes, porque para ellos será aún más difı́cil lograr la transición al procesamiento paralelo. La evolución hacia la programación paralela debe comenzar por las universidades y si no se hacen los cambios en el currı́culum ahora, luego será muy tarde. Actualmente hay mucho software que tiene el fin de facilitar el manejo del paralelismo, como nuevos lenguajes de programación y nuevas extensiones a los lenguajes actuales, los cuales pueden ayudar enormemente en este trabajo. Por otra parte, el componente de investigación de las universidades se verá muy beneficiado, no solo porque tendrá mejores herramientas para hacer su trabajo, sino porque al involucrarse la universidad en el tema del procesamiento paralelo, podrá contribuir mucho al desarrollo de éste, ya que como se sugiere en [1], los investigadores tendrán la rara oportunidad de reinventar aquellas piedras angulares de la computación que pueden simplificar la programación eficiente de sistemas masivamente paralelos. 3. Metodologı́a utilizada La inclusión del paradigma de procesamiento paralelo en el currı́culum de una carrera universitaria en computación impactarı́a muchos de los cursos centrales, tales como los de programación en diferentes lenguajes, estructuras de datos y algoritmos, sistemas operativos, arquitectura de computadoras, compiladores, ası́ como cursos más avanzados en las áreas de simulación, inteligencia artificial y graficación [11,6,5]. Además del contenido, la metodologı́a de enseñanza también debe ser ajustada. El uso de laboratorios tradicionales debe combinarse con otras técnicas desarrolladas en el aula, tal como los Microlabs que se mencionan en [8]. Durante la introducción de los conceptos sobre paralelismo, la principal dificultad a vencer es el cambio de mentalidad que debe tenerse para enfocar las soluciones de los problemas bajo este nuevo paradigma. Esta dificultad ha sido mencionada desde hace bastante tiempo por autores como Hyde [7] que propone la introducción de cursos de procesamiento paralelo en los cursos de bachillerato utilizando simuladores y transputers. Para que los estudiantes culminen su carrera pudiendo llegar de una manera natural a soluciones, tanto con diseños secuenciales como paralelos, y a manejar con soltura la tecnologı́a existente para dichas soluciones, es indispensable que se comience con este paradigma desde el primer curso. Si en este primer curso se da énfasis a la presentación de los detalles complejos y poco intuitivos que el hardware paralelo y su programación traen consigo, se terminará dando una bienvenida contraproducente al tema. Lo ideal es evitar esto al no utilizar aún la programación, y dedicar gran parte del tiempo al diseño de algoritmos para resolver problemas inherentemente paralelos, los cuales de preferencia deberı́an ser tomados de la vida real y que sean familiares para los estudiantes, como la solución de juegos sencillos. Luego de dominar la creación de algoritmos para resolver problemas paralelos, se debe pasar a hacer su programación. Es recomendable que se comience trabajando con varios hilos de ejecución (threads) para un mismo proceso y no con varios procesos. La razón para esta sugerencia es que los hilos de un mismo proceso comparten el espacio de direcciones, por lo que la comunicación entre ellos en muy simple, mientras que la creación de varios procesos y su comunicación es un asunto más complicado de enfrentar al inicio de la carrera. De nuevo, en esta programación que utiliza hilos, se debe “esconder” al máximo los detalles complejos relacionados con su manejo y su sincronización. Para esto, se recomienda trabajar con herramientas que ası́ lo permitan, tales como OpenMP, que consiste en una interfaz para programación de aplicaciones (API), TBB (Threading Building Blocks), que es una biblioteca de Intel para C++, Linda, CUDA, etc. [2]. En [3] se presenta una experiencia educativa en donde se concluye que OpenMP está entre las herramientas más recomendadas para los estudiantes de cursos iniciales. El siguiente paso en el aprendizaje es comenzar con la creación de varios procesos de manera simple. Para ello se sugiere utilizar MPI (Message Passing Interface), herramienta que usualmente se utiliza cuando se trabaja en clusters, pero que también se puede instalar en una máquina con un procesador de varios núcleos o con varios procesadores, sean éstos multinúcleos o no. Nótese que es posible crear procesos, cada uno con varios hilos de ejecución, al utilizar conjuntamente MPI y OpenMP. Al avanzar en complejidad, se debe comenzar con la programación de hilos y procesos, incluyendo su creación y sincronización utilizando los mecanismos que el propio lenguaje de programación provee. La comunicación entre procesos incluirı́a sockets, RPC (Remote Procedure Call ) y paso de mensajes. La administración de hilos y procesos por parte del sistema operativo, el manejo de la memoria compartida y los mecanismos de sincronización son temas obligados en un curso de sistemas operativos que deben abordarse desde sus aspectos teóricos para que formen el complemento de los cursos de programación. La búsqueda de errores (debugging) en este nuevo paradigma se vuelve más compleja, por lo que debe formar parte de los cursos. Una mala elección de las estructuras de datos y los algoritmos a utilizar en un programa puede provocar un mal rendimiento e incluso resultados erróneos [4]. Es por ello que en un curso especı́fico de estructuras de datos y análisis de algoritmos o a través de los cursos de programación se debe realizar un estudio profundo de ambos. Una dificultad reside en el análisis matemático de los algoritmos paralelos. La complejidad asintótica de las estructuras de datos concurrentes es un tema que ha sido investigado en modelos idealizados, pero que en la práctica no contemplan una serie de circunstancias, tales como el costo de la contención y la sincronización, los efectos de la memoria cache, los backoff delays que deben esperar los procesos para adquirir un recurso crı́tico, etc., que son difı́ciles de analizar. Los cursos de lenguaje ensamblador, de arquitectura de computadoras y otros similares, deben ofrecer un enfoque teórico sobre la manera en que los procesadores implementan las capacidades de multihilo y multinúcleos, y su relación con los compiladores y el sistema operativo. El paralelismo en el hardware permite que se dé gran variedad de configuraciones para los procesadores de una máquina, por lo que las optimizaciones que realizan los compiladores deben producir el código correcto, tomando en cuenta las caracterı́sticas de la máquina en la que correrá el programa. Este tema se deberı́a abarcar en un curso de compiladores. En cursos avanzados que no están directamente relacionados con el tema de concurrencia, tales como bases de datos, inteligencia artificial, ingenierı́a de software y otros, es necesario que los docentes conozcan las capacidades del procesamiento paralelo y la manera en la que se relaciona con sus materias. Ası́, podrán explotar al máximo el conocimiento de sus estudiantes en el tema del paralelismo, solicitándoles diseñar aplicaciones que lo aprovechen. 4. Resultados El proyecto docente para la promoción del procesamiento paralelo que se llevó a cabo en la Escuela de Ciencias de la Computación e Informática de la UCR permitió que el personal docente comenzara a tomar conciencia sobre la importancia de introducir los temas relacionados con el procesamiento paralelo en los diferentes cursos de la carrera, iniciando por los más básicos. La adquisición de los equipos que conforman el cluster ha servido como excusa para despertar el interés por esta área de la computación. Aún cuando no se dispusiera de un cluster, los aspectos fundamentales del procesamiento paralelo pueden practicarse en máquinas multinúcleos, o mediante la simulación del paralelismo en máquinas de un solo núcleo. Las herramientas de software para procesamiento paralelo, tales como MPI, Rocks, OpenMP, TBB y TupleDSM, ası́ como su documentación, están disponibles, en su mayorı́a bajo licencias GNU-GPL, por lo cual, no constituyen un obstáculo que impida el desarrollo en el área. Si bien es urgente realizar la modificación del plan de estudios para incluir paralelismo, ésta no puede hacerse de manera precipitada. Nada se hace con una excelente infraestructura, si no hay personal docente interesado. Nada se hace con modificar los contenidos, el enfoque y la metodologı́a de los cursos, si los docentes no han asimilado el nuevo paradigma. Es necesario dedicar el tiempo suficiente para definir con claridad las estrategias que ayudarán a vencer los retos mencionados en este documento, ası́ como muchos otros que inevitablemente aparecerán. Como un paso normal siguiente a la inclusión del procesamiento paralelo en el currı́culum, debe pensarse en abordar la investigación aplicando este nuevo conocimiento y utilizando la nueva infraestructura. Escoger al menos un nicho en investigación hará que los estudiantes y docentes puedan fortalecer sus conocimientos y se garantizará que la infraestructura de hardware y software irá cambiando al ritmo de la evolución de la tecnologı́a paralela. Cualquier iniciativa para promover la utilización de aplicaciones paralelas requiere de un ambiente de desarrollo adecuado, tanto en aspectos de hardware como de software. El equipo debe tener la capacidad de ejecutar múltiples hilos o procesos en paralelo, para lo cual es necesario disponer de varios elementos procesadores (núcleos o CPU’s) que pueden estar integrados dentro de un mismo nodo, o en nodos separados interconectados por una red. Tal equipo es de uso común en esta época. Más aún, el número de elementos procesadores tiende a incrementarse dı́a con dı́a, a la vez que su precio tiende a bajar. En cuanto al software, el ambiente de desarrollo incluye herramientas en forma de bibliotecas o módulos que se pueden incorporar a los lenguajes tı́picos de programación y los extienden. Muchas de estas herramientas se encuentran bajo licencias de software libre. Como resultado, se concluye que tanto el hardware como el software son de fácil adquisición. 5. Futura investigación Por su carácter de proyecto docente, la futura investigación gira en torno a adoptar en el curriculum de la carrera los temas de procesamiento paralelo aquı́ mencionados. Esta labor es propia del futuro plan de estudios que surgirá con motivo de los compromisos de mejoramiento adquiridos durante el proceso de acreditación de la carrera. También se deberı́a pensar en un plan para ofrecer cursos de capacitación en estos temas a los ex-alumnos, estudiantes graduados y estudiantes de otras carreras, especialmente de las ingenierı́as. Referencias 1. Asanovic, K., Bodik, R., Catanzaro, B.C., Gebis, J.J., Husbands, P., Keutzer, K., Patterson, D.A., Plishker, W.L., Shalf, J., Williams, S.W., Yelick, K.A.: The landscape of parallel computing research: A view from berkeley. Tech. Rep. UCB/EECS-2006-183, EECS Department, University of California, Berkeley (Dec 2006), http://www.eecs. berkeley.edu/Pubs/TechRpts/2006/EECS-2006-183.html 2. Bruce, K.B., Danyluk, A., Murtagh, T.: Introducing concurrency in cs 1. In: SIGCSE ’10: Proceedings of the 41st ACM technical symposium on Computer science education. pp. 224–228. ACM, New York, NY, USA (2010) 3. Chesebrough, R.A., Turner, I.: Parallel computing: at the interface of high school and industry. In: SIGCSE ’10: Proceedings of the 41st ACM technical symposium on Computer science education. pp. 280–284. ACM, New York, NY, USA (2010) 4. Duffy, J.: Concurrent Programming on Windows. Pearson Education, Inc (2009) 5. Hartman, J., Dean, S.: Teaching parallel processing using free resources. In: ASEE/IEEE Frontiers in Education (FIE 96) Conference. Salt Lake City, Utah, USA (1996), http://fie-conference.org/fie96/papers/437.pdf, uRL http://fie-conference.org/fie96/papers/437.pdf 6. Hartman, J., Sanders, D.: Teaching a course in parallel processing with limited resources. In: SIGCSE ’91: Proceedings of the twenty-second SIGCSE technical symposium on Computer science education. pp. 97–101. ACM, New York, NY, USA (1991) 7. Hyde, D.G.: A parallel processing course for undergraduates. In: SIGCSE ’89: Proceedings of the twentieth SIGCSE technical symposium on Computer science education. pp. 170–173. ACM, New York, NY, USA (1989) 8. Kurtz, B.L., Tashakkori, R., Helfert, J.J., Sage, M.: Using microlabs to teach modern distributed computing. In: SIGCSE ’10: Proceedings of the 41st ACM technical symposium on Computer science education. pp. 285–289. ACM, New York, NY, USA (2010) 9. McGuire, T.J.: Introducing multi-core programming into the lower-level curriculum: an incremental approach. J. Comput. Small Coll. 25(3), 118–119 (2010) 10. Rivoire, S.: A breadth-first course in multicore and manycore programming. In: SIGCSE ’10: Proceedings of the 41st ACM technical symposium on Computer science education. pp. 214–218. ACM, New York, NY, USA (2010) 11. Shiflet, A.B., Cannon, S., Frederick, T.J., Hartman, J., Meredith, M., Nevison, C., Sanders, D.: Approaches to teaching parallel processing on the undergraduate level (abstract). In: SIGCSE ’93: Proceedings of the twentyfourth SIGCSE technical symposium on Computer science education. p. 298. ACM, New York, NY, USA (1993)