Archive for 2014

SIMD. Such fascinating evolution.

¡Hola! :D

En esta ocasión, hablaré sobre el artículo titulado Teaching the SIMD Execution Model: Assembling a Few Parallel Programming Skills escrito por Ariel Ortiz y publicado en las memorias del 34° SIGCSE Technical Symposium on Computer Science Education en febrero del 2003.

En el artículo se habla sobre el modelo Single-Instruction/Multiple-Data (SIMD), el soporte de éste mismo en procesadores Pentium 4 y sobre algunos idioms que pueden ser usados. Primero que nada, hay que recordar que SIMD permite procesar varios elementos de manera simultánea, lo que implica que tendrá un mejor comportamiento que el procesamiento secuencial. En la actualidad, todos los procesadores soportan algún tipo de tecnología SIMD, entre las cuales destacan MMX o SSE (las cuales fueron muy populares cuando fueron lanzadas).

El soporte de SIMD puede verse de muchas maneras. En el caso del Pentium 4, existen 8 registros y dependiendo de cómo utilicemos las instrucciones es la manera en la que vamos a manejar dichos registros. Éstos pueden manejarse de varias maneras, desde palabras de 8 bits hasta palabras de 128 bits o tipos de dato float en C.

Una parte importante del SIMD son los denominados idioms, los cuales son patrones son patrones para soluciones de bajo nivel. Con ellos, se puede entender de una mejor manera como usar SIMD. Estos idioms se pueden considerar como algunas aplicaciones sencillas de SIMD para familiarizarse con el uso de esta tecnología, y cada uno de ellos tiene instrucciones específicas que son necesarias para los mismos y que a su vez ayudan a comprender su funcionamiento individual. Si tomamos de ejemplo el complemento a 2. Para este idiom podemos usar las instrucciones pcmpeqb (comprobar si dos elementos son iguales) y pxor (instrucción XOR), debido a que SIMD no tiene una instrucción NOT. Hay que recordar que para el uso de cualquier operador es importante escribirlo de la forma OPERADOR destino fuente

Finalmente, hay que recordar que como cualquier otra tecnología, es importante que SIMD pueda ser enseñada a estudiantes de ciencias computacionales. Es por ello que utilizar técnicas como idioms puede resultar relevante para realizar otro tipo de proyectos que requieran mayor complejidad, ya que de esta manera, los estudiantes ya tienen un background de ésta tecnología.

Espero esta entrada haya sido de su agrado :)

MapReduce... ¿Quién necesita un mapa?

¡Hola! :D

En esta ocasión hablaré acerca del artículo titulado "MapReduce: Simplified Data Processing on Large Clusters" escrito por Jeffrey Dean y Sanjay Ghemawat, y publicado en el Communications of the ACM en enero del 2008.

Como ya bien sabemos, la cantidad de información contenida en bases de datos se ha incrementado exponencialmente, por lo que las bases de datos relacionales han ido perdiendo efectividad al momento de realizar búsquedas de información. Por eso mismo los modelos relacionales han pasado a segundo plano, dejando lugar a conceptos nuevos como NoSQL y Big Data. Una de las técnicas para buscar información en Big Data es, justamente, MapReduce.

Esta técnica consiste en dos operaciones: map y reduce. Map consiste en tomar una entrada y devolver un conjunto con pares “intermedios” de llaves-valores.  A su vez, este conjunto será pasado como parámetro a la función reduce (que además recibe una llave adicional) para juntar la información realizada por el map. Tanto la función map como la función reduce son definidas por el usuario. Estas dos funciones pueden verse como aquellas que están definidas en lenguajes funcionales como Lisp o Clojure.

La importancia del MapReduce llega cuando hablamos de realizarlo de manera distribuida (es distribuido debido a que tenemos una red de procesadores y no hay una memoria compartida para todos los equipos). De esta manera, se tienen a los “trabajadores” de map realizando esta función, almacenar los resultados temporales en un búfer y posteriormente los “trabajadores” de reduce realizando esta función en un almacenamiento común (por obvias razones, debe haber un maestro que se encargue de coordinar estas operaciones y obtener el resultado final).

Una de las ventajas del MapReduce distribuido, es que si uno de los trabajadores falla, el cálculo se puede volver a hacer bajo ciertas condiciones. El cálculo se debe repetir debido a que solo el equipo que falló tiene acceso a la información que era resultado de la(s) funciones que realizaba, por lo que la información es inalcanzable. Ahora bien, si lo que se estaba realizando era una función map, todo sucede como se describió anteriormente; sin embargo, si se tiene un reduce, se debe revisar si el trabajo ya fue revisado. Si se revisó, entonces se deberá repetir; de lo contrario no hace falta repetir el trabajo. Finalmente cabe mencionar que si la falla se ha presentado en el maestro, simplemente se puede avisar de un error y el usuario puede hacer una nueva petición.

Finalmente, podemos hacer énfasis en que los usuarios de MapReduce pueden encontrarse con pocas problemáticas de sección crítica, ya que si el reduce definido por el usuario no está definido correctamente, existirá una condición de carrera o deadlocks.

Espero que esta entrada haya sido de su agrado :)

Provocando Segmentation Faults con Erlang... Así se aprende :)


¡Hola! :D

En estaentrada hablaré sobre el arículo titulado Teaching Concurrency-Oriented Programming with Erlang escrito por Ariel Ortiz y publicado en las memorias del 42° SIGCSE Technical Symposium on Computer Science Education en marzo del 2011.

En el artículo se habla acerca de problemáticas que se han discutido en entradas anteriores, como lo es la necesidad de comenzar a escribir programas paralelos en lugar de seguir con los programas secuenciales, ya que se necesita aprovechar al máximo todo el procesamiento disponible. Adicionalmente, se tratan conceptos previamente vistos, como definir qué es concurrente, paralelo y distribuido. Además, se recuerdan algunas de las reglas (antes vistas) que se deben seguir para realizar programas paralelos.

La parte importante del artículo viene cuando se habla de la enseñanza de programación concurrente utilizando Erlang. Este lenguaje funcional tiene muchas características que lo vuelven un lenguaje interesante de aprender, que van desde tener su propio REPL, hasta la utilizar pattern matching para realizar el binding de las variables (cosa completamente nueva para mí). En cuanto a performance, hay que considerar a Erlang debido a que es útil para muchas tareas que, personalmente, no me hubiera imaginado y que incluso pueden tener ciertas aplicaciones para el área de especialidad que estoy tomando (redes).

Más adelante se comentan algunos principios de diseño de Erlang para asegurar que los programas sean óptimos. Estos principios van desde usar un número de procesos proporcional al número de procesadores disponibles (y distribuir el trabajo de manera adecuada) hasta asegurarnos de minimizar el tiempo que se espera por una respuesta. Hay que recordar que las operaciones de entrada/salida suelen consumir muchos recursos.

Cabe señalar que Erlang no es un lenguaje perfecto, ya que hay tareas para las que no tiene un desempeño tan bueno y que también sufre de su versión de problemas de programación en paralelo (deadlocks, starvation, etc.).

Ahora bien, en la parte de enseñanza de programación paralela y concurrente, Erlang me parece un lenguaje interesante de aprender, debido a su simplicidad (característica de lenguajes funcionales) y a cómo funciona internamente. En lo personal, me parece que la enseñanza de programación paralela y concurrente se puede volver aún mejor si se toman lenguajes como Clojure y se comparan con Erlang en cuanto a su desempeño en general.

Espero que esta entrada haya sido de su agrado :)

Indie Games FTW!

¡Hola! En esta ocasión escribiré sobre el documental titulado “Indie Game: The Movie” producido por BlinkWorks Media y dirigido por Lisanne Pajot y James Swirsky en el año 2012. Tocaré algunos temas de la película y comentaré un poco sobre el camino que está tomando la industria de los videojuegos en la actualidad.

En la película se le da seguimiento al desarrollo de tres videojuegos independientes: Super Meat Boy, FEZ y Braid. En el caso de Super Meat Boy, se enfrentaban a terminar el juego en un tiempo relativamente corto no solo porque querían ganar dinero, sino porque DEBÍAN ganar dinero, ya que sus fondos se estaban agotando. El caso de FEZ no es muy distinto. Se debía terminar el juego para estar en una convención de videojuegos (PAX) y tener ganancias para terminar con el desarrollo del videojuego y de igual manera obtener ganancias. Adicionalmente, FEZ enfrentaba problemas legales por la separación de los desarrolladores del juego, lo cual implicaba que si FEZ se presentaba en PAX, podría implicar una demanda. Por otro lado, Braid es un juego que rompió paradigmas en el modo de juego de plataforma tradicional, ya que podríamos considerarlo como un juego a prueba de errores, haciendo que además de ser un juego de plataformas, también pudiese ser considerado un puzzle.

La industria del desarrollo (de videojuegos y en general) es un poco hostil en el aspecto de que las personas involucradas tienen que sacrificar muchas cosas: dinero, tiempo para ellos mismos, horas de sueño e incluso el tipo de alimentación que llevan. Si bien la recompensa final en muchos casos vale la pena, hay que tener en cuenta lo que representan todos estos sacrificios. En este caso no hablamos simplemente de tener poca vida social, sino de repercusiones a la salud por la falta de sueño o alimentación hasta depresión por la falta de contacto con otras personas.

Ahora bien, la industria de los videojuegos está tomando un rumbo interesante. Hace algunos años, hablábamos de pocas empresas (grandes) dedicadas a los videojuegos. Actualmente tenemos empresas pequeñas, medianas, grandes y desarrolladores independientes, sin mencionar los distintos modelos de negocio que existen. Hoy en día, se puede adquirir un videojuego de distintas formas: Comprándolo físicamente, tenerlo en una biblioteca de videojuegos (Steam) o descargarlo de la página oficial del videojuego (League of Legends, Heartstone). Esto puede desencadenar que los videojuegos sean conocidos por más personas y obtengan más ganancias independientemente de ser un juego indie o no.

Esto es todo por ahora. Espero que haya sido de su agrado y les recomiendo jugar juegos independientes. Aunque a veces no lo parezca, pueden llegar a ser muy buenos a pesar de que algunos son cortos.



Welcome to the Jungle, We Got Fun 'n' Games

¡Hola! :)

En esta ocasión hablaré un poco sobre el arículo titulado "Welcome to the Jungle" escrito por Herb Sutter en diciembre del 2011.

El artículo habla acerca como en el “final” de la Ley de Moore, comenzamos a hablar de entregar a los usuarios equipos personales de cómputo paralelo. En tiempos actuales, tenemos que hablar de 3 formas esenciales de procesamiento en múltiples núcleos.

Primero vale la pena hablar acerca del procesamiento con varios núcleos en sus primeras fases. El hecho de que la velocidad de procesamiento de los procesadores no se haya visto mejorada (como en años anteriores), obligó a las empresas a implementar modelos con varios núcleos. Ya se ha hablado de este aspecto en entradas anteriores.

Ahora bien, con el modelo de procesamiento con varios preocesadores, tenemos que recordar la parte de núcleos heterogeneos. Con este modelo, podemos hablar del procesamiento dedicado en varios núcleos. El ejemplo más común es la parte de CPU y GPU, donde el CPU se utiliza para tareas comunes del sistema operativo y el GPU funge como procesamiento de gráficas, permitiendo un mejor uso de los recursos disponibles. Ahora, hablar de paralelismo en CPU y GPU permitiría llevar la optimización de recursos hasta su máxima expresión.

Posteriormente, estamos obligados a tocar el tema de núcleos elásticos para cómputo en nube. La parte de paralelismo y concurrencia es un tema común (sino es que indispensable) en cloud computing. Hay que recordar que una de las técnicas más usadas en la nube es el map-reduce. Con esta técnica, hablamos del crecimiento “scale-out” de los centros de datos. Esto quiere decir que en lugar de concentrarse en un solo dispositivo, el centro de datos tiene varios equipos pequeños siendo usados de manera distribuida. Así, el procesamiento lo hace cada equipo de manera concurrente y una computadora finalmente hace la operación de reduce. Este es uno de los modelos de procesamiento más importantes de la actualidad, ya que funciona con grandes volúmenes de información en tiempos razonables.

Eso es todo por ahora, espero haya sido de su agrado :)


¿Paralelismo? ¿Quieres saber qué significa?

¡Hola! En esta ocasión, discutiré un poco sobre el artículo "Parallel Computing on any desktop", escrito por Ami Marowka, el cual fue publicado en el Communications of the ACM.

El artículo habla acerca de paralelismo aplicado a distintos equipos de cómputo. Hace algunos años, hablar de paralelismo no era muy común. Solamente los equipos con un buen nivel de procesamiento eran los “indicados” para realizar este tipo de tareas. Actualmente, hablar de paralelismo es no solamente común, sino que se ha vuelto una necesidad.

El tema de paralelismo en computadoras que pueden ser adquiridas por personas “comunes” es algo que implícitamente nos hace ver a los programadores que tenemos que explotar todo el procesamiento disponible que existe. Es importante saber que cuando se habla de “explotar”, no se refiere a solamente hacer que el procesador trabaje al máximo de su capacidad, sino que todo lo que el procesador trabaje sea efectivo dentro del programa.

En el artículo se propone como una solución a OpenMP. Hay que recordar a OpenMP como una herramienta poderosa que permite configurar código y permitir la ejecución de ciertas tareas de manera paralela. Si bien existen herramientas tan buenas como OpenMP, hay que recordar que solo es eso: una herramienta. El programador es quien se tiene que hacer cargo de comprender la naturaleza del problema y posteriormente escribir código que sea thread-safe. La parte de comprender el problema es sumamente importante, ya que mientras más se conozca el problema, menor es la probabilidad de sufrir de alguna falla referente a datos que son accesados por varios threads.

