fbpx
Wikipedia

Computación paralela

La computación paralela es una forma de cómputo en la que muchas instrucciones se ejecutan simultáneamente,[1]​ operando sobre el principio de que problemas grandes, a menudo se pueden dividir en unos más pequeños, que luego son resueltos simultáneamente (en paralelo). Hay varias formas diferentes de computación paralela: paralelismo a nivel de bit, paralelismo a nivel de instrucción, paralelismo de datos y paralelismo de tareas. El paralelismo se ha empleado durante muchos años, sobre todo en la computación de altas prestaciones, pero el interés en ella ha crecido últimamente debido a las limitaciones físicas que impiden el aumento de la frecuencia.[n. 1][2]​Como el consumo de energía —y por consiguiente la generación de calor— de las computadoras constituye una preocupación en los últimos años,[n. 2][3]​ la computación en paralelo se ha convertido en el paradigma dominante en la arquitectura de computadores, principalmente en forma de procesadores multinúcleo.[n. 3][4]

La supercomputadora Cray-2 fue la más rápida del mundo desde 1985 hasta 1989.
La supercomputadora paralela Blue Gene de IBM.

Las computadoras paralelas pueden clasificarse según el nivel de paralelismo que admite su hardware: equipos con procesadores multinúcleo y multi-procesador que tienen múltiples elementos de procesamiento dentro de una sola máquina y los clústeres, MPPS y grids que utilizan varios equipos para trabajar en la misma tarea. Muchas veces, para acelerar tareas específicas, se utilizan arquitecturas especializadas de computación en paralelo junto a procesadores tradicionales.

Los programas informáticos paralelos son más difíciles de escribir que los secuenciales,[5]​ porque la concurrencia introduce nuevos tipos de errores de software, siendo las condiciones de carrera los más comunes. La comunicación y sincronización entre diferentes subtareas son algunos de los mayores obstáculos para obtener un buen rendimiento del programa paralelo.

La máxima aceleración posible de un programa como resultado de la paralelización se conoce como la ley de Amdahl.

Conceptos básicos

Tradicionalmente, los programas informáticos se han escrito para el cómputo en serie. Para resolver un problema, se construye un algoritmo y se implementa como un flujo en serie de instrucciones. Estas instrucciones se ejecutan en una unidad central de procesamiento en un ordenador. Sólo puede ejecutarse una instrucción a la vez y un tiempo después de que la instrucción ha terminado, se ejecuta la siguiente.[6]

La computación en paralelo, por el contrario, utiliza simultáneamente múltiples elementos de procesamiento para resolver un problema. Esto se logra mediante la división del problema en partes independientes de modo que cada elemento de procesamiento pueda ejecutar su parte del algoritmo de manera simultánea con los otros. Los elementos de procesamiento son diversos e incluyen recursos tales como una computadora con múltiples procesadores, varios ordenadores en red, hardware especializado, o cualquier combinación de los anteriores.[6]

El aumento de la frecuencia fue la razón dominante de las mejoras en el rendimiento de las computadoras desde mediados de 1980 hasta el año 2004. El tiempo de ejecución de un programa es igual al número de instrucciones multiplicado por el tiempo promedio por instrucción. Manteniendo todo lo demás constante, el aumento de la frecuencia de reloj reduce el tiempo medio que tarda en ejecutarse una instrucción, por tanto un aumento en la frecuencia reduce el tiempo de ejecución de los programas de cómputo.[7]

Sin embargo, el consumo de energía de un chip está dada por la ecuación P = C × V2 × F, donde P es la potencia, C es el cambio de capacitancia por ciclo de reloj —proporcional al número de transistores cuyas entradas cambian—, V es la tensión, y F es la frecuencia del procesador (ciclos por segundo).[8]​Un aumento en la frecuencia aumenta la cantidad de energía utilizada en un procesador. El aumento del consumo de energía del procesador llevó a Intel en mayo del 2004 a la cancelación de sus procesadores Tejas y Jayhawk, este hecho generalmente se cita como el fin del escalado de frecuencia como el paradigma dominante de arquitectura de computadores.[9]

La ley de Moore es la observación empírica de que la densidad de transistores en un microprocesador se duplica cada 18 a 24 meses.[10]​ A pesar de los problemas de consumo de energía, y las repetidas predicciones de su fin, la ley de Moore sigue vigente. Con el fin del aumento de la frecuencia, estos transistores adicionales —que ya no se utilizan para el aumento de la frecuencia— se pueden utilizar para añadir hardware adicional que permita la computación paralela.

Ley de Amdahl y ley de Gustafson

 
Representación gráfica de la ley de Amdahl. La mejora en la velocidad de ejecución de un programa como resultado de la paralelización está limitada por la porción del programa que no se puede paralelizar. Por ejemplo, si el 10% del programa no puede paralelizarse, el máximo teórico de aceleración utilizando la computación en paralelo sería de 10x no importa cuántos procesadores se utilicen.

Idealmente, la aceleración a partir de la paralelización es lineal, doblar el número de elementos de procesamiento debe reducir a la mitad el tiempo de ejecución y doblarlo por segunda vez debe nuevamente reducir el tiempo a la mitad. Sin embargo, muy pocos algoritmos paralelos logran una aceleración óptima. La mayoría tienen una aceleración casi lineal para un pequeño número de elementos de procesamiento, y pasa a ser constante para un gran número de elementos de procesamiento.

La aceleración potencial de un algoritmo en una plataforma de cómputo en paralelo está dada por la ley de Amdahl, formulada originalmente por Gene Amdahl en la década de 1960.[11]​ Esta señala que una pequeña porción del programa que no pueda paralelizarse va a limitar la aceleración que se logra con la paralelización. Los programas que resuelven problemas matemáticos o ingenieriles típicamente consisten en varias partes paralelizables y varias no paralelizables (secuenciales). Si   es la fracción de tiempo que un programa gasta en partes no paralelizables, luego

 

es la máxima aceleración que se puede alcanzar con la paralelización del programa. Si la parte secuencial del programa abarca el 10% del tiempo de ejecución, se puede obtener no más de 10× de aceleración, independientemente de cuántos procesadores se añadan. Esto pone un límite superior a la utilidad de añadir más unidades de ejecución paralelas. «Cuando una tarea no puede divididirse debido a las limitaciones secuenciales, la aplicación de un mayor esfuerzo no tiene efecto sobre la programación. La gestación de un niño toma nueve meses, no importa cuántas mujeres se le asigne».[12]

La ley de Gustafson es otra ley en computación que está en estrecha relación con la ley de Amdahl.[13]​ Señala que el aumento de velocidad con   procesadores es

 
Supongamos que una tarea tiene dos partes independientes, A y B. B tarda aproximadamente 25% del tiempo total. Con esfuerzo adicional, un programador puede hacer esta parte cinco veces más rápida, pero esto reduce el tiempo de cálculo global por muy poco. Por otro lado, puede que sea necesario poco trabajo para hacer que la parte A sea doble de rápida. Esto haría el cálculo mucho más rápido que mediante la optimización de la parte B, a pesar de que B tiene una mayor aceleración (5x frente a 2×).
 

Ambas leyes asumen que el tiempo de funcionamiento de la parte secuencial del programa es independiente del número de procesadores. La ley de Amdahl supone que todo el problema es de tamaño fijo, por lo que la cantidad total de trabajo que se hará en paralelo también es independiente del número de procesadores, mientras que la ley de Gustafson supone que la cantidad total de trabajo que se hará en paralelo varía linealmente con el número de procesadores.

Dependencias

Entender la dependencia de datos es fundamental en la implementación de algoritmos paralelos. Ningún programa puede ejecutar más rápidamente que la cadena más larga de cálculos dependientes (conocida como la ruta crítica), ya que los cálculos que dependen de cálculos previos en la cadena deben ejecutarse en orden. Sin embargo, la mayoría de los algoritmos no consisten sólo de una larga cadena de cálculos dependientes; generalmente hay oportunidades para ejecutar cálculos independientes en paralelo.

Sea Pi y Pj dos segmentos del programa. Las condiciones de Bernstein[14]​ describen cuando los dos segmentos son independientes y pueden ejecutarse en paralelo. Para Pi, sean Ii todas las variables de entrada y Oi las variables de salida, y del mismo modo para Pj. P i y Pj son independientes si satisfacen

  •  
  •  
  •  

Una violación de la primera condición introduce una dependencia de flujo, correspondiente al primer segmento que produce un resultado utilizado por el segundo segmento. La segunda condición representa una anti-dependencia, cuando el segundo segmento (Pj) produce una variable que necesita el primer segmento (Pi). La tercera y última condición representa una dependencia de salida: Cuando dos segmentos escriben en el mismo lugar, el resultado viene del último segmento ejecutado.[15]

Considere las siguientes funciones, que demuestran varios tipos de dependencias:

1: función Dep(a, b) 2: c: = a · b 3: d: = 3 · c 4: fin función 

La operación 3 en Dep(a, b) no puede ejecutarse antes de —o incluso en paralelo con— la operación 2, ya que en la operación 3 se utiliza un resultado de la operación 2. Esto viola la condición 1, y por tanto introduce una dependencia de flujo.

1: función NoDep (a, b) 2: c: = a · b 3: d: b = 3 · 4: e: = a + b 5: fin función 

En este ejemplo, no existen dependencias entre las instrucciones, por lo que todos ellos se pueden ejecutar en paralelo.

Las condiciones de Bernstein no permiten que la memoria se comparta entre los diferentes procesos. Por esto son necesarios algunos medios que impongan un ordenamiento entre los accesos tales como semáforos, barreras o algún otro método de sincronización.

Condiciones de carrera, exclusión mutua, sincronización, y desaceleración paralela

Las subtareas en un programa paralelo a menudo son llamadas hilos. Algunas arquitecturas de computación paralela utilizan versiones más pequeñas y ligeras de hilos conocidas como hebras, mientras que otros utilizan versiones más grandes conocidos como procesos. Sin embargo, «hilos» es generalmente aceptado como un término genérico para las subtareas. Los hilos a menudo tendrán que actualizar algunas variables que se comparten entre ellos. Las instrucciones entre los dos programas pueden entrelazarse en cualquier orden. Por ejemplo, considere el siguiente programa:

Hilo A Hilo B
1A: Lee variable V 1B: Lee variable V
2A: Añadir 1 a la variable V 2B: Añadir 1 a la variable V
3A: Escribir en la variable V 3B: Escribir en la variable V

Si la instrucción 1B se ejecuta entre 1A y 3A, o si la instrucción 1A se ejecuta entre 1B y 3B, el programa va a producir datos incorrectos. Esto se conoce como una condición de carrera. El programador debe utilizar un bloqueo (lock) para proporcionar exclusión mutua. Un bloqueo es una construcción del lenguaje de programación que permite a un hilo de tomar el control de una variable y evitar que otros hilos la lean o escriban, hasta que la variable esté desbloqueado. El hilo que mantiene el bloqueo es libre de ejecutar su sección crítica —la sección de un programa que requiere acceso exclusivo a alguna variable—, y desbloquear los datos cuando termine. Por lo tanto, para garantizar la correcta ejecución del programa, el programa anterior se puede reescribir usando bloqueos:

Hilo A Hilo B
1A: Bloquear variable V 1B: Bloquear variable V
2A: Lee variable V 2B: Lee variable V
3A: Añadir 1 a la variable V 3B: Añadir 1 a la variable V
4A: Escribir en la variable V 4B: Escribir en la variable V
5A: Desbloquear variable V 5B: Desbloquear variable V

Un hilo bloqueará con éxito la variable V, mientras que el otro hilo no podrá continuar hasta que V se desbloquee. Esto garantiza la correcta ejecución del programa. Si bien los bloqueos son necesarios para asegurar la ejecución correcta del programa, pueden ralentizar en gran medida un programa.

Bloquear múltiples variables utilizando cerraduras no atómicas introduce la posibilidad de que el programa alcance un bloqueo mutuo (deadlock). Un bloqueo atómico bloquea múltiples variables a la vez, si no puede bloquearlas todas, no se bloquea ninguna de ellas. Si hay dos hilos y cada uno necesita bloquear las mismas dos variables utilizando cerraduras no atómicas, es posible que un hilo bloquee uno de ellas y el otro bloquee la segunda variable. En tal caso se produce un bloqueo mutuo donde ningún hilo puede completar la ejecución.

Muchos programas paralelos requieren que sus subtareas actúen en sincronía. Esto requiere el uso de una barrera. Las barreras se implementan normalmente mediante un bloqueo. Una clase de algoritmos, conocida como algoritmos libres de bloqueo y libres de espera, evitan el uso de bloqueos y barreras. Sin embargo, este enfoque es generalmente difícil de implementar y requiere estructuras de datos correctamente diseñadas.

No todas las paralelizaciones conllevan una aceleración. Por lo general, mientras una tarea se divida en cada vez más hilos, estos hilos pasan una porción cada vez mayor de su tiempo comunicándose entre sí. Eventualmente, la sobrecarga de comunicación domina el tiempo empleado para resolver el problema, y la paralelización adicional —dividir la carga de trabajo entre incluso más hilos— aumenta la cantidad de tiempo requerido para terminar. Esto se conoce como desaceleración paralela.

Paralelismo de grano fino, grano grueso y paralelismo vergonzoso

Las aplicaciones a menudo se clasifican según la frecuencia con que sus subtareas se sincronizan o comunican entre sí. Una aplicación muestra un paralelismo de grano fino si sus subtareas deben comunicase muchas veces por segundo, se considera paralelismo de grano grueso si no se comunican muchas veces por segundo, y es vergonzosamente paralelo si nunca o casi nunca se tienen que comunicar. Aplicaciones vergonzosamente paralelas son consideradas las más fáciles de paralelizar.

Modelos de consistencia

 
Leslie Lamport definió por primera vez el concepto de consistencia secuencial. También es conocido por su trabajo en el desarrollo del software LaTeX.

Los lenguajes de programación en paralelo y computadoras paralelas deben tener un modelo de consistencia de datos —también conocido como un modelo de memoria—. El modelo de consistencia define reglas para las operaciones en la memoria del ordenador y cómo se producen los resultados.

Uno de los primeros modelos de consistencia fue el modelo de consistencia secuencial de Leslie Lamport. La consistencia secuencial es la propiedad de un programa en la que su ejecución en paralelo produce los mismos resultados que un programa secuencial. Específicamente, es un programa secuencial consistente si «... los resultados de una ejecución son los mismos que se obtienen si las operaciones de todos los procesadores son ejecutadas en un orden secuencial, y las operaciones de cada procesador individual aparecen en esta secuencia en el orden especificado por el programa».[16]

La memoria transaccional es un tipo de modelo de consistencia. La memoria transaccional toma prestado de la teoría de base de datos el concepto de transacciones atómicas y las aplica a los accesos a memoria.

Matemáticamente, estos modelos se pueden representar de varias maneras. Las Redes de Petri, que se introdujeron en 1962 como tesis doctoral de Carl Adam Petri, fueron un primer intento de codificar las reglas de los modelos de consistencia. Más tarde fueron creadas las arquitecturas de flujo de datos para implementar físicamente las ideas de la teoría del flujo de datos. A principios de la década de 1970, los cálculos de procesos tales como la Comunicación de Sistemas y Comunicación de Procesos Secuenciales se desarrollaron para permitir un razonamiento algebraico sobre sistemas compuestos por elementos que interactúan entre sí. Adiciones más recientes a la familia de cálculo de proceso, como el cálculo-π, han añadido la capacidad para razonar acerca de las topologías dinámicas. Lógicas tales como la TLA+ de Lamport, y modelos matemáticos se han desarrollado para describir el comportamiento de sistemas concurrentes.

Taxonomía de Flynn

Michael J. Flynn creó uno de los primeros sistemas de clasificación de computadoras, programas paralelos y secuenciales, ahora conocida como la taxonomía de Flynn. Flynn clasifica los programas y computadoras atendiendo a si están operando con uno o varios conjuntos de instrucciones y si esas instrucciones se utilizan en una o varias series de datos.

Instrucción individual Instrucción múltiple
Datos individuales SISD MISD
Múltiples datos SIMD MIMD

La clasificación instrucción-única-dato-único (SISD) es equivalente a un programa totalmente secuencial. La clasificación instrucción-única-datos-múltiples (SIMD) es análoga a hacer la misma operación varias veces sobre un conjunto de datos grande. Esto se hace comúnmente en aplicaciones de procesamiento de señales. Instrucciones-múltiples-dato-único (MISD) es una clasificación que rara vez se utiliza. A pesar de que se diseñaron arquitecturas de computadoras en esta categoría —como arreglos sistólicos—, muy pocas aplicaciones se materializaron. Los programas instrucciones-múltiples-datos-múltiples (MIMD) constituyen el tipo más común de programas paralelos.

Según David A. Patterson y John L. Hennessy, «Algunas máquinas son híbridos de estas categorías, por supuesto, este modelo clásico ha sobrevivido porque es simple, fácil de entender, y da una buena primera aproximación. Además, es, tal vez por su comprensibilidad, el esquema más utilizado.»[17]

Tipos de paralelismo

Paralelismo a nivel de bit

Desde el advenimiento de la integración a gran escala (VLSI) como tecnología de fabricación de chips de computadora en la década de 1970 hasta alrededor de 1986, la aceleración en la arquitectura de computadores se lograba en gran medida duplicando el tamaño de la palabra en la computadora, la cantidad de información que el procesador puede manejar por ciclo.[18]​ El aumento del tamaño de la palabra reduce el número de instrucciones que el procesador debe ejecutar para realizar una operación en variables cuyos tamaños son mayores que la longitud de la palabra. Por ejemplo, cuando un procesador de 8 bits debe sumar dos enteros de 16 bits, el procesador primero debe adicionar los 8 bits de orden inferior de cada número entero con la instrucción de adición, a continuación, añadir los 8 bits de orden superior utilizando la instrucción de adición con acarreo que tiene en cuenta el bit de acarreo de la adición de orden inferior, en este caso un procesador de 8 bits requiere dos instrucciones para completar una sola operación, en donde un procesador de 16 bits necesita una sola instrucción para poder completarla.

Históricamente, los microprocesadores de 4 bits fueron sustituidos por unos de 8 bits, luego de 16 bits y 32 bits, esta tendencia general llegó a su fin con la introducción de procesadores de 64 bits, lo que ha sido un estándar en la computación de propósito general durante la última década.

Paralelismo a nivel de instrucción

 
Un pipeline canónico de cinco etapas en una máquina RISC (IF = Pedido de Instrucción, ID = Decodificación de instrucción, EX = Ejecutar, MEM = Acceso a la memoria, WB = Escritura)

Un programa de ordenador es, en esencia, una secuencia de instrucciones ejecutadas por un procesador. Estas instrucciones pueden reordenarse y combinarse en grupos que luego son ejecutadas en paralelo sin cambiar el resultado del programa. Esto se conoce como paralelismo a nivel de instrucción. Los avances en el paralelismo a nivel de instrucción dominaron la arquitectura de computadores desde mediados de 1980 hasta mediados de la década de 1990.[19]

Los procesadores modernos tienen ''pipeline'' de instrucciones de varias etapas. Cada etapa en el pipeline corresponde a una acción diferente que el procesador realiza en la instrucción correspondiente a la etapa; un procesador con un pipeline de N etapas puede tener hasta n instrucciones diferentes en diferentes etapas de finalización. El ejemplo canónico de un procesador segmentado es un procesador RISC, con cinco etapas: pedir instrucción, decodificar, ejecutar, acceso a la memoria y escritura. El procesador Pentium 4 tenía un pipeline de 35 etapas.[20]

 
Un procesador superescalar con pipeline de cinco etapas, capaz de ejecutar dos instrucciones por ciclo. Puede tener dos instrucciones en cada etapa del pipeline, para un total de hasta 10 instrucciones (se muestra en verde) ejecutadas simultáneamente.

Además del paralelismo a nivel de instrucción del pipelining, algunos procesadores pueden ejecutar más de una instrucción a la vez. Estos son conocidos como procesadores superescalares. Las instrucciones pueden agruparse juntas sólo si no hay dependencia de datos entre ellas. El scoreboarding y el algoritmo de Tomasulo —que es similar a scoreboarding pero hace uso del renombre de registros— son dos de las técnicas más comunes para implementar la ejecución fuera de orden y la paralelización a nivel de instrucción.

Paralelismo de datos

El paralelismo de datos es el paralelismo inherente en programas con ciclos, que se centra en la distribución de los datos entre los diferentes nodos computacionales que deben tratarse en paralelo. «La paralelización de ciclos conduce a menudo a secuencias similares de operaciones —no necesariamente idénticas— o funciones que se realizan en los elementos de una gran estructura de datos».[21]​ Muchas de las aplicaciones científicas y de ingeniería muestran paralelismo de datos.

Una dependencia de terminación de ciclo es la dependencia de una iteración de un ciclo en la salida de una o más iteraciones anteriores. Las dependencias de terminación de ciclo evitan la paralelización de ciclos. Por ejemplo, considere el siguiente pseudocódigo que calcula los primeros números de Fibonacci:

1: PREV1 := 0 2: PREV2 := 1 3: do: 4: CUR := PREV1 + PREV2 5: PREV1 := PREV2 6: PREV2 := CUR 7: while (CUR < 10) 

Este bucle no se puede paralelizar porque CUR depende de sí mismo (PREV2) y de PREV1, que se calculan en cada iteración del bucle. Dado que cada iteración depende del resultado de la anterior, no se pueden realizar en paralelo. A medida que el tamaño de un problema se hace más grande, la paralelización de datos disponible generalmente también lo hace.[22]

Paralelismo de tareas

El paralelismo de tareas es la característica de un programa paralelo en la que «cálculos completamente diferentes se pueden realizar en cualquier conjunto igual o diferente de datos».[21]​ Esto contrasta con el paralelismo de datos, donde se realiza el mismo cálculo en distintos o mismos grupos de datos. El paralelismo de tareas por lo general no escala con el tamaño de un problema.[22]

Hardware

Memoria y comunicación

La memoria principal en un ordenador en paralelo puede ser compartida —compartida entre todos los elementos de procesamiento en un único espacio de direcciones—, o distribuida —cada elemento de procesamiento tiene su propio espacio local de direcciones—.[23]​El término memoria distribuida se refiere al hecho de que la memoria se distribuye lógicamente, pero a menudo implica que también se distribuyen físicamente. La memoria distribuida-compartida y la virtualización de memoria combinan los dos enfoques, donde el procesador tiene su propia memoria local y permite acceso a la memoria de los procesadores que no son locales. Los accesos a la memoria local suelen ser más rápidos que los accesos a memoria no local.

 
Una vista lógica de una arquitectura con acceso a memoria no uniforme (NUMA). Los procesadores en un directorio pueden acceder a la memoria de su directorio con una menor latencia de la que pueden acceder a la memoria del directorio de otro.

Las arquitecturas de ordenador en las que cada elemento de la memoria principal se puede acceder con igual latencia y ancho de banda son conocidas como arquitecturas de acceso uniforme a memoria (UMA). Típicamente, sólo se puede lograr con un sistema de memoria compartida, donde la memoria no está distribuida físicamente. Un sistema que no tiene esta propiedad se conoce como arquitectura de acceso a memoria no uniforme (NUMA). Los sistemas de memoria distribuidos tienen acceso no uniforme a la memoria.

Los sistemas informáticos suelen hacer uso de cachés, pequeños recuerdos rápidos ubicados cerca del procesador que almacenan las copias temporales de los valores de la memoria —cercano, tanto en el sentido físico y lógico—. Los sistemas computacionales paralelos tienen dificultades con las cachés y la posibilidad de una ejecución incorrecta del programa debido a que se puede almacenar el mismo valor en más de un lugar. Estos equipos requieren coherencia en la caché del sistema, generalmente realizan un seguimiento de los valores almacenados en caché y estratégicamente los eliminan, garantizando la correcta ejecución del programa. Bus sniffing es uno de los métodos más comunes para hacer el seguimiento de los valores a los que se está accediendo. El diseño de grandes sistemas de coherencia caché y de alto rendimiento es un problema muy difícil en arquitectura de computadores. Como resultado, las arquitecturas de memoria compartida no son tan escalables como los sistemas de memoria distribuida.[23]

La comunicación procesador-procesador y procesador-memoria se puede implementar en hardware de varias maneras: a través de memoria compartida —ya sea multipuerto o multiplexado—, un conmutador de barras cruzadas (crossbar switch), un bus compartido o una red interconectada de una gran variedad de topologías como estrella, anillo, árbol, hipercubo, hipercubo grueso —un hipercubo con más de un procesador en un nodo—, o de malla n-dimensional.

Las computadoras paralelas basadas en redes interconectadas deben tener algún tipo de enrutamiento para permitir el paso de mensajes entre nodos que no están conectados directamente. Es probable que el medio utilizado para la comunicación entre los procesadores de grandes máquinas multiprocesador sea jerárquico.

Clases de computadoras paralelas

Las computadoras paralelas se pueden clasificar de acuerdo con el nivel en el que el hardware soporta paralelismo. Esta clasificación es análoga a la distancia entre los nodos básicos de cómputo. Estos no son excluyentes entre sí, por ejemplo, los grupos de multiprocesadores simétricos son relativamente comunes.

Computación multinúcleo

Un procesador multinúcleo es un procesador que incluye múltiples unidades de ejecución (núcleos) en el mismo chip. Los procesadores superescalares pueden ejecutar múltiples instrucciones por ciclo de un flujo de instrucciones (hilo), a diferencia de este, un procesador multinúcleo puede ejecutar múltiples instrucciones por ciclo de secuencias de instrucciones múltiples. Cada núcleo en un procesador multinúcleo potencialmente puede ser superescalar, es decir, en cada ciclo, cada núcleo puede ejecutar múltiples instrucciones de un flujo de instrucciones.

El ''Multithreading'' simultáneo —de la cual Intel HyperThreading es el más conocido— era una forma de pseudo-multinúcleo. Un procesador con capacidad de multithreading simultáneo tiene una sola unidad de ejecución (núcleo), pero cuando esa unidad de ejecución está desocupada —por ejemplo, durante un error de caché—, se utiliza para procesar un segundo hilo. El microprocesador Cell de IBM, diseñado para su uso en la consola Sony PlayStation 3, es otro prominente procesador multinúcleo.

Multiprocesamiento simétrico

Un multiprocesador simétrico (SMP) es un sistema computacional con múltiples procesadores idénticos que comparten memoria y se conectan a través de un bus.[24]​ La contención del bus previene el escalado de esta arquitectura. Como resultado, los SMPs generalmente no comprenden más de 32 procesadores.[25]​ «Debido al pequeño tamaño de los procesadores y de la significativa reducción en los requisitos de ancho de banda de bus, tales multiprocesadores simétricos son extremadamente rentables, siempre que exista una cantidad suficiente de ancho de banda».[24]

Computación en clúster
 
Un clúster Beowulf.

Un clúster es un grupo de ordenadores débilmente acoplados que trabajan en estrecha colaboración, de modo que en algunos aspectos pueden considerarse como un solo equipo.[26]​ Los clústeres se componen de varias máquinas independientes conectadas por una red. Mientras que las máquinas de un clúster tienen que ser simétricas, de no serlo, el balance de carga es más difícil de lograr. El tipo más común de clúster es el cluster Beowulf, que es un clúster implementado con múltiples ordenadores comerciales idénticos conectados a una red de área local TCP/IP Ethernet.[27]​ La tecnología Beowulf fue desarrollada originalmente por Thomas Sterling y Donald Becker. La gran mayoría de los superordenadores TOP500 son clústeres.[n. 4][28]

Procesamiento paralelo masivo

Un procesador paralelo masivo (MPP) es un solo equipo con varios procesadores conectados en red. Tienen muchas de las características de los clúster, pero cuentan con redes especializadas de interconexión —en tanto que las clústeres utilizan hardware estándar para la creación de redes—. Los MPPs también tienden a ser más grandes que los clústeres, con «mucho más» de 100 procesadores.[29]​ En un MPP, «cada CPU tiene su propia memoria y una copia del sistema operativo y la aplicación. Cada subsistema se comunica con los demás a través de un interconexión de alta velocidad».[30]

 
Un gabinete de Blue Gene/L, clasificado como el cuarto mejor superordenador del mundo de acuerdo a la clasificación TOP500 en 11/2008. Blue Gene/L es un procesador masivamente paralelo.
Computación distribuida

La computación distribuida es la forma más distribuida de la computación paralela. Se hace uso de ordenadores que se comunican a través de la Internet para trabajar en un problema dado. Debido al bajo ancho de banda y la latencia extremadamente alta de Internet, la computación distribuida normalmente sólo se refiere a problemas vergonzosamente paralelos. Se han creado muchas aplicaciones de computación distribuida, SETI@home y Folding@home son los ejemplos más conocidos.[31]

La mayoría de las aplicaciones de computación distribuida utilizan middleware, software que se encuentra entre el sistema operativo y la aplicación para administrar los recursos de red y estandarizar la interfaz de software. El más común es la Infraestructura Abierta de Berkeley para Computación en Red (BOINC). A menudo, los programas de computación distribuida hacen uso de «ciclos de repuesto», realizando cálculos cuando el procesador de un equipo está desocupado.

Computadoras paralelas especializadas

Dentro de la computación paralela, existen dispositivos paralelos especializados que generan interés. Aunque no son específicos para un dominio, tienden a ser aplicables sólo a unas pocas clases de problemas paralelos.

Cómputo reconfigurable con arreglos de compuertas programables

El cómputo reconfigurable es el uso de un arreglo de compuertas programables (FPGA) como coprocesador de un ordenador de propósito general. Un FPGA es, en esencia, un chip de computadora que puede reconfigurarse para una tarea determinada.

Los FPGAs se pueden programar con lenguajes de descripción de hardware como VHDL o Verilog. Sin embargo, los lenguajes de programación pueden ser tediosos. Varios vendedores han creado lenguajes «C a HDL» que tratan de emular la sintaxis y/o semántica del lenguaje de programación C, con el que la mayoría de los programadores están familiarizados. Los lenguajes «C a HDL» más conocidos son Mitrion-C, C Impulse, DIME C y C-Handel. También se pueden utilizar para este propósito subconjuntos específicos de SystemC basados en C++.

La decisión de AMD de abrir HyperTransport a otros fabricantes la ha convertido en la tecnología que permite la computación reconfigurable de alto rendimiento.[32]​ De acuerdo con Michael D'Amour R., Director de Operaciones de la DRC Computer Corporation, «cuando entramos en AMD, nos llamaban ladrones de zócalos. Ahora nos llaman socios».[32]

Cómputo de propósito general en unidades de procesamiento gráfico (GPGPU)
 
Tarjeta Nvidia Tesla GPGPU

El cómputo de propósito general en las unidades de procesamiento de gráficos (GPGPU) es una tendencia relativamente reciente en la investigación de ingeniería informática. Los GPUs son co-procesadores que han sido fuertemente optimizados para procesamiento de gráficos por computadora.[33]​ El procesamiento de gráficos por computadora es un campo dominado por operaciones sobre datos en paralelo, en particular de álgebra lineal y operaciones con matrices.

Al principio, los programas de GPGPU normalmente utilizaban el API de gráficos para ejecutar programas. Sin embargo, varios nuevos lenguajes de programación y plataformas se han construido para realizar cómputo de propósito general sobre GPUs, tanto Nvidia como AMD han liberado de entornos de programación con CUDA y Stream SDK, respectivamente. Otros lenguajes de programación de GPU incluyen: BrookGPU, PeakStream y RapidMind. Nvidia también ha lanzado productos específicos para la computación en su serie Tesla. El consorcio de tecnología Khronos Group ha lanzado OpenCL, que es un marco para la escritura de programas que se ejecutan en distintas plataformas conformadas por CPUs y GPUs. AMD, Apple, Intel, Nvidia y otros están apoyando OpenCL.

Circuitos integrados de aplicación específica

Se han diseñado varios circuitos integrados de aplicación específica (ASIC) para hacer frente a las aplicaciones paralelas.[34][35][36]

Debido a que un ASIC (por definición) es específico para una aplicación dada, puede ser completamente optimizado para esa aplicación. Como resultado, para una aplicación dada, un ASIC tiende a superar a un ordenador de propósito general. Sin embargo, los ASICs son creados con litografía de rayos X. Este proceso requiere una máscara, que puede ser extremadamente cara. Una máscara puede costar más de un millón de dólares.[n. 5][37]​ Mientras más pequeño sean los transistores necesarios para el chip, más cara será la máscara. Mientras tanto, el incremento del rendimiento en computadoras de propósito general —como se describe en la Ley de Moore— tiende a eliminar esta diferencia en sólo una o dos generaciones de chips.[32]​ El alto costo inicial, y la tendencia a ser superados por la ley de Moore, ha hecho inviable el uso de ASICs para la mayoría de las aplicaciones paralelas. Sin embargo, algunos han sido construidos, un ejemplo es el peta-flop RIKEN MDGRAPE-3 de la máquina que utiliza ASICs para la simulación de dinámica molecular.

Procesadores vectoriales
 
Cray-1 es el procesador vectorial más famoso.

Un procesador vectorial es un CPU o un sistema computacional que puede ejecutar la misma instrucción en grandes conjuntos de datos. «Los procesadores vectoriales tienen operaciones de alto nivel que trabajan sobre arreglos lineales de números o vectores. Un ejemplo de operación con vectores es: A = B × C, donde A, B, y C son vectores de 64 elementos, donde cada uno es un número de punto flotante de 64 bits».[38]​ Están estrechamente relacionadas con la clasificación SIMD de Flynn.[38]

Las computadoras Cray se volvieron famosas por su procesamiento de vectores en los años 1970 y 1980. Sin embargo, los procesadores vectoriales, tanto CPUs como sistemas computacionales, han desaparecido. Los conjuntos de instrucciones de los procesadores modernos incluyen algunas instrucciones de procesamiento de vectores, por ejemplo: AltiVec y Streaming SIMD Extensions (SSE).

Software

Lenguajes de programación en paralelo

Los lenguajes de programación concurrentes, bibliotecas, APIs y modelos de programación paralela han sido creados para la programación de computadores paralelos. Estos generalmente se pueden dividir en clases basadas en las suposiciones que se hacen sobre la arquitectura de memoria subyacente: compartida, distribuida, o compartida-distribuida. Los lenguajes de programación de memoria compartida se comunican mediante la manipulación de variables en la memoria compartida. En la arquitectura con memoria distribuida se utiliza el paso de mensajes. POSIX Threads y OpenMP son dos de las API más utilizadas con la memoria compartida, mientras que Message Passing Interface (MPI) «Interfaz de Paso de Mensajes» es el API más utilizado en los sistemas de paso de mensajes.[n. 6][39]​ El concepto «valor futuro» es muy utilizado en la programación de programas paralelos, donde una parte de un programa promete proporcionar un dato requerido a otra parte del programa en un tiempo futuro.

Las empresas CAPS entreprise y Pathscale están intentando convertir las directivas de HMPP (Hybrid Multicore Parallel Programming) en un estándar abierto denominado OpenHMPP. El modelo de programación OpenHMPP basado en directivas ofrece una sintaxis para descargar de manera eficiente los cálculos sobre aceleradores de hardware y optimizar el movimiento de datos hacia y desde la memoria del hardware. Las directivas OpenHMPP describen llamadas a procedimientos remotos (RPC) en un dispositivo acelerador —por ejemplo el GPU— o de forma más general un conjunto de núcleos. Las directivas permiten anotar código C o Fortran para describir dos grupos de funcionalidades: la descarga de los procedimientos en un dispositivo remoto y la optimización de las transferencias de datos entre la memoria principal de la CPU y la memoria del acelerador.

Paralelización automática

La paralelización automática de un programa secuencial por un compilador es el santo grial de la computación paralela. A pesar de décadas de trabajo por parte de los investigadores, la paralelización automática ha tenido un éxito limitado.[n. 7][40]

Los principales lenguajes de programación en paralelo permanecen explícitamente paralelos o en el mejor de los casos parcialmente implícitos, en los que un programador le da al compilador directivas de paralelización. Existen pocos lenguajes de programación paralelos totalmente implícitos: SISAL, Parallel Haskell, y (para FPGAs) Mitrion C.

Punto de control

Mientras un sistema computacional crece en complejidad, el tiempo medio entre fallos por lo general disminuye. Un punto de control de aplicación es una técnica mediante la cual el sistema informático toma una «instantánea» de la aplicación, un registro de todas las asignaciones actuales de recursos y estados variables, semejante a un volcado de memoria, esta información se puede utilizar para restaurar el programa si el equipo falla. Disponer de un punto de control significa que el programa puede reiniciar desde este y no desde el principio. Mientras que los puntos de control proporcionan beneficios en una variedad de situaciones, son especialmente útiles en los sistemas altamente paralelos con un gran número de procesadores que son utilizados en la computación de altas prestaciones.[41]

Métodos algorítmicos

Mientras que las computadoras paralelas se hacen más grandes y más rápidas, se hace factible resolver problemas que antes tardaban demasiado tiempo en ejecutarse. La computación en paralelo se utiliza en una amplia gama de campos, desde la bioinformática (plegamiento de proteínas y análisis de secuencia) hasta la economía (matemática financiera). Los tipos de problemas encontrados comúnmente en las aplicaciones de computación en paralelo son:[42]

Historia

 
ILLIAC IV, «quizás el más infame de los superordenadores»[43]

Los orígenes del verdadero paralelismo (MIMD) se remontan a Federico Luigi, Menabrea Conte y su «Bosquejo de la máquina analítica inventada por Charles Babbage».[44][45]​ IBM introdujo el IBM 704 en 1954, a través de un proyecto en el que Gene Amdahl fue uno de los principales arquitectos. Se convirtió en el primer equipo disponible en el mercado que utilizaba comandos aritméticos de punto flotante totalmente automáticos.[46]

En abril de 1958, S. Gill (Ferranti) analizó la programación en paralelo y la necesidad de la ramificación y la espera.[47]​ También en 1958, los investigadores de IBM John Cocke y Daniel Slotnick discutieron por primera vez el uso del paralelismo en cálculos numéricos.[48]Burroughs Corporation presentó la D825 en 1962, un equipo de cuatro procesadores que accede a un máximo de 16 módulos de memoria a través de un conmutador de barras cruzadas.[49]​ En 1967, Amdahl y Slotnick publicaron un debate sobre la viabilidad de procesamiento en paralelo en la Conferencia de la Federación Americana de Sociedades de Procesamiento de la Información.[48]​ Fue durante este debate que la Ley de Amdahl fue acuñada para definir los límites de aceleración que se pueden alcanzar debido al paralelismo.

En 1969, la compañía estadounidense Honeywell introdujo su primer sistema Multics, un sistema con multiprocesador simétrico capaz de ejecutar hasta ocho procesadores en paralelo.[48]​En 1970, C.mmp, un proyecto en la Universidad Carnegie Mellon con varios procesadores, fue «uno de los primeros multiprocesadores con más de unos pocos procesadores».[45]​ «El primer bus con conexión multi-procesador y caché espía fue el Synapse N+1 en el año 1984».[45]

Las computadoras paralelas SIMD se remontan a la década de 1970. La motivación detrás de las primeras computadoras SIMD era amortizar el retardo de la compuerta de la unidad de control del procesador en múltiples instrucciones.[50]​ En 1964, Slotnick había propuesto la construcción de un ordenador masivamente paralelo para el Laboratorio Nacional Lawrence Livermore.[48]​ Su diseño fue financiado por la Fuerza Aérea de los Estados Unidos, que fue el primer esfuerzo por lograr la computación en paralelo SIMD.[48]​ La clave de su diseño fue un paralelismo bastante alto, con hasta 256 procesadores, lo que permitió que la máquina trabajara en grandes conjuntos de datos en lo que más tarde sería conocido como el procesamiento de vectores. Sin embargo, ILLIAC IV fue llamado «el más infame de los superordenadores», pues solo se había completado una cuarta parte del proyecto. Tardó 11 años, costando casi cuatro veces la estimación original.[n. 8][43]​ Cuando estaba listo para ejecutar una aplicación real por primera vez en 1976, fue superado por supercomputadoras comerciales, como el Cray-1.

Notas

  1. Las técnicas principales para lograr estas mejoras de rendimiento —mayor frecuencia de reloj y arquitecturas cada vez más inteligentes y complejas— están golpeando la llamada power wall. La industria informática ha aceptado que los futuros aumentos en rendimiento deben provenir en gran parte del incremento del número de procesadores (o núcleos) en una matriz, en vez de hacer más rápido un solo núcleo.
  2. Antigua [sabiduría convencional]: La energía es gratuita y los transistores son caros. Nueva [sabiduría convencional]: la energía es cara y los transistores son "gratuitos"
  3. Antigua [sabiduría convencional]: incrementar la frecuencia de reloj es el método principal de mejorar el rendimiento del procesador. Nueva [sabiduría convencional]: el incremento del paralelismo es el método principal para mejorar el rendimiento del procesador... Incluso los representantes de Intel, una empresa asociada a la posición: "mayor velocidad de reloj es mejor", advirtió que los enfoques tradicionales para aumentar el rendimiento a través de la maximización de la velocidad de reloj han sido empujados hasta el límite.
  4. En los TOP500 Supercomputing Sites los clústeres alcanzan el 74.60% de las máquinas en la lista.
  5. ...el costo de una máscara y tarjeta de prueba —que es mucho más de $1 millón en los 90nm— crea un amortiguador importante en la innovación basada en semiconductores...
  6. Se referencia la Interfaz de Paso de Mensajes como "la interfaz dominante de HPC"
  7. Sin embargo, el santo grial de la investigación —paralelización automática de programas en serie— todavía tiene que materializarse. Aunque la paralelización automática de ciertas clases de algoritmos se ha demostrado, este éxito ha sido en gran parte limitado a aplicaciones científicas y numéricas con control de flujo predecible —por ejemplo, las estructuras de bucle anidado con un recuento de iteración estáticamente determinado— y patrones de acceso a memoria analizables estáticamente —por ejemplo, recorridos en grandes arreglos multidimensionales de datos de punto flotante—.
  8. Aunque tuvo éxito en impulsar varias tecnologías útiles en proyectos posteriores, el IV ILLIAC no triunfó como ordenador. Los costos se ascendieron de los $8 millones estimados en 1966 a $31 millones en 1972, a pesar de la construcción de sólo un cuarto de la máquina planeada... Fue tal vez la más infame de las supercomputadoras. El proyecto comenzó en 1965 y ejecutó su primera aplicación real en 1976

Referencias

  1. Gottlieb, Allan; Almasi, George S. (1989). Highly parallel computing (en inglés). Redwood City, California.: Benjamin/Cummings. ISBN 0-8053-0177-1. 
  2. (pdf) (en inglés). Universidad de Illinois en Urbana-Champaign. noviembre de 2008. Archivado desde el original el 9 de diciembre de 2008. 
  3. "The Landscape of Parallel Computing Research: A View from Berkeley" (pdf) (en inglés) (UCB/EECS-2006-183). Universidad de California, Berkeley. 18 de diciembre de 2006. 
  4. "The Landscape of Parallel Computing Research: A View from Berkeley" (pdf) (en inglés) (UCB/EECS-2006-183). Universidad de California, Berkeley. 18 de diciembre de 2006. 
  5. Hennessy, John L.; Patterson, David A., Larus, James R. (1999). Computer organization and design : the hardware/software interface (en inglés) (2da edición). San Francisco: Kaufmann. ISBN 1-55860-428-6. 
  6. Barney, Blaise. «Introduction to Parallel Computing» (en inglés). Lawrence Livermore National Laboratory. Consultado el 9 de noviembre de 2007. 
  7. Hennessy, John L.; Patterson, David A. (2002). Computer architecture a quantitative approach. (en inglés) (3ra edición). San Francisco, California: International Thomson. p. 43. ISBN 1-55860-724-2. 
  8. Rabaey, Jan M. (1996). Digital integrated circuits : a design perspective (en inglés). Upper Saddle River, N.J.: Prentice-Hall. p. 235. ISBN 0-13-178609-1. 
  9. Flynn, Laurie J. (8 de mayo de 2004). «Intel Halts Development Of 2 New Microprocessors». New York Times (en inglés). Consultado el 5 de junio de 2012. 
  10. Moore, Gordon E. (1965). (pdf). Electronics Magazine (en inglés). Archivado desde el original el 18 de febrero de 2008. Consultado el 11 de noviembre de 2006. 
  11. Amdahl, Gene M. (18-20 de abril de 1967). «Validity of the single processor approach to achieving large scale computing capabilities». Proceeding AFIPS '67 (Spring) (en inglés): 483-485. doi:10.1145/1465482.1465560. 
  12. Brooks, Frederick P. (1996). The mythical man month essays on software engineering (en inglés) (Anniversary, repr. with corr., 5 edición). Reading, Mass.: Addison-Wesley. ISBN 0-201-83595-9. 
  13. Gustafson, John L. (mayo de 1988). . Communications of the ACM (en inglés) 31 (5): 532-533. doi:10.1145/42411.42415. Archivado desde el original el 27 de septiembre de 2007. 
  14. Bernstein, A. J. (1 de octubre de 1966). «Analysis of Programs for Parallel Processing». IEEE Transactions on Electronic Computers (en inglés). EC-15 (5): 757-763. doi:10.1109/PGEC.1966.264565. 
  15. Roosta, Seyed H. (2000). Parallel processing and parallel algorithms: theory and computation (en inglés). New York, NY [u.a.]: Springer. p. 114. ISBN 0-387-98716-9. 
  16. Lamport, Leslie (1 de septiembre de 1979). «How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs». IEEE Transactions on Computers (en inglés). C-28 (9): 690-691. doi:10.1109/TC.1979.1675439. 
  17. Patterson y Hennessy, p. 748.
  18. Culler et al. p. 15.
  19. Culler et al. p. 15.
  20. Patt, Yale (2004). (wmv) (en inglés). Carnegie Mellon University. Archivado desde el original el 14 de abril de 2008. Consultado el 7 de noviembre de 2007. 
  21. Culler et al. p. 124.
  22. Culler et al. p. 125.
  23. Patterson y Hennessy, p. 713.
  24. Hennessy y Patterson, p. 549.
  25. Patterson y Hennessy, p. 714.
  26. What is clustering? «Webopedia computer dictionary» (en inglés). Consultado el 7 de noviembre de 2007. 
  27. «Beowulf definition» (en inglés). PC Magazine. Consultado el 7 de noviembre de 2007. 
  28. (en inglés). Archivado desde el original el 14 de noviembre de 2007. Consultado el 7 de noviembre de 2007. 
  29. Hennessy y Patterson, p. 537.
  30. MPP Definition (en inglés). PC Magazine. Consultado el 7 de noviembre de 2007. 
  31. Kirkpatrick, Scott (2003). «COMPUTER SCIENCE: Rough Times Ahead». Science (en inglés) 299 (5607): 668-669. PMID 12560537. doi:10.1126/science.1081623. 
  32. Michael R. Chief Operating Officer, DRC Computer Corporation, Invited speaker D'Amour (28 de febrero de 2007). Standard Reconfigurable Computing (en inglés). Universidad de Delaware. 
  33. Sha'Kia, Boggan; Pressel, Daniel M. (agosto de 2007). (pdf) (en inglés). U.S. Army Research Lab. Archivado desde el original el 25 de diciembre de 2016. Consultado el 7 de noviembre de 2007. 
  34. Maslennikov, Oleg (2002). . Lecture Notes in Computer Science 2328/2002 (en inglés): 272. Archivado desde el original el 11 de febrero de 2020. Consultado el 19 de diciembre de 2012. 
  35. Shimokawa, Y.; Y. Fuwa and N. Aramaki (18 al 21 de noviembre de 1991). «A parallel ASIC VLSI neurocomputer for a large number of neurons and billion connections per second speed». International Joint Conference on Neural Networks (en inglés) 3: 2162-2167. ISBN 0-7803-0227-3. doi:10.1109/IJCNN.1991.170708. 
  36. Acken, Kevin P.; Irwin, Mary Jane; Owens, Robert M. (1 de enero de 1998). The Journal of VLSI Signal Processing (en inglés) 19 (2): 97-113. doi:10.1023/A:1008005616596. 
  37. (en inglés). Universidad de California, San Diego. 21 de junio de 2004. Archivado desde el original el 31 de enero de 2008. 
  38. Patterson y Hennessy, p. 751.
  39. (en inglés). Archivado desde el original el 25 de julio de 2011. Consultado el 19 de diciembre de 2012. 
  40. Shen, John Paul; Mikko H. Lipasti (2004). Modern processor design : fundamentals of superscalar processors (en inglés) (1ra edición). Dubuque, Iowa: McGraw-Hill. p. 561. ISBN 0-07-057064-7. 
  41. Padua, David (2011). Encyclopedia of Parallel Computing (en inglés) 4. p. 265. ISBN 0387097651. 
  42. Krste, et al., Asanovic (18 de diciembre de 2006). The Landscape of Parallel Computing Research: A View from Berkeley (pdf) (en inglés) (Technical Report No. UCB/EECS-2006-183). Universidad de California, Berkeley. pp. 17-19. 
  43. Hennessy, Patterson. (en inglés). pp. 749-50.  Falta el |título= (ayuda)
  44. Conte Menabrea Menabrea, L. F., Federico Luigi (1842). «Sketch of the Analytic Engine Invented by Charles Babbage» (en inglés). Bibliothèque Universelle de Genève. Consultado el 7 de noviembre de 2007. 
  45. Patterson y Hennessy, p. 753.
  46. da Cruz, Frank (2003). «Columbia University Computing History: The IBM 704» (en inglés). Columbia University. Consultado el 1 de agosto de 2008. 
  47. Gill, S. (abril de 1958). Parallel Programming (en inglés) 1. Sociedad Británica de Computación: The Computer Journal. pp. 2-10. 
  48. Wilson, Gregory V (1994). «The History of the Development of Parallel Computing» (en inglés). Virginia Tech/Norfolk State University, Interactive Learning with a Digital Library in Computer Science. Consultado el 1 de agosto de 2008. 
  49. Anthes, Gry (19 de noviembre de 2001). . Computerworld (en inglés). Archivado desde el original el 4 de junio de 2008. Consultado el 1 de agosto de 2008. 
  50. Patterson y Hennessy, p. 749.

Bibliografía

  • Singh, David Culler; J.P. (1997). Parallel computer architecture (en inglés) (Nachdr. edición). San Francisco: Morgan Kaufmann Publ. p. 15. ISBN 1-55860-343-3. 
  • Hennessy, John L.; Patterson, David A. (27 de septiembre de 2006). Computer Architecture: A Quantitative Approach [Arquitectura de computadoras: un enfoque cuantitativo] (en inglés) (4ta edición). Morgan Kaufmann. ISBN 0123704901. 
  • Patterson, David A.; Hennessy, John L. (9 de noviembre de 2011). Computer Organization and Design, Fourth Edition: The Hardware/Software Interface [Organización y diseño de computadoras, 4ta edición: La interfaz hardware/software] (en inglés) (4ta edición). Morgan Kaufmann. ISBN 0123747503. 

Lectura adicional

  • Rodriguez, C.; Villagra, M.; Baran, B. (29 de agosto de 2008). «Asynchronous team algorithms for Boolean Satisfiability». Bio-Inspired Models of Network, Information and Computing Systems, 2007. Bionetics 2007. 2nd (en inglés): 66-69. doi:10.1109/BIMNICS.2007.4610083. 

Enlaces externos

  •   Wikilibros alberga un libro o manual sobre Distributed Systems.
  •   Wikimedia Commons alberga una galería multimedia sobre Computación paralela.
  • Computación paralela en Open Directory Project.
  • (en inglés)
  • (en inglés)
  • (en inglés)
  • (en inglés)
  • (en inglés)
  • (en inglés)
  • (en inglés)
  • Parallel and distributed Gr?obner bases computation in JAS (en inglés)
  • Parallel Computing Works Free On-line Book (en inglés)
  • (en inglés)
  • Lawrence Livermore National Laboratory: Introduction to Parallel Computing (en inglés)
  • (en inglés)
  • Frontiers of Supercomputing Free On-line Book Covering topics like algorithms and industrial applications (en inglés)
  • (en inglés)
  •   Datos: Q232661
  •   Multimedia: Parallel computing

computación, paralela, computación, paralela, forma, cómputo, muchas, instrucciones, ejecutan, simultáneamente, operando, sobre, principio, problemas, grandes, menudo, pueden, dividir, unos, más, pequeños, luego, resueltos, simultáneamente, paralelo, varias, f. La computacion paralela es una forma de computo en la que muchas instrucciones se ejecutan simultaneamente 1 operando sobre el principio de que problemas grandes a menudo se pueden dividir en unos mas pequenos que luego son resueltos simultaneamente en paralelo Hay varias formas diferentes de computacion paralela paralelismo a nivel de bit paralelismo a nivel de instruccion paralelismo de datos y paralelismo de tareas El paralelismo se ha empleado durante muchos anos sobre todo en la computacion de altas prestaciones pero el interes en ella ha crecido ultimamente debido a las limitaciones fisicas que impiden el aumento de la frecuencia n 1 2 Como el consumo de energia y por consiguiente la generacion de calor de las computadoras constituye una preocupacion en los ultimos anos n 2 3 la computacion en paralelo se ha convertido en el paradigma dominante en la arquitectura de computadores principalmente en forma de procesadores multinucleo n 3 4 La supercomputadora Cray 2 fue la mas rapida del mundo desde 1985 hasta 1989 La supercomputadora paralela Blue Gene de IBM Las computadoras paralelas pueden clasificarse segun el nivel de paralelismo que admite su hardware equipos con procesadores multinucleo y multi procesador que tienen multiples elementos de procesamiento dentro de una sola maquina y los clusteres MPPS y grids que utilizan varios equipos para trabajar en la misma tarea Muchas veces para acelerar tareas especificas se utilizan arquitecturas especializadas de computacion en paralelo junto a procesadores tradicionales Los programas informaticos paralelos son mas dificiles de escribir que los secuenciales 5 porque la concurrencia introduce nuevos tipos de errores de software siendo las condiciones de carrera los mas comunes La comunicacion y sincronizacion entre diferentes subtareas son algunos de los mayores obstaculos para obtener un buen rendimiento del programa paralelo La maxima aceleracion posible de un programa como resultado de la paralelizacion se conoce como la ley de Amdahl Indice 1 Conceptos basicos 1 1 Ley de Amdahl y ley de Gustafson 1 2 Dependencias 1 3 Condiciones de carrera exclusion mutua sincronizacion y desaceleracion paralela 1 4 Paralelismo de grano fino grano grueso y paralelismo vergonzoso 1 5 Modelos de consistencia 1 6 Taxonomia de Flynn 2 Tipos de paralelismo 2 1 Paralelismo a nivel de bit 2 2 Paralelismo a nivel de instruccion 2 3 Paralelismo de datos 2 4 Paralelismo de tareas 3 Hardware 3 1 Memoria y comunicacion 3 2 Clases de computadoras paralelas 3 2 1 Computacion multinucleo 3 2 2 Multiprocesamiento simetrico 3 2 2 1 Computacion en cluster 3 2 2 2 Procesamiento paralelo masivo 3 2 2 3 Computacion distribuida 3 2 3 Computadoras paralelas especializadas 3 2 3 1 Computo reconfigurable con arreglos de compuertas programables 3 2 3 2 Computo de proposito general en unidades de procesamiento grafico GPGPU 3 2 3 3 Circuitos integrados de aplicacion especifica 3 2 3 4 Procesadores vectoriales 4 Software 4 1 Lenguajes de programacion en paralelo 4 2 Paralelizacion automatica 4 3 Punto de control 5 Metodos algoritmicos 6 Historia 7 Notas 8 Referencias 9 Bibliografia 10 Lectura adicional 11 Enlaces externosConceptos basicos EditarTradicionalmente los programas informaticos se han escrito para el computo en serie Para resolver un problema se construye un algoritmo y se implementa como un flujo en serie de instrucciones Estas instrucciones se ejecutan en una unidad central de procesamiento en un ordenador Solo puede ejecutarse una instruccion a la vez y un tiempo despues de que la instruccion ha terminado se ejecuta la siguiente 6 La computacion en paralelo por el contrario utiliza simultaneamente multiples elementos de procesamiento para resolver un problema Esto se logra mediante la division del problema en partes independientes de modo que cada elemento de procesamiento pueda ejecutar su parte del algoritmo de manera simultanea con los otros Los elementos de procesamiento son diversos e incluyen recursos tales como una computadora con multiples procesadores varios ordenadores en red hardware especializado o cualquier combinacion de los anteriores 6 El aumento de la frecuencia fue la razon dominante de las mejoras en el rendimiento de las computadoras desde mediados de 1980 hasta el ano 2004 El tiempo de ejecucion de un programa es igual al numero de instrucciones multiplicado por el tiempo promedio por instruccion Manteniendo todo lo demas constante el aumento de la frecuencia de reloj reduce el tiempo medio que tarda en ejecutarse una instruccion por tanto un aumento en la frecuencia reduce el tiempo de ejecucion de los programas de computo 7 Sin embargo el consumo de energia de un chip esta dada por la ecuacion P C V2 F donde P es la potencia C es el cambio de capacitancia por ciclo de reloj proporcional al numero de transistores cuyas entradas cambian V es la tension y F es la frecuencia del procesador ciclos por segundo 8 Un aumento en la frecuencia aumenta la cantidad de energia utilizada en un procesador El aumento del consumo de energia del procesador llevo a Intel en mayo del 2004 a la cancelacion de sus procesadores Tejas y Jayhawk este hecho generalmente se cita como el fin del escalado de frecuencia como el paradigma dominante de arquitectura de computadores 9 La ley de Moore es la observacion empirica de que la densidad de transistores en un microprocesador se duplica cada 18 a 24 meses 10 A pesar de los problemas de consumo de energia y las repetidas predicciones de su fin la ley de Moore sigue vigente Con el fin del aumento de la frecuencia estos transistores adicionales que ya no se utilizan para el aumento de la frecuencia se pueden utilizar para anadir hardware adicional que permita la computacion paralela Ley de Amdahl y ley de Gustafson Editar Representacion grafica de la ley de Amdahl La mejora en la velocidad de ejecucion de un programa como resultado de la paralelizacion esta limitada por la porcion del programa que no se puede paralelizar Por ejemplo si el 10 del programa no puede paralelizarse el maximo teorico de aceleracion utilizando la computacion en paralelo seria de 10x no importa cuantos procesadores se utilicen Idealmente la aceleracion a partir de la paralelizacion es lineal doblar el numero de elementos de procesamiento debe reducir a la mitad el tiempo de ejecucion y doblarlo por segunda vez debe nuevamente reducir el tiempo a la mitad Sin embargo muy pocos algoritmos paralelos logran una aceleracion optima La mayoria tienen una aceleracion casi lineal para un pequeno numero de elementos de procesamiento y pasa a ser constante para un gran numero de elementos de procesamiento La aceleracion potencial de un algoritmo en una plataforma de computo en paralelo esta dada por la ley de Amdahl formulada originalmente por Gene Amdahl en la decada de 1960 11 Esta senala que una pequena porcion del programa que no pueda paralelizarse va a limitar la aceleracion que se logra con la paralelizacion Los programas que resuelven problemas matematicos o ingenieriles tipicamente consisten en varias partes paralelizables y varias no paralelizables secuenciales Si a displaystyle alpha es la fraccion de tiempo que un programa gasta en partes no paralelizables luego S 1 a lim P 1 1 a P a displaystyle S frac 1 alpha qquad qquad lim P to infty frac 1 frac 1 alpha P alpha es la maxima aceleracion que se puede alcanzar con la paralelizacion del programa Si la parte secuencial del programa abarca el 10 del tiempo de ejecucion se puede obtener no mas de 10 de aceleracion independientemente de cuantos procesadores se anadan Esto pone un limite superior a la utilidad de anadir mas unidades de ejecucion paralelas Cuando una tarea no puede divididirse debido a las limitaciones secuenciales la aplicacion de un mayor esfuerzo no tiene efecto sobre la programacion La gestacion de un nino toma nueve meses no importa cuantas mujeres se le asigne 12 La ley de Gustafson es otra ley en computacion que esta en estrecha relacion con la ley de Amdahl 13 Senala que el aumento de velocidad con P displaystyle P procesadores es Supongamos que una tarea tiene dos partes independientes A y B B tarda aproximadamente 25 del tiempo total Con esfuerzo adicional un programador puede hacer esta parte cinco veces mas rapida pero esto reduce el tiempo de calculo global por muy poco Por otro lado puede que sea necesario poco trabajo para hacer que la parte A sea doble de rapida Esto haria el calculo mucho mas rapido que mediante la optimizacion de la parte B a pesar de que B tiene una mayor aceleracion 5x frente a 2 S P P a P 1 a P 1 a displaystyle S P P alpha P 1 qquad alpha P 1 alpha Ambas leyes asumen que el tiempo de funcionamiento de la parte secuencial del programa es independiente del numero de procesadores La ley de Amdahl supone que todo el problema es de tamano fijo por lo que la cantidad total de trabajo que se hara en paralelo tambien es independiente del numero de procesadores mientras que la ley de Gustafson supone que la cantidad total de trabajo que se hara en paralelo varia linealmente con el numero de procesadores Dependencias Editar Entender la dependencia de datos es fundamental en la implementacion de algoritmos paralelos Ningun programa puede ejecutar mas rapidamente que la cadena mas larga de calculos dependientes conocida como la ruta critica ya que los calculos que dependen de calculos previos en la cadena deben ejecutarse en orden Sin embargo la mayoria de los algoritmos no consisten solo de una larga cadena de calculos dependientes generalmente hay oportunidades para ejecutar calculos independientes en paralelo Sea Pi y Pj dos segmentos del programa Las condiciones de Bernstein 14 describen cuando los dos segmentos son independientes y pueden ejecutarse en paralelo Para Pi sean Ii todas las variables de entrada y Oi las variables de salida y del mismo modo para Pj P i y Pj son independientes si satisfacen I j O i displaystyle I j cap O i varnothing I i O j displaystyle I i cap O j varnothing O i O j displaystyle O i cap O j varnothing Una violacion de la primera condicion introduce una dependencia de flujo correspondiente al primer segmento que produce un resultado utilizado por el segundo segmento La segunda condicion representa una anti dependencia cuando el segundo segmento Pj produce una variable que necesita el primer segmento Pi La tercera y ultima condicion representa una dependencia de salida Cuando dos segmentos escriben en el mismo lugar el resultado viene del ultimo segmento ejecutado 15 Considere las siguientes funciones que demuestran varios tipos de dependencias 1 funcion Dep a b 2 c a b 3 d 3 c 4 fin funcion La operacion 3 en Dep a b no puede ejecutarse antes de o incluso en paralelo con la operacion 2 ya que en la operacion 3 se utiliza un resultado de la operacion 2 Esto viola la condicion 1 y por tanto introduce una dependencia de flujo 1 funcion NoDep a b 2 c a b 3 d b 3 4 e a b 5 fin funcion En este ejemplo no existen dependencias entre las instrucciones por lo que todos ellos se pueden ejecutar en paralelo Las condiciones de Bernstein no permiten que la memoria se comparta entre los diferentes procesos Por esto son necesarios algunos medios que impongan un ordenamiento entre los accesos tales como semaforos barreras o algun otro metodo de sincronizacion Condiciones de carrera exclusion mutua sincronizacion y desaceleracion paralela Editar Las subtareas en un programa paralelo a menudo son llamadas hilos Algunas arquitecturas de computacion paralela utilizan versiones mas pequenas y ligeras de hilos conocidas como hebras mientras que otros utilizan versiones mas grandes conocidos como procesos Sin embargo hilos es generalmente aceptado como un termino generico para las subtareas Los hilos a menudo tendran que actualizar algunas variables que se comparten entre ellos Las instrucciones entre los dos programas pueden entrelazarse en cualquier orden Por ejemplo considere el siguiente programa Hilo A Hilo B1A Lee variable V 1B Lee variable V2A Anadir 1 a la variable V 2B Anadir 1 a la variable V3A Escribir en la variable V 3B Escribir en la variable VSi la instruccion 1B se ejecuta entre 1A y 3A o si la instruccion 1A se ejecuta entre 1B y 3B el programa va a producir datos incorrectos Esto se conoce como una condicion de carrera El programador debe utilizar un bloqueo lock para proporcionar exclusion mutua Un bloqueo es una construccion del lenguaje de programacion que permite a un hilo de tomar el control de una variable y evitar que otros hilos la lean o escriban hasta que la variable este desbloqueado El hilo que mantiene el bloqueo es libre de ejecutar su seccion critica la seccion de un programa que requiere acceso exclusivo a alguna variable y desbloquear los datos cuando termine Por lo tanto para garantizar la correcta ejecucion del programa el programa anterior se puede reescribir usando bloqueos Hilo A Hilo B1A Bloquear variable V 1B Bloquear variable V2A Lee variable V 2B Lee variable V3A Anadir 1 a la variable V 3B Anadir 1 a la variable V4A Escribir en la variable V 4B Escribir en la variable V5A Desbloquear variable V 5B Desbloquear variable VUn hilo bloqueara con exito la variable V mientras que el otro hilo no podra continuar hasta que V se desbloquee Esto garantiza la correcta ejecucion del programa Si bien los bloqueos son necesarios para asegurar la ejecucion correcta del programa pueden ralentizar en gran medida un programa Bloquear multiples variables utilizando cerraduras no atomicas introduce la posibilidad de que el programa alcance un bloqueo mutuo deadlock Un bloqueo atomico bloquea multiples variables a la vez si no puede bloquearlas todas no se bloquea ninguna de ellas Si hay dos hilos y cada uno necesita bloquear las mismas dos variables utilizando cerraduras no atomicas es posible que un hilo bloquee uno de ellas y el otro bloquee la segunda variable En tal caso se produce un bloqueo mutuo donde ningun hilo puede completar la ejecucion Muchos programas paralelos requieren que sus subtareas actuen en sincronia Esto requiere el uso de una barrera Las barreras se implementan normalmente mediante un bloqueo Una clase de algoritmos conocida como algoritmos libres de bloqueo y libres de espera evitan el uso de bloqueos y barreras Sin embargo este enfoque es generalmente dificil de implementar y requiere estructuras de datos correctamente disenadas No todas las paralelizaciones conllevan una aceleracion Por lo general mientras una tarea se divida en cada vez mas hilos estos hilos pasan una porcion cada vez mayor de su tiempo comunicandose entre si Eventualmente la sobrecarga de comunicacion domina el tiempo empleado para resolver el problema y la paralelizacion adicional dividir la carga de trabajo entre incluso mas hilos aumenta la cantidad de tiempo requerido para terminar Esto se conoce como desaceleracion paralela Paralelismo de grano fino grano grueso y paralelismo vergonzoso Editar Las aplicaciones a menudo se clasifican segun la frecuencia con que sus subtareas se sincronizan o comunican entre si Una aplicacion muestra un paralelismo de grano fino si sus subtareas deben comunicase muchas veces por segundo se considera paralelismo de grano grueso si no se comunican muchas veces por segundo y es vergonzosamente paralelo si nunca o casi nunca se tienen que comunicar Aplicaciones vergonzosamente paralelas son consideradas las mas faciles de paralelizar Modelos de consistencia Editar Articulo principal Consistencia de datos Leslie Lamport definio por primera vez el concepto de consistencia secuencial Tambien es conocido por su trabajo en el desarrollo del software LaTeX Los lenguajes de programacion en paralelo y computadoras paralelas deben tener un modelo de consistencia de datos tambien conocido como un modelo de memoria El modelo de consistencia define reglas para las operaciones en la memoria del ordenador y como se producen los resultados Uno de los primeros modelos de consistencia fue el modelo de consistencia secuencial de Leslie Lamport La consistencia secuencial es la propiedad de un programa en la que su ejecucion en paralelo produce los mismos resultados que un programa secuencial Especificamente es un programa secuencial consistente si los resultados de una ejecucion son los mismos que se obtienen si las operaciones de todos los procesadores son ejecutadas en un orden secuencial y las operaciones de cada procesador individual aparecen en esta secuencia en el orden especificado por el programa 16 La memoria transaccional es un tipo de modelo de consistencia La memoria transaccional toma prestado de la teoria de base de datos el concepto de transacciones atomicas y las aplica a los accesos a memoria Matematicamente estos modelos se pueden representar de varias maneras Las Redes de Petri que se introdujeron en 1962 como tesis doctoral de Carl Adam Petri fueron un primer intento de codificar las reglas de los modelos de consistencia Mas tarde fueron creadas las arquitecturas de flujo de datos para implementar fisicamente las ideas de la teoria del flujo de datos A principios de la decada de 1970 los calculos de procesos tales como la Comunicacion de Sistemas y Comunicacion de Procesos Secuenciales se desarrollaron para permitir un razonamiento algebraico sobre sistemas compuestos por elementos que interactuan entre si Adiciones mas recientes a la familia de calculo de proceso como el calculo p han anadido la capacidad para razonar acerca de las topologias dinamicas Logicas tales como la TLA de Lamport y modelos matematicos se han desarrollado para describir el comportamiento de sistemas concurrentes Taxonomia de Flynn Editar Michael J Flynn creo uno de los primeros sistemas de clasificacion de computadoras programas paralelos y secuenciales ahora conocida como la taxonomia de Flynn Flynn clasifica los programas y computadoras atendiendo a si estan operando con uno o varios conjuntos de instrucciones y si esas instrucciones se utilizan en una o varias series de datos Instruccion individual Instruccion multipleDatos individuales SISD MISDMultiples datos SIMD MIMDLa clasificacion instruccion unica dato unico SISD es equivalente a un programa totalmente secuencial La clasificacion instruccion unica datos multiples SIMD es analoga a hacer la misma operacion varias veces sobre un conjunto de datos grande Esto se hace comunmente en aplicaciones de procesamiento de senales Instrucciones multiples dato unico MISD es una clasificacion que rara vez se utiliza A pesar de que se disenaron arquitecturas de computadoras en esta categoria como arreglos sistolicos muy pocas aplicaciones se materializaron Los programas instrucciones multiples datos multiples MIMD constituyen el tipo mas comun de programas paralelos Segun David A Patterson y John L Hennessy Algunas maquinas son hibridos de estas categorias por supuesto este modelo clasico ha sobrevivido porque es simple facil de entender y da una buena primera aproximacion Ademas es tal vez por su comprensibilidad el esquema mas utilizado 17 Tipos de paralelismo EditarParalelismo a nivel de bit Editar Desde el advenimiento de la integracion a gran escala VLSI como tecnologia de fabricacion de chips de computadora en la decada de 1970 hasta alrededor de 1986 la aceleracion en la arquitectura de computadores se lograba en gran medida duplicando el tamano de la palabra en la computadora la cantidad de informacion que el procesador puede manejar por ciclo 18 El aumento del tamano de la palabra reduce el numero de instrucciones que el procesador debe ejecutar para realizar una operacion en variables cuyos tamanos son mayores que la longitud de la palabra Por ejemplo cuando un procesador de 8 bits debe sumar dos enteros de 16 bits el procesador primero debe adicionar los 8 bits de orden inferior de cada numero entero con la instruccion de adicion a continuacion anadir los 8 bits de orden superior utilizando la instruccion de adicion con acarreo que tiene en cuenta el bit de acarreo de la adicion de orden inferior en este caso un procesador de 8 bits requiere dos instrucciones para completar una sola operacion en donde un procesador de 16 bits necesita una sola instruccion para poder completarla Historicamente los microprocesadores de 4 bits fueron sustituidos por unos de 8 bits luego de 16 bits y 32 bits esta tendencia general llego a su fin con la introduccion de procesadores de 64 bits lo que ha sido un estandar en la computacion de proposito general durante la ultima decada Paralelismo a nivel de instruccion Editar Un pipeline canonico de cinco etapas en una maquina RISC IF Pedido de Instruccion ID Decodificacion de instruccion EX Ejecutar MEM Acceso a la memoria WB Escritura Un programa de ordenador es en esencia una secuencia de instrucciones ejecutadas por un procesador Estas instrucciones pueden reordenarse y combinarse en grupos que luego son ejecutadas en paralelo sin cambiar el resultado del programa Esto se conoce como paralelismo a nivel de instruccion Los avances en el paralelismo a nivel de instruccion dominaron la arquitectura de computadores desde mediados de 1980 hasta mediados de la decada de 1990 19 Los procesadores modernos tienen pipeline de instrucciones de varias etapas Cada etapa en el pipeline corresponde a una accion diferente que el procesador realiza en la instruccion correspondiente a la etapa un procesador con un pipeline de N etapas puede tener hasta n instrucciones diferentes en diferentes etapas de finalizacion El ejemplo canonico de un procesador segmentado es un procesador RISC con cinco etapas pedir instruccion decodificar ejecutar acceso a la memoria y escritura El procesador Pentium 4 tenia un pipeline de 35 etapas 20 Un procesador superescalar con pipeline de cinco etapas capaz de ejecutar dos instrucciones por ciclo Puede tener dos instrucciones en cada etapa del pipeline para un total de hasta 10 instrucciones se muestra en verde ejecutadas simultaneamente Ademas del paralelismo a nivel de instruccion del pipelining algunos procesadores pueden ejecutar mas de una instruccion a la vez Estos son conocidos como procesadores superescalares Las instrucciones pueden agruparse juntas solo si no hay dependencia de datos entre ellas El scoreboarding y el algoritmo de Tomasulo que es similar a scoreboarding pero hace uso del renombre de registros son dos de las tecnicas mas comunes para implementar la ejecucion fuera de orden y la paralelizacion a nivel de instruccion Paralelismo de datos Editar Articulo principal Paralelismo de datos El paralelismo de datos es el paralelismo inherente en programas con ciclos que se centra en la distribucion de los datos entre los diferentes nodos computacionales que deben tratarse en paralelo La paralelizacion de ciclos conduce a menudo a secuencias similares de operaciones no necesariamente identicas o funciones que se realizan en los elementos de una gran estructura de datos 21 Muchas de las aplicaciones cientificas y de ingenieria muestran paralelismo de datos Una dependencia de terminacion de ciclo es la dependencia de una iteracion de un ciclo en la salida de una o mas iteraciones anteriores Las dependencias de terminacion de ciclo evitan la paralelizacion de ciclos Por ejemplo considere el siguiente pseudocodigo que calcula los primeros numeros de Fibonacci 1 PREV1 0 2 PREV2 1 3 do 4 CUR PREV1 PREV2 5 PREV1 PREV2 6 PREV2 CUR 7 while CUR lt 10 Este bucle no se puede paralelizar porque CUR depende de si mismo PREV2 y de PREV1 que se calculan en cada iteracion del bucle Dado que cada iteracion depende del resultado de la anterior no se pueden realizar en paralelo A medida que el tamano de un problema se hace mas grande la paralelizacion de datos disponible generalmente tambien lo hace 22 Paralelismo de tareas Editar Articulo principal Paralelismo de tareas El paralelismo de tareas es la caracteristica de un programa paralelo en la que calculos completamente diferentes se pueden realizar en cualquier conjunto igual o diferente de datos 21 Esto contrasta con el paralelismo de datos donde se realiza el mismo calculo en distintos o mismos grupos de datos El paralelismo de tareas por lo general no escala con el tamano de un problema 22 Hardware EditarMemoria y comunicacion Editar La memoria principal en un ordenador en paralelo puede ser compartida compartida entre todos los elementos de procesamiento en un unico espacio de direcciones o distribuida cada elemento de procesamiento tiene su propio espacio local de direcciones 23 El termino memoria distribuida se refiere al hecho de que la memoria se distribuye logicamente pero a menudo implica que tambien se distribuyen fisicamente La memoria distribuida compartida y la virtualizacion de memoria combinan los dos enfoques donde el procesador tiene su propia memoria local y permite acceso a la memoria de los procesadores que no son locales Los accesos a la memoria local suelen ser mas rapidos que los accesos a memoria no local Una vista logica de una arquitectura con acceso a memoria no uniforme NUMA Los procesadores en un directorio pueden acceder a la memoria de su directorio con una menor latencia de la que pueden acceder a la memoria del directorio de otro Las arquitecturas de ordenador en las que cada elemento de la memoria principal se puede acceder con igual latencia y ancho de banda son conocidas como arquitecturas de acceso uniforme a memoria UMA Tipicamente solo se puede lograr con un sistema de memoria compartida donde la memoria no esta distribuida fisicamente Un sistema que no tiene esta propiedad se conoce como arquitectura de acceso a memoria no uniforme NUMA Los sistemas de memoria distribuidos tienen acceso no uniforme a la memoria Los sistemas informaticos suelen hacer uso de caches pequenos recuerdos rapidos ubicados cerca del procesador que almacenan las copias temporales de los valores de la memoria cercano tanto en el sentido fisico y logico Los sistemas computacionales paralelos tienen dificultades con las caches y la posibilidad de una ejecucion incorrecta del programa debido a que se puede almacenar el mismo valor en mas de un lugar Estos equipos requieren coherencia en la cache del sistema generalmente realizan un seguimiento de los valores almacenados en cache y estrategicamente los eliminan garantizando la correcta ejecucion del programa Bus sniffing es uno de los metodos mas comunes para hacer el seguimiento de los valores a los que se esta accediendo El diseno de grandes sistemas de coherencia cache y de alto rendimiento es un problema muy dificil en arquitectura de computadores Como resultado las arquitecturas de memoria compartida no son tan escalables como los sistemas de memoria distribuida 23 La comunicacion procesador procesador y procesador memoria se puede implementar en hardware de varias maneras a traves de memoria compartida ya sea multipuerto o multiplexado un conmutador de barras cruzadas crossbar switch un bus compartido o una red interconectada de una gran variedad de topologias como estrella anillo arbol hipercubo hipercubo grueso un hipercubo con mas de un procesador en un nodo o de malla n dimensional Las computadoras paralelas basadas en redes interconectadas deben tener algun tipo de enrutamiento para permitir el paso de mensajes entre nodos que no estan conectados directamente Es probable que el medio utilizado para la comunicacion entre los procesadores de grandes maquinas multiprocesador sea jerarquico Clases de computadoras paralelas Editar Las computadoras paralelas se pueden clasificar de acuerdo con el nivel en el que el hardware soporta paralelismo Esta clasificacion es analoga a la distancia entre los nodos basicos de computo Estos no son excluyentes entre si por ejemplo los grupos de multiprocesadores simetricos son relativamente comunes Computacion multinucleo Editar Articulo principal Procesador multinucleo Un procesador multinucleo es un procesador que incluye multiples unidades de ejecucion nucleos en el mismo chip Los procesadores superescalares pueden ejecutar multiples instrucciones por ciclo de un flujo de instrucciones hilo a diferencia de este un procesador multinucleo puede ejecutar multiples instrucciones por ciclo de secuencias de instrucciones multiples Cada nucleo en un procesador multinucleo potencialmente puede ser superescalar es decir en cada ciclo cada nucleo puede ejecutar multiples instrucciones de un flujo de instrucciones El Multithreading simultaneo de la cual Intel HyperThreading es el mas conocido era una forma de pseudo multinucleo Un procesador con capacidad de multithreading simultaneo tiene una sola unidad de ejecucion nucleo pero cuando esa unidad de ejecucion esta desocupada por ejemplo durante un error de cache se utiliza para procesar un segundo hilo El microprocesador Cell de IBM disenado para su uso en la consola Sony PlayStation 3 es otro prominente procesador multinucleo Multiprocesamiento simetrico Editar Articulo principal Multiprocesamiento simetrico Un multiprocesador simetrico SMP es un sistema computacional con multiples procesadores identicos que comparten memoria y se conectan a traves de un bus 24 La contencion del bus previene el escalado de esta arquitectura Como resultado los SMPs generalmente no comprenden mas de 32 procesadores 25 Debido al pequeno tamano de los procesadores y de la significativa reduccion en los requisitos de ancho de banda de bus tales multiprocesadores simetricos son extremadamente rentables siempre que exista una cantidad suficiente de ancho de banda 24 Computacion en cluster Editar Articulo principal Cluster informatica Un cluster Beowulf Un cluster es un grupo de ordenadores debilmente acoplados que trabajan en estrecha colaboracion de modo que en algunos aspectos pueden considerarse como un solo equipo 26 Los clusteres se componen de varias maquinas independientes conectadas por una red Mientras que las maquinas de un cluster tienen que ser simetricas de no serlo el balance de carga es mas dificil de lograr El tipo mas comun de cluster es el cluster Beowulf que es un cluster implementado con multiples ordenadores comerciales identicos conectados a una red de area local TCP IP Ethernet 27 La tecnologia Beowulf fue desarrollada originalmente por Thomas Sterling y Donald Becker La gran mayoria de los superordenadores TOP500 son clusteres n 4 28 Procesamiento paralelo masivo Editar Un procesador paralelo masivo MPP es un solo equipo con varios procesadores conectados en red Tienen muchas de las caracteristicas de los cluster pero cuentan con redes especializadas de interconexion en tanto que las clusteres utilizan hardware estandar para la creacion de redes Los MPPs tambien tienden a ser mas grandes que los clusteres con mucho mas de 100 procesadores 29 En un MPP cada CPU tiene su propia memoria y una copia del sistema operativo y la aplicacion Cada subsistema se comunica con los demas a traves de un interconexion de alta velocidad 30 Un gabinete de Blue Gene L clasificado como el cuarto mejor superordenador del mundo de acuerdo a la clasificacion TOP500 en 11 2008 Blue Gene L es un procesador masivamente paralelo Computacion distribuida Editar Articulo principal Computacion distribuida La computacion distribuida es la forma mas distribuida de la computacion paralela Se hace uso de ordenadores que se comunican a traves de la Internet para trabajar en un problema dado Debido al bajo ancho de banda y la latencia extremadamente alta de Internet la computacion distribuida normalmente solo se refiere a problemas vergonzosamente paralelos Se han creado muchas aplicaciones de computacion distribuida SETI home y Folding home son los ejemplos mas conocidos 31 La mayoria de las aplicaciones de computacion distribuida utilizan middleware software que se encuentra entre el sistema operativo y la aplicacion para administrar los recursos de red y estandarizar la interfaz de software El mas comun es la Infraestructura Abierta de Berkeley para Computacion en Red BOINC A menudo los programas de computacion distribuida hacen uso de ciclos de repuesto realizando calculos cuando el procesador de un equipo esta desocupado Computadoras paralelas especializadas Editar Dentro de la computacion paralela existen dispositivos paralelos especializados que generan interes Aunque no son especificos para un dominio tienden a ser aplicables solo a unas pocas clases de problemas paralelos Computo reconfigurable con arreglos de compuertas programables Editar El computo reconfigurable es el uso de un arreglo de compuertas programables FPGA como coprocesador de un ordenador de proposito general Un FPGA es en esencia un chip de computadora que puede reconfigurarse para una tarea determinada Los FPGAs se pueden programar con lenguajes de descripcion de hardware como VHDL o Verilog Sin embargo los lenguajes de programacion pueden ser tediosos Varios vendedores han creado lenguajes C a HDL que tratan de emular la sintaxis y o semantica del lenguaje de programacion C con el que la mayoria de los programadores estan familiarizados Los lenguajes C a HDL mas conocidos son Mitrion C C Impulse DIME C y C Handel Tambien se pueden utilizar para este proposito subconjuntos especificos de SystemC basados en C La decision de AMD de abrir HyperTransport a otros fabricantes la ha convertido en la tecnologia que permite la computacion reconfigurable de alto rendimiento 32 De acuerdo con Michael D Amour R Director de Operaciones de la DRC Computer Corporation cuando entramos en AMD nos llamaban ladrones de zocalos Ahora nos llaman socios 32 Computo de proposito general en unidades de procesamiento grafico GPGPU Editar Articulo principal GPGPU Tarjeta Nvidia Tesla GPGPU El computo de proposito general en las unidades de procesamiento de graficos GPGPU es una tendencia relativamente reciente en la investigacion de ingenieria informatica Los GPUs son co procesadores que han sido fuertemente optimizados para procesamiento de graficos por computadora 33 El procesamiento de graficos por computadora es un campo dominado por operaciones sobre datos en paralelo en particular de algebra lineal y operaciones con matrices Al principio los programas de GPGPU normalmente utilizaban el API de graficos para ejecutar programas Sin embargo varios nuevos lenguajes de programacion y plataformas se han construido para realizar computo de proposito general sobre GPUs tanto Nvidia como AMD han liberado de entornos de programacion con CUDA y Stream SDK respectivamente Otros lenguajes de programacion de GPU incluyen BrookGPU PeakStream y RapidMind Nvidia tambien ha lanzado productos especificos para la computacion en su serie Tesla El consorcio de tecnologia Khronos Group ha lanzado OpenCL que es un marco para la escritura de programas que se ejecutan en distintas plataformas conformadas por CPUs y GPUs AMD Apple Intel Nvidia y otros estan apoyando OpenCL Circuitos integrados de aplicacion especifica Editar Articulo principal Circuito integrado de aplicacion especifica Se han disenado varios circuitos integrados de aplicacion especifica ASIC para hacer frente a las aplicaciones paralelas 34 35 36 Debido a que un ASIC por definicion es especifico para una aplicacion dada puede ser completamente optimizado para esa aplicacion Como resultado para una aplicacion dada un ASIC tiende a superar a un ordenador de proposito general Sin embargo los ASICs son creados con litografia de rayos X Este proceso requiere una mascara que puede ser extremadamente cara Una mascara puede costar mas de un millon de dolares n 5 37 Mientras mas pequeno sean los transistores necesarios para el chip mas cara sera la mascara Mientras tanto el incremento del rendimiento en computadoras de proposito general como se describe en la Ley de Moore tiende a eliminar esta diferencia en solo una o dos generaciones de chips 32 El alto costo inicial y la tendencia a ser superados por la ley de Moore ha hecho inviable el uso de ASICs para la mayoria de las aplicaciones paralelas Sin embargo algunos han sido construidos un ejemplo es el peta flop RIKEN MDGRAPE 3 de la maquina que utiliza ASICs para la simulacion de dinamica molecular Procesadores vectoriales Editar Articulo principal Procesador vectorial Cray 1 es el procesador vectorial mas famoso Un procesador vectorial es un CPU o un sistema computacional que puede ejecutar la misma instruccion en grandes conjuntos de datos Los procesadores vectoriales tienen operaciones de alto nivel que trabajan sobre arreglos lineales de numeros o vectores Un ejemplo de operacion con vectores es A B C donde A B y C son vectores de 64 elementos donde cada uno es un numero de punto flotante de 64 bits 38 Estan estrechamente relacionadas con la clasificacion SIMD de Flynn 38 Las computadoras Cray se volvieron famosas por su procesamiento de vectores en los anos 1970 y 1980 Sin embargo los procesadores vectoriales tanto CPUs como sistemas computacionales han desaparecido Los conjuntos de instrucciones de los procesadores modernos incluyen algunas instrucciones de procesamiento de vectores por ejemplo AltiVec y Streaming SIMD Extensions SSE Software EditarLenguajes de programacion en paralelo Editar Los lenguajes de programacion concurrentes bibliotecas APIs y modelos de programacion paralela han sido creados para la programacion de computadores paralelos Estos generalmente se pueden dividir en clases basadas en las suposiciones que se hacen sobre la arquitectura de memoria subyacente compartida distribuida o compartida distribuida Los lenguajes de programacion de memoria compartida se comunican mediante la manipulacion de variables en la memoria compartida En la arquitectura con memoria distribuida se utiliza el paso de mensajes POSIX Threads y OpenMP son dos de las API mas utilizadas con la memoria compartida mientras que Message Passing Interface MPI Interfaz de Paso de Mensajes es el API mas utilizado en los sistemas de paso de mensajes n 6 39 El concepto valor futuro es muy utilizado en la programacion de programas paralelos donde una parte de un programa promete proporcionar un dato requerido a otra parte del programa en un tiempo futuro Las empresas CAPS entreprise y Pathscale estan intentando convertir las directivas de HMPP Hybrid Multicore Parallel Programming en un estandar abierto denominado OpenHMPP El modelo de programacion OpenHMPP basado en directivas ofrece una sintaxis para descargar de manera eficiente los calculos sobre aceleradores de hardware y optimizar el movimiento de datos hacia y desde la memoria del hardware Las directivas OpenHMPP describen llamadas a procedimientos remotos RPC en un dispositivo acelerador por ejemplo el GPU o de forma mas general un conjunto de nucleos Las directivas permiten anotar codigo C o Fortran para describir dos grupos de funcionalidades la descarga de los procedimientos en un dispositivo remoto y la optimizacion de las transferencias de datos entre la memoria principal de la CPU y la memoria del acelerador Paralelizacion automatica Editar Articulo principal Paralelizacion automatica La paralelizacion automatica de un programa secuencial por un compilador es el santo grial de la computacion paralela A pesar de decadas de trabajo por parte de los investigadores la paralelizacion automatica ha tenido un exito limitado n 7 40 Los principales lenguajes de programacion en paralelo permanecen explicitamente paralelos o en el mejor de los casos parcialmente implicitos en los que un programador le da al compilador directivas de paralelizacion Existen pocos lenguajes de programacion paralelos totalmente implicitos SISAL Parallel Haskell y para FPGAs Mitrion C Punto de control Editar Mientras un sistema computacional crece en complejidad el tiempo medio entre fallos por lo general disminuye Un punto de control de aplicacion es una tecnica mediante la cual el sistema informatico toma una instantanea de la aplicacion un registro de todas las asignaciones actuales de recursos y estados variables semejante a un volcado de memoria esta informacion se puede utilizar para restaurar el programa si el equipo falla Disponer de un punto de control significa que el programa puede reiniciar desde este y no desde el principio Mientras que los puntos de control proporcionan beneficios en una variedad de situaciones son especialmente utiles en los sistemas altamente paralelos con un gran numero de procesadores que son utilizados en la computacion de altas prestaciones 41 Metodos algoritmicos EditarMientras que las computadoras paralelas se hacen mas grandes y mas rapidas se hace factible resolver problemas que antes tardaban demasiado tiempo en ejecutarse La computacion en paralelo se utiliza en una amplia gama de campos desde la bioinformatica plegamiento de proteinas y analisis de secuencia hasta la economia matematica financiera Los tipos de problemas encontrados comunmente en las aplicaciones de computacion en paralelo son 42 Algebra lineal densa Algebra lineal dispersa Metodos espectrales tales como la transformada rapida de Fourier de Cooley Tukey Problemas de n cuerpos tales como la simulacion Barnes Hut Problemas de grids estructurados metodos de Lattice Boltzmann Problemas de grids no estructurados tales como los encontrados en el analisis de elementos finitos Simulacion de Montecarlo Logica combinacional por ejemplo tecnicas criptograficas de fuerza bruta Recorridos en grafos por ejemplo los algoritmos de ordenamiento Programacion dinamica Metodos de Ramificacion y poda Modelos en grafos tales como la deteccion de modelos ocultos de Markov y la construccion de redes bayesianas Simulacion de automatas finitosHistoria EditarArticulo principal Historia de la computacion ILLIAC IV quizas el mas infame de los superordenadores 43 Los origenes del verdadero paralelismo MIMD se remontan a Federico Luigi Menabrea Conte y su Bosquejo de la maquina analitica inventada por Charles Babbage 44 45 IBM introdujo el IBM 704 en 1954 a traves de un proyecto en el que Gene Amdahl fue uno de los principales arquitectos Se convirtio en el primer equipo disponible en el mercado que utilizaba comandos aritmeticos de punto flotante totalmente automaticos 46 En abril de 1958 S Gill Ferranti analizo la programacion en paralelo y la necesidad de la ramificacion y la espera 47 Tambien en 1958 los investigadores de IBM John Cocke y Daniel Slotnick discutieron por primera vez el uso del paralelismo en calculos numericos 48 Burroughs Corporation presento la D825 en 1962 un equipo de cuatro procesadores que accede a un maximo de 16 modulos de memoria a traves de un conmutador de barras cruzadas 49 En 1967 Amdahl y Slotnick publicaron un debate sobre la viabilidad de procesamiento en paralelo en la Conferencia de la Federacion Americana de Sociedades de Procesamiento de la Informacion 48 Fue durante este debate que la Ley de Amdahl fue acunada para definir los limites de aceleracion que se pueden alcanzar debido al paralelismo En 1969 la compania estadounidense Honeywell introdujo su primer sistema Multics un sistema con multiprocesador simetrico capaz de ejecutar hasta ocho procesadores en paralelo 48 En 1970 C mmp un proyecto en la Universidad Carnegie Mellon con varios procesadores fue uno de los primeros multiprocesadores con mas de unos pocos procesadores 45 El primer bus con conexion multi procesador y cache espia fue el Synapse N 1 en el ano 1984 45 Las computadoras paralelas SIMD se remontan a la decada de 1970 La motivacion detras de las primeras computadoras SIMD era amortizar el retardo de la compuerta de la unidad de control del procesador en multiples instrucciones 50 En 1964 Slotnick habia propuesto la construccion de un ordenador masivamente paralelo para el Laboratorio Nacional Lawrence Livermore 48 Su diseno fue financiado por la Fuerza Aerea de los Estados Unidos que fue el primer esfuerzo por lograr la computacion en paralelo SIMD 48 La clave de su diseno fue un paralelismo bastante alto con hasta 256 procesadores lo que permitio que la maquina trabajara en grandes conjuntos de datos en lo que mas tarde seria conocido como el procesamiento de vectores Sin embargo ILLIAC IV fue llamado el mas infame de los superordenadores pues solo se habia completado una cuarta parte del proyecto Tardo 11 anos costando casi cuatro veces la estimacion original n 8 43 Cuando estaba listo para ejecutar una aplicacion real por primera vez en 1976 fue superado por supercomputadoras comerciales como el Cray 1 Notas Editar Las tecnicas principales para lograr estas mejoras de rendimiento mayor frecuencia de reloj y arquitecturas cada vez mas inteligentes y complejas estan golpeando la llamada power wall La industria informatica ha aceptado que los futuros aumentos en rendimiento deben provenir en gran parte del incremento del numero de procesadores o nucleos en una matriz en vez de hacer mas rapido un solo nucleo Antigua sabiduria convencional La energia es gratuita y los transistores son caros Nueva sabiduria convencional la energia es cara y los transistores son gratuitos Antigua sabiduria convencional incrementar la frecuencia de reloj es el metodo principal de mejorar el rendimiento del procesador Nueva sabiduria convencional el incremento del paralelismo es el metodo principal para mejorar el rendimiento del procesador Incluso los representantes de Intel una empresa asociada a la posicion mayor velocidad de reloj es mejor advirtio que los enfoques tradicionales para aumentar el rendimiento a traves de la maximizacion de la velocidad de reloj han sido empujados hasta el limite En los TOP500 Supercomputing Sites los clusteres alcanzan el 74 60 de las maquinas en la lista el costo de una mascara y tarjeta de prueba que es mucho mas de 1 millon en los 90nm crea un amortiguador importante en la innovacion basada en semiconductores Se referencia la Interfaz de Paso de Mensajes como la interfaz dominante de HPC Sin embargo el santo grial de la investigacion paralelizacion automatica de programas en serie todavia tiene que materializarse Aunque la paralelizacion automatica de ciertas clases de algoritmos se ha demostrado este exito ha sido en gran parte limitado a aplicaciones cientificas y numericas con control de flujo predecible por ejemplo las estructuras de bucle anidado con un recuento de iteracion estaticamente determinado y patrones de acceso a memoria analizables estaticamente por ejemplo recorridos en grandes arreglos multidimensionales de datos de punto flotante Aunque tuvo exito en impulsar varias tecnologias utiles en proyectos posteriores el IV ILLIAC no triunfo como ordenador Los costos se ascendieron de los 8 millones estimados en 1966 a 31 millones en 1972 a pesar de la construccion de solo un cuarto de la maquina planeada Fue tal vez la mas infame de las supercomputadoras El proyecto comenzo en 1965 y ejecuto su primera aplicacion real en 1976Referencias Editar Gottlieb Allan Almasi George S 1989 Highly parallel computing en ingles Redwood City California Benjamin Cummings ISBN 0 8053 0177 1 La referencia utiliza el parametro obsoleto coautores ayuda Parallel Computing Research at Illinois The UPCRC Agenda pdf en ingles Universidad de Illinois en Urbana Champaign noviembre de 2008 Archivado desde el original el 9 de diciembre de 2008 The Landscape of Parallel Computing Research A View from Berkeley pdf en ingles UCB EECS 2006 183 Universidad de California Berkeley 18 de diciembre de 2006 The Landscape of Parallel Computing Research A View from Berkeley pdf en ingles UCB EECS 2006 183 Universidad de California Berkeley 18 de diciembre de 2006 Hennessy John L Patterson David A Larus James R 1999 Computer organization and design the hardware software interface en ingles 2da edicion San Francisco Kaufmann ISBN 1 55860 428 6 La referencia utiliza el parametro obsoleto coautores ayuda a b Barney Blaise Introduction to Parallel Computing en ingles Lawrence Livermore National Laboratory Consultado el 9 de noviembre de 2007 Hennessy John L Patterson David A 2002 Computer architecture a quantitative approach en ingles 3ra edicion San Francisco California International Thomson p 43 ISBN 1 55860 724 2 La referencia utiliza el parametro obsoleto coautores ayuda Rabaey Jan M 1996 Digital integrated circuits a design perspective en ingles Upper Saddle River N J Prentice Hall p 235 ISBN 0 13 178609 1 Flynn Laurie J 8 de mayo de 2004 Intel Halts Development Of 2 New Microprocessors New York Times en ingles Consultado el 5 de junio de 2012 Moore Gordon E 1965 Cramming more components onto integrated circuits pdf Electronics Magazine en ingles Archivado desde el original el 18 de febrero de 2008 Consultado el 11 de noviembre de 2006 Amdahl Gene M 18 20 de abril de 1967 Validity of the single processor approach to achieving large scale computing capabilities Proceeding AFIPS 67 Spring en ingles 483 485 doi 10 1145 1465482 1465560 Brooks Frederick P 1996 The mythical man month essays on software engineering en ingles Anniversary repr with corr 5 edicion Reading Mass Addison Wesley ISBN 0 201 83595 9 Gustafson John L mayo de 1988 Reevaluating Amdahl s law Communications of the ACM en ingles 31 5 532 533 doi 10 1145 42411 42415 Archivado desde el original el 27 de septiembre de 2007 La referencia utiliza el parametro obsoleto mes ayuda Bernstein A J 1 de octubre de 1966 Analysis of Programs for Parallel Processing IEEE Transactions on Electronic Computers en ingles EC 15 5 757 763 doi 10 1109 PGEC 1966 264565 Roosta Seyed H 2000 Parallel processing and parallel algorithms theory and computation en ingles New York NY u a Springer p 114 ISBN 0 387 98716 9 Lamport Leslie 1 de septiembre de 1979 How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs IEEE Transactions on Computers en ingles C 28 9 690 691 doi 10 1109 TC 1979 1675439 Patterson y Hennessy p 748 Culler et al p 15 Culler et al p 15 Patt Yale 2004 The Microprocessor Ten Years From Now What Are The Challenges How Do We Meet Them wmv en ingles Carnegie Mellon University Archivado desde el original el 14 de abril de 2008 Consultado el 7 de noviembre de 2007 a b Culler et al p 124 a b Culler et al p 125 a b Patterson y Hennessy p 713 a b Hennessy y Patterson p 549 Patterson y Hennessy p 714 What is clustering Webopedia computer dictionary en ingles Consultado el 7 de noviembre de 2007 Beowulf definition en ingles PC Magazine Consultado el 7 de noviembre de 2007 Architecture share for 06 2007 en ingles Archivado desde el original el 14 de noviembre de 2007 Consultado el 7 de noviembre de 2007 Hennessy y Patterson p 537 MPP Definition en ingles PC Magazine Consultado el 7 de noviembre de 2007 Kirkpatrick Scott 2003 COMPUTER SCIENCE Rough Times Ahead Science en ingles 299 5607 668 669 PMID 12560537 doi 10 1126 science 1081623 a b c Michael R Chief Operating Officer DRC Computer Corporation Invited speaker D Amour 28 de febrero de 2007 Standard Reconfigurable Computing en ingles Universidad de Delaware Sha Kia Boggan Pressel Daniel M agosto de 2007 GPUs An Emerging Platform for General Purpose Computation ARL SR 154 pdf en ingles U S Army Research Lab Archivado desde el original el 25 de diciembre de 2016 Consultado el 7 de noviembre de 2007 Maslennikov Oleg 2002 Systematic Generation of Executing Programs for Processor Elements in Parallel ASIC or FPGA Based Systems and Their Transformation into VHDL Descriptions of Processor Element Control Units Lecture Notes in Computer Science 2328 2002 en ingles 272 Archivado desde el original el 11 de febrero de 2020 Consultado el 19 de diciembre de 2012 Shimokawa Y Y Fuwa and N Aramaki 18 al 21 de noviembre de 1991 A parallel ASIC VLSI neurocomputer for a large number of neurons and billion connections per second speed International Joint Conference on Neural Networks en ingles 3 2162 2167 ISBN 0 7803 0227 3 doi 10 1109 IJCNN 1991 170708 La referencia utiliza el parametro obsoleto coautores ayuda Acken Kevin P Irwin Mary Jane Owens Robert M 1 de enero de 1998 The Journal of VLSI Signal Processing en ingles 19 2 97 113 doi 10 1023 A 1008005616596 Scoping the Problem of DFM in the Semiconductor Industry en ingles Universidad de California San Diego 21 de junio de 2004 Archivado desde el original el 31 de enero de 2008 a b Patterson y Hennessy p 751 Sidney Fernbach Award given to MPI inventor Bill Gropp en ingles Archivado desde el original el 25 de julio de 2011 Consultado el 19 de diciembre de 2012 Shen John Paul Mikko H Lipasti 2004 Modern processor design fundamentals of superscalar processors en ingles 1ra edicion Dubuque Iowa McGraw Hill p 561 ISBN 0 07 057064 7 La referencia utiliza el parametro obsoleto coautores ayuda Padua David 2011 Encyclopedia of Parallel Computing en ingles 4 p 265 ISBN 0387097651 Krste et al Asanovic 18 de diciembre de 2006 The Landscape of Parallel Computing Research A View from Berkeley pdf en ingles Technical Report No UCB EECS 2006 183 Universidad de California Berkeley pp 17 19 a b Hennessy Patterson en ingles pp 749 50 Falta el titulo ayuda Conte Menabrea Menabrea L F Federico Luigi 1842 Sketch of the Analytic Engine Invented by Charles Babbage en ingles Bibliotheque Universelle de Geneve Consultado el 7 de noviembre de 2007 a b c Patterson y Hennessy p 753 da Cruz Frank 2003 Columbia University Computing History The IBM 704 en ingles Columbia University Consultado el 1 de agosto de 2008 Gill S abril de 1958 Parallel Programming en ingles 1 Sociedad Britanica de Computacion The Computer Journal pp 2 10 a b c d e Wilson Gregory V 1994 The History of the Development of Parallel Computing en ingles Virginia Tech Norfolk State University Interactive Learning with a Digital Library in Computer Science Consultado el 1 de agosto de 2008 Anthes Gry 19 de noviembre de 2001 The Power of Parallelism Computerworld en ingles Archivado desde el original el 4 de junio de 2008 Consultado el 1 de agosto de 2008 Patterson y Hennessy p 749 Bibliografia EditarSingh David Culler J P 1997 Parallel computer architecture en ingles Nachdr edicion San Francisco Morgan Kaufmann Publ p 15 ISBN 1 55860 343 3 Hennessy John L Patterson David A 27 de septiembre de 2006 Computer Architecture A Quantitative Approach Arquitectura de computadoras un enfoque cuantitativo en ingles 4ta edicion Morgan Kaufmann ISBN 0123704901 Patterson David A Hennessy John L 9 de noviembre de 2011 Computer Organization and Design Fourth Edition The Hardware Software Interface Organizacion y diseno de computadoras 4ta edicion La interfaz hardware software en ingles 4ta edicion Morgan Kaufmann ISBN 0123747503 Lectura adicional EditarRodriguez C Villagra M Baran B 29 de agosto de 2008 Asynchronous team algorithms for Boolean Satisfiability Bio Inspired Models of Network Information and Computing Systems 2007 Bionetics 2007 2nd en ingles 66 69 doi 10 1109 BIMNICS 2007 4610083 Enlaces externos Editar Wikilibros alberga un libro o manual sobre Distributed Systems Wikimedia Commons alberga una galeria multimedia sobre Computacion paralela Computacion paralela en Open Directory Project OpenHMPP A New Standard for Manycore en ingles Internet Parallel Computing Archive en ingles Universal Parallel Computing Research Center en ingles Designing and Building Parallel Programs by Ian Foster en ingles Go Parallel Translating Multicore Power into Application Performance en ingles What makes parallel programming hard en ingles Course in Parallel Computing at University of Wisconsin Madison en ingles Parallel and distributed Gr obner bases computation in JAS en ingles Parallel Computing Works Free On line Book en ingles Comparing programmability of Open MP and pthreads en ingles Lawrence Livermore National Laboratory Introduction to Parallel Computing en ingles Course in Parallel Programming at Columbia University in collaboration with IBM T J Watson X10 project en ingles Frontiers of Supercomputing Free On line Book Covering topics like algorithms and industrial applications en ingles Parallel processing topic area at IEEE Distributed Computing Online en ingles Esta obra contiene una traduccion derivada de Parallel computing de la Wikipedia en ingles publicada por sus editores bajo la Licencia de documentacion libre de GNU y la Licencia Creative Commons Atribucion CompartirIgual 3 0 Unported Datos Q232661 Multimedia Parallel computingObtenido de https es wikipedia org w index php title Computacion paralela amp oldid 136675142, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos