Activa las notificaciones para estar al tanto de lo más nuevo en tecnología.

La programación en paralelo

El mundo de las computadoras nos ha mostrado que tenemos equipos que hacen muchas cosas. Hay computadoras con multitareas, que en principio pueden, supuestamente, imprimir...

El mundo de las computadoras nos ha mostrado que tenemos equipos que hacen muchas cosas. Hay computadoras con multitareas, que en principio pueden, supuestamente, imprimir un archivo mientras estamos en la hoja de cálculo y escuchamos quizás en el media player una rola determinada. Sin embargo, todos estos sistemas “simulan”, por decirlo de una manera, las multitareas. En realidad y simplificando mucho el asunto, tenemos un procesador que hace una tarea a la vez. Los sistemas operativos modernos permiten que el procesador cambie de tarea con suma facilidad y rapidez, y entonces nos da la idea que -en tiempos humanos- la máquina está haciendo diversas cosas al mismo tiempo.

Sin embargo, con la llegada de los procesadores con varios núcleos, con las tarjetas gráficas que contienen GPUs (Graphic Processing Unit) con muchos núcleos en una arquitectura muy particular, se puede ya hacer procesos verdaderamente en paralelo. Sin embargo, hay algo curioso: el paralelismo lo tiene que diseñar el programador y no parece haberse encontrado aún una manera de automatizar esto. Es decir, lo idea sería que un programa se pudiese paralelizar automáticamente, sin tener que indicarle qué procesos son paralelizables y cuales no. Porque es claro que a veces, para que un proceso funcione, puede estar esperando datos de un proceso que está en acción. En el paralelismo el programador identifica las tareas que no tienen esta restricción y que pueden correr independientemente para completar una tarea.

Un ejemplo podría ser un programa que juegue al ajedrez. En todo programa de esa naturaleza la máquina tiene que analizar muchas jugadas y respuestas eventuales. La evaluación de todas esas ramas, de esas variantes diferentes, podría hacerse en términos de la paralelización, pues ninguna valoración depende de otras. Paralelizando la valoración de diversas variantes de ajedrez podríamos llegar a una conclusión sobre cual es la mejor jugada sin tener que pasar cada variante en modo serial,  primero una línea de análisis, después otra, etc.

Hoy en día tenemos procesadores con muchos núcleos pero la paralelización hay que hacerla “a mano“. Eso significa que el programador debe decidir qué se puede paralelizar y poner las instrucciones que permitan al procesador decidir a qué núcleo de los que tenga, darle la tarea 1, 2, etc. para que se ejecuten concurrentemente. Sin embargo, a pesar de que esto se hace de forma manual, se han desarrollado una serie de bibliotecas que bien pueden ayudarnos a paralelizar y así hacer más eficiente nuestros programas.

Así nace OpenCL (Open Computing Language) el cual es una interfaz de programación de aplicaciones y de un lenguaje de programación. Juntos permiten crear aplicaciones con paralelismo a nivel de datos y de tareas que pueden ejecutarse tanto en CPUs como GPUs. El lenguaje está basado en C99, eliminando cierta funcionalidad y extendiéndolo con operaciones vectoriales.

Cabe señalar que Apple creó la especificación original y la propuso al Grupo Khronos para convertirla en un estándar abierto y libre de derechos (primera vez que veo que Apple hace cosas para un estándar abierto, aunque sé que ha incursionado más de una vez en iniciativas de ese tipo. Apple parece malo, pero quizás no lo es tanto).  El 16 de junio de 2008 Khronos creó el Compute Working Group para llevar a cabo el proceso de estandarización. OpenCL forma parte de Mac OS X v10.6 (‘Snow Leopard’). AMD ha decidido apoyar OpenCL en lugar de usar su antigua API.

Ahora ya tenemos la versión OpenCL 1.2, que se liberó el 15 de noviembre del 2011. Da un desempeño y funcionalidad mejorados, en respuesta a la retroalimentación de la comunidad de desarrolladores (por eso estos esquemas de código abierto son tan útiles). Por una parte se matiene la compatibilidad con OpenCL 1.0 y 1.1, pero se añaden nuevas funcionalidades en esta versión 1.2, como son el compartir contenidos, más compatibilidad con las funciones de DirectX 9 y 11, mejoras en el soporte de imágenes, manejadores específicos y kérnel, compilación separada y liga con la programación orientada a objetos.

Así pues, si usted es programador y quiere meterse a este fascinante mundo del paralelismo computacional, no deje de visitar la página oficial de esta iniciativa. Yo creo que esto, a más de uno, le abrirá el panorama sobre lo que hoy el cómputo moderno puede hacer.

Comentarios