Finalmente, hay que remarcar la parte de equipos de cómputo en ámbitos empresariales. Es cierto que a un buen equipo empresarial podría sacar provecho de herramientas como OpenMP. Sin embargo, cuando hablamos de empresas que empiezan a crecer en grandes dimensiones, es necesario explorar otras alternativas, como el cómputo distribuido. Esta solución puede ser vista como “factible”, debido a que el sistema puede estar construido con distintos equipos caseros y que, usando cómputo distribuido, puede ser capaz de procesar grandes volúmenes de información en un periodo de tiempo aceptable.

Eso es todo por ahora, espero haya sido de su agrado :)


Free Lunch? NOT TODAY!


¡Hola!

En esta ocasión, escribiré acerca del artículo titulado: “The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software”, escrito por Herb Sutter para la revista Dr. Dobb's Journal de marzo del 2005. Durante esta entrada, tocaré algunos temas de interés como lo son ley de Moore, arquitecturas de varios núcleos/hyper-threading y la respuesta de los desarrolladores de software.

Durante muchos años, la ley de Moore se cumplió de manera casi religiosa, dejando la impresión equivocada de que así sería por mucho tiempo. Por desgracia, no se tuvo en consideración que, como cualquier teoría que se cumplía de manera exponencial, llegaría hasta un punto donde se estancaría. En tiempos recientes, hemos visto como la velocidad de los procesadores no va más allá de los 5 GHz (viéndonos sumamente generosos). Ahora, es importante tocar varios puntos al respecto.

Primero que nada, hay que discutir las expectativas que se tenían para tiempos actuales. Al paso que la velocidad del procesador iba evolucionando, era completamente comprensible que para estos años se esperaran velocidades de entre 10 y 20 GHz. Por desgracia, esto no se cumplió por distintas razones (como el exceso de calor y la dificultad para disiparlo, por ejemplo). Hay que recordar que aunque la ley de Moore no se cumplió para los ciclos de reloj, seguía siendo válida para el número de transistores en un procesador.

Ahora, si sabemos que las expectativas no se cumplieron, debemos preguntarnos ¿cuál fue la solución alternativa? Es aquí donde entran los modelos de procesadores com varios núcleos y técnicas como el hyper-threading. Si bien son técnicas aceptables, hay que tener en cuenta que no es lo mismo tener un procesador de x Hz a tener n procesadores con x/n Hz (el modelo con varios procesadores tendrá un peor desempeño por razones explicadas más adelante).

La parte importante viene ahora. ¿Qué se ha hecho en el ámbito de programación para adapatarse a este cambio? Aunque no sea apreciable a simple vista, el cambio de un solo procesador a estos modelos representa cambios importantes para el desarollo de software. En principio, los programadores desarrollaban software con el pensamiento de que en un futuro cercano existiría un procesador que fuera capaz de correr adecuadamente la aplicación desarrollada. Al cambiar a un paradigma de varios núcleos, es importante tener en cuenta que éstos podrían no aprovecharse al máximo. Es por ello que se debe pensar en posibilidades de hacer los programas de manera paralela. De esta manera, podemos evaluar si paralelizar es una buena solución o es preferible dejar la solución serial.

Esto es todo por ahora, espero esta entrada sea de su agrado. Si es de su interés, pueden encontrar el artículo aquí.

 

¡Que se presente el colado! :P

¡Hola a todos! :D

Esta es mi primera entrada en el blog de Programación Multinúcleo, y ahora que oficialmente ya no soy el colado de la clase, comenzaré dando una breve presentación sobre mi.

* Mi nombre (casi) completo es Edwin A. González (sí, tengo un segundo nombre).
* Al momento de esta entrada tengo 19 años de edad
* Me gusta jugar videojuegos, jugar ultimate frisbee y bailar hip hop
* Algunos de los libros que me gustan son 1984 - Orwell, El Código Da Vinci - Brown, Harry Potter Saga - Rowling, El Extraño Caso del Dr Jekyll y Mr Hyde - Stevenson.
* Casi no veo programas de TV. Las pocas series que veo y me gustan son Criminal Minds, NCIS, The Big Bang Theory, New Girl, The Simpsons.
* Algunas de mis películas favoritas son Despicable Me, Kill Bill (both), Pulp Fiction, V for Vendetta, The Avengers, Rise of the Guardians, Frozen, Wreck It Ralph, Hotel Transylvania, Scary Movies, Iron Man, Sherlock Holmes, Tangled, etcétera.

Del curso de programación multinúcleo, espero aprender acerca de como aprovechar el poder de procesamiento lo mejor posible, obteniendo tiempos de respuesa razonables para problemas que regularmente tomarían una cantidad mayor de tiempo.

Eso es todo por ahora. Espero les haya gustado esta entrada. Si quieren leer un poco más sobre mí, está disponible la sección Sobre el Autor.

- Copyright © Programación Multinúcleo - Hatsune Miku - Powered by Blogger - Designed by Johanes Djogan -