Computación paralela

1

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.[2][3]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,[4][5] la computación en paralelo se ha convertido en el paradigma dominante en la arquitectura de computadores, principalmente en forma

La supercomputadora Cray-2 fue la más rápida del mundo desde 1985 hasta 1989.

de procesadores multinúcleo.

[6][]

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 la tareas específicas, se utilizan arquitecturas especializadas de computación en paralelo junto a procesadores tradicionales.

La supercomputadora paralela Blue Gene de IBM.

Los programas informáticos paralelos son más difíciles de escribir que los secuenciales, [7] 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.

[8] Sin embargo. [] 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. Con el fin del aumento de la frecuencia. el consumo de energía de un chip está dada por la ecuación P = C × V 2 × F. donde P es la potencia. Estas instrucciones se ejecutan en una unidad central de procesamiento en un ordenador. por tanto un aumento en la frecuencia reduce el tiempo de ejecución de los programas de cómputo. [9]Un aumento en la frecuencia aumenta la cantidad de energía utilizada en un procesador. C es el cambio de capacitancia por ciclo de reloj —proporcional al número de transistores cuyas entradas cambian—. 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.Computación paralela 2 Conceptos básicos Tradicionalmente. y las repetidas predicciones de su fin. la ley de Moore sigue vigente. por el contrario. El tiempo de ejecución de un programa es igual al número de instrucciones multiplicado por el tiempo promedio por instrucción. V es la tensión. o cualquier combinación de los anteriores. Los elementos de procesamiento son diversos e incluyen recursos tales como una computadora con múltiples procesadores. utiliza simultáneamente múltiples elementos de procesamiento para resolver un problema. Para resolver un problema. varios ordenadores en red. [10] 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. 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. Sólo puede ejecutarse una instrucción a la vez y un tiempo después de que la instrucción ha terminado. se construye un algoritmo y se implementa como un flujo en serie de instrucciones. este hecho generalmente se cita como el fin del escalado de frecuencia como el paradigma dominante de arquitectura de computadores. los programas informáticos se han escrito para el cómputo en serie. 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. hardware especializado. Manteniendo todo lo demás constante. se ejecuta la siguiente.[] La computación en paralelo.[11] A pesar de los problemas de consumo de energía. . el aumento de la frecuencia de reloj reduce el tiempo medio que tarda en ejecutarse una instrucción. y F es la frecuencia del procesador (ciclos por segundo).

no importa cuántas mujeres se le asigne». 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.[12] 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. Si es la fracción de tiempo que un programa gasta en partes no paralelizables. la aplicación de un mayor esfuerzo no tiene efecto sobre la programación. 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. La gestación de un niño toma nueve meses. se puede obtener no más de 10× de aceleración. formulada Representación gráfica de la ley de Amdahl. [13] La ley de Gustafson es otra ley en computación que está en estrecha relación con la ley de Amdahl. [14] Señala que el aumento de velocidad con procesadores es . 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. la aceleración a partir de la paralelización es lineal. independientemente de cuántos procesadores se añadan. Sin embargo. Esto pone un límite superior a la utilidad de añadir más unidades de ejecución paralelas. si el 10% del programa no puede paralelizarse. originalmente por Gene Amdahl en la década de 1960.Computación paralela 3 Ley de Amdahl y ley de Gustafson Idealmente. Los programas que resuelven problemas matemáticos o ingenieriles típicamente consisten en varias partes paralelizables y varias no paralelizables (secuenciales). Si la parte secuencial del programa abarca el 10% del tiempo de ejecución. Por ejemplo. «Cuando una tarea no puede divididirse debido a las limitaciones secuenciales. luego es la máxima aceleración que se puede alcanzar con la paralelización del programa. 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. La aceleración potencial de un algoritmo en una plataforma de cómputo en paralelo está dada por la ley de Amdahl. y pasa a ser constante para un gran número de elementos de procesamiento.

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. b) 2: c: = a · b 3: d: b = 3 · 4: e: = a + b . B tarda aproximadamente 25% del tiempo total. Con esfuerzo adicional. 1: función NoDep (a. pero esto reduce el tiempo de cálculo global por muy poco. un programador puede hacer esta parte cinco veces más rápida. por lo que la cantidad total de trabajo que se hará en paralelo también es independiente del número de procesadores. que demuestran varios tipos de dependencias: 1: 2: 3: 4: función Dep(a. generalmente hay oportunidades para ejecutar cálculos independientes en paralelo. y del mismo modo para Pj. cuando el segundo segmento (Pj) produce una variable que necesita el primer segmento (Pi). Para Pi. la mayoría de los algoritmos no consisten sólo de una larga cadena de cálculos dependientes. La tercera y última condición representa una dependencia de salida: Cuando dos segmentos escriben en el mismo lugar. y por tanto introduce una dependencia de flujo. b) c: = a · b d: = 3 · c fin función La operación 3 en Dep(a. Sea Pi y Pj dos segmentos del programa. Las condiciones de Bernstein [15] describen cuando los dos segmentos son independientes y pueden ejecutarse en paralelo. P i y Pj son independientes si satisfacen • • • Una violación de la primera condición introduce una dependencia de flujo. el resultado viene del último segmento ejecutado. La segunda condición representa una anti-dependencia. Esto viola la condición 1. puede que sea necesario poco trabajo para hacer que la parte A sea doble de rápida. Dependencias Entender la dependencia de datos es fundamental en la implementación de algoritmos paralelos. ya que los cálculos que dependen de cálculos previos en la cadena deben ejecutarse en orden. Supongamos que una tarea tiene dos partes independientes. Por otro lado.[16] Considere las siguientes funciones. A y B. correspondiente al primer segmento que produce un resultado utilizado por el segundo segmento. Esto haría el cálculo mucho más rápido que mediante la optimización de la parte B. La ley de Amdahl supone que todo el problema es de tamaño fijo.Computación paralela 4 Ambas leyes asumen que el tiempo de funcionamiento de la parte secuencial del programa es independiente del número de procesadores. a pesar de que B tiene una mayor aceleración (5x frente a 2×). Sin embargo. ya que en la operación 3 se utiliza un resultado de la operación 2. b) no puede ejecutarse antes de —o incluso en paralelo con— la operación 2. 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). sean Ii todas las variables de entrada y Oi las variables de salida.

Computación paralela 5 5: fin función En este ejemplo. pueden ralentizar en gran medida un programa. Por esto son necesarios algunos medios que impongan un ordenamiento entre los accesos tales como semáforos. Esto requiere el uso de una barrera. y desbloquear los datos cuando termine. exclusión mutua. Un bloqueo atómico bloquea múltiples variables a la vez. sincronización. evitan el uso de bloqueos y barreras. conocida como algoritmos libres de bloqueo y libres de espera. si no puede bloquearlas todas. Por ejemplo. y desaceleración paralela Las subtareas en un programa paralelo a menudo son llamadas hilos. Una clase de algoritmos. Bloquear múltiples variables utilizando cerraduras no atómicas introduce la posibilidad de que el programa alcance un bloqueo mutuo (deadlock). Condiciones de carrera. es posible que un hilo bloquee uno de ellas y el otro bloquee la segunda variable. «hilos» es generalmente aceptado como un término genérico para las subtareas. 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. barreras o algún otro método de sincronización. Por lo tanto. este enfoque es generalmente . el programa anterior se puede reescribir usando bloqueos: Hilo A 1A: Bloquear variable V 2A: Lee variable V Hilo B 1B: Bloquear 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. para garantizar la correcta ejecución del programa. no se bloquea ninguna de ellas. Las barreras se implementan normalmente mediante un bloqueo. Las instrucciones entre los dos programas pueden entrelazarse en cualquier orden. Muchos programas paralelos requieren que sus subtareas actúen en sincronía. El programador debe utilizar un bloqueo (lock) para proporcionar exclusión mutua. Algunas arquitecturas de computación paralela utilizan versiones más pequeñas y ligeras de hilos conocidas como hebras. Si hay dos hilos y cada uno necesita bloquear las mismas dos variables utilizando cerraduras no atómicas. mientras que otros utilizan versiones más grandes conocidos como procesos. mientras que el otro hilo no podrá continuar hasta que V se desbloquee. Los hilos a menudo tendrán que actualizar algunas variables que se comparten entre ellos. En tal caso se produce un bloqueo mutuo donde ningún hilo puede completar la ejecución. 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 —. Si bien los bloqueos son necesarios para asegurar la ejecución correcta del programa. hasta que la variable esté desbloqueado. no existen dependencias entre las instrucciones. Sin embargo. Sin embargo. Las condiciones de Bernstein no permiten que la memoria se comparta entre los diferentes procesos. por lo que todos ellos se pueden ejecutar en paralelo. considere el siguiente programa: Hilo A 1A: Lee variable V Hilo B 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. el programa va a producir datos incorrectos. Esto se conoce como una condición de carrera. o si la instrucción 1A se ejecuta entre 1B y 3B. Esto garantiza la correcta ejecución del programa.

También es conocido por su trabajo en el desarrollo del software LaTeX. estos modelos se pueden representar de varias maneras. Paralelismo de grano fino. 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. Lógicas tales como la TLA+ de Lamport. Por lo general. [17] Leslie Lamport definió por primera vez el concepto de consistencia La memoria transaccional es un tipo de modelo de consistencia. 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. Esto se conoce como desaceleración paralela.. estos hilos pasan una porción cada vez mayor de su tiempo comunicándose entre sí.. han añadido la capacidad para razonar acerca de las topologías dinámicas. mientras una tarea se divida en cada vez más hilos. 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 es vergonzosamente paralelo si nunca o casi nunca se tienen que comunicar. 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í. Una aplicación muestra un paralelismo de grano fino si sus subtareas deben comunicase muchas veces por segundo. como el cálculo-π. fueron un primer intento de codificar las reglas de los modelos de consistencia.Computación paralela 6 difícil de implementar y requiere estructuras de datos correctamente diseñadas. El modelo de consistencia define reglas para las operaciones en la memoria del ordenador y cómo se producen los resultados. Eventualmente. Uno de los primeros modelos de consistencia fue el modelo de consistencia secuencial de Leslie Lamport. secuencial. Aplicaciones vergonzosamente paralelas son consideradas las más fáciles de paralelizar. 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í. es un programa secuencial consistente si «. y las operaciones de cada procesador individual aparecen en esta secuencia en el orden especificado por el programa». y modelos matemáticos se han desarrollado para describir el comportamiento de sistemas concurrentes. 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. y la paralelización adicional —dividir la carga de trabajo entre incluso más hilos— aumenta la cantidad de tiempo requerido para terminar. Específicamente. Matemáticamente. Las Redes de Petri. la sobrecarga de comunicación domina el tiempo empleado para resolver el problema. . Modelos de consistencia 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—. se considera paralelismo de grano grueso si no se comunican muchas veces por segundo. No todas las paralelizaciones conllevan una aceleración. Adiciones más recientes a la familia de cálculo de proceso. A principios de la década de 1970. que se introdujeron en 1962 como tesis doctoral de Carl Adam Petri.

Computación paralela 7 Taxonomía de Flynn Michael J. esta tendencia general llegó a su fin con la introducción de procesadores de 64 bits. 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. Además. 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. fácil de entender.» [18] 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. este modelo clásico ha sobrevivido porque es simple. programas paralelos y secuenciales. lo que ha sido un estándar en la computación de propósito general durante la última década. Instrucción individual Instrucción múltiple Datos individuales SISD Múltiples datos SIMD MISD MIMD La clasificación instrucción-única-dato-único (SISD) es equivalente a un programa totalmente secuencial. Según David A. el procesador primero debe adicionar los 8 bits de orden inferior de cada número entero con la instrucción de adición. ahora conocida como la taxonomía de Flynn. Flynn creó uno de los primeros sistemas de clasificación de computadoras. Instrucciones-múltiples-dato-único (MISD) es una clasificación que rara vez se utiliza. la aceleración en la arquitectura de computadores se lograba en gran medida duplicando el tamaño de la palabra en la computadora. luego de 16 bits y 32 bits. los microprocesadores de 4 bits fueron sustituidos por unos de 8 bits. por supuesto. A pesar de que se diseñaron arquitecturas de computadoras en esta categoría —como arreglos sistólicos—. es. . Por ejemplo. «Algunas máquinas son híbridos de estas categorías. la cantidad de información que el procesador puede manejar por ciclo. el esquema más utilizado. Patterson y John L. tal vez por su comprensibilidad. Históricamente. a continuación. muy pocas aplicaciones se materializaron. en donde un procesador de 16 bits necesita una sola instrucción para poder completarla. cuando un procesador de 8 bits debe sumar dos enteros de 16 bits. Hennessy .[19] 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. Los programas instrucciones-múltiples-datos-múltiples (MIMD) constituyen el tipo más común de programas paralelos. Esto se hace comúnmente en aplicaciones de procesamiento de señales. y da una buena primera aproximación. 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. en este caso un procesador de 8 bits requiere dos instrucciones para completar una sola operación.

Paralelismo de datos El paralelismo de datos es el paralelismo inherente en programas con ciclos. acceso a la memoria y escritura. que se centra en la distribución de los datos entre los diferentes nodos computacionales que deben tratarse en paralelo. en esencia. 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. EX = Ejecutar. Un procesador superescalar con pipeline de cinco etapas. ejecutar. 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. El procesador Pentium 4 tenía un pipeline de 35 etapas. Los avances en el paralelismo a Un pipeline canónico de cinco etapas en una máquina RISC (IF = Pedido de Instrucción. capaz de ejecutar dos instrucciones por ciclo.[21] Además del paralelismo a nivel de instruccióndelpipelining. Estos son conocidos como procesadores superescalares. Por ejemplo.algunos procesadores pueden ejecutar más de una instrucción a la vez. «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».Computación paralela 8 Paralelismo a nivel de instrucción Un programa de ordenador es. con cinco etapas: pedir instrucción. un procesador con un pipeline de N etapas puede tener hasta n instrucciones diferentes en diferentes etapas de finalización.[20] Los procesadores modernos tienen ''pipeline'' de instrucciones de varias etapas. WB = Escritura) nivel de instrucción dominaron la arquitectura de computadores desde mediados de 1980 hasta mediados de la década de 1990. Esto se conoce como paralelismo a nivel de instrucción. El ejemplo canónico de un procesador segmentado es un procesador RISC. MEM = Acceso a la memoria. ID = Decodificación de instrucción. considere el siguiente pseudocódigo que calcula los primeros números de Fibonacci: 1: 2: 3: 4: PREV1 := 0 PREV2 := 1 do: CUR := PREV1 + PREV2 . [22] Muchas de las aplicaciones científicas y de ingeniería muestran paralelismo de datos. una secuencia de instrucciones ejecutadas por un procesador. para un total de hasta 10 instrucciones (se muestra en verde) ejecutadas simultáneamente. decodificar. Puede tener dos instrucciones en cada etapa del pipeline. Estas instrucciones pueden reordenarse y combinarse en grupos que luego son ejecutadas en paralelo sin cambiar el resultado del programa. Las dependencias de terminación de ciclo evitan la paralelización de ciclos. Cada etapa en el pipeline corresponde a una acción diferente que el procesador realiza en la instrucción correspondiente a la etapa. Las instrucciones pueden agruparse juntas sólo si no hay dependencia de datos entre ellas.

Computación paralela 9 5: 6: 7: PREV1 := PREV2 PREV2 := CUR while (CUR < 10) Este bucle no se puede paralelizar porque CUR depende de sí mismo (PREV2) y de PREV1. Los físicamente. Un sistema que no tieneprocesadores 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. la paralelización de datos disponible generalmente también lo hace.[23] 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». Dado que cada iteración depende del resultado de la anterior. A medida que el tamaño de un problema se hace más grande. 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. generalmente realizan un seguimiento de los valores almacenados en caché y estratégicamente los eliminan. pequeños recuerdos rápidos ubicados cerca del procesador que almacenan las copias temporales de los valores de la memoria —cercano. El paralelismo de tareas por lo general no escala con el tamaño de un problema. [22] Esto contrasta con el paralelismo de datos. [24]El término memoria distribuida se refiere al hecho de que la memoria se distribuye lógicamente. Los accesos a la memoria local suelen ser más rápidos que los accesos a memoria no local. sólo se puede lograr con un sistema de memoria compartida.esta propiedad se conoce como arquitectura de acceso a memoria no uniforme (NUMA). Bus sniffing es uno de los métodos más comunes para hacer el seguimiento de los valores a los que se está accediendo. pero a menudo implica que también se distribuyen físicamente.[23] 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 —. La memoria distribuida-compartida y la virtualización de memoria combinan los dos enfoques. que se calculan en cada iteración del bucle. donde el procesador tiene su propia memoria local y permite acceso a la memoria de los procesadores que no son locales. El diseño de grandes sistemas de coherencia caché y de alto rendimiento es un problema muy difícil en arquitectura de computadores. donde se realiza el mismo cálculo en distintos o mismos grupos de datos. tanto en el sentido físico y lógico—. Los sistemas informáticos suelen hacer uso de cachés. 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). Como . no se pueden realizar en paralelo. Los sistemas de memoria distribuidos tienen acceso no uniforme a la memoria. o distribuida —cada elemento de procesamiento tiene su propio espacio local de direcciones—. Típicamente. garantizando la correcta ejecución del programa. Estos equipos requieren coherencia en la caché del sistema. donde la memoria no está distribuida Una vista lógica de una arquitectura con acceso a memoria no uniforme (NUMA).

Como resultado. cada núcleo puede ejecutar múltiples instrucciones de un flujo de instrucciones. hipercubo. Un procesador con capacidad de multithreading simultáneo tiene una sola unidad de ejecución (núcleo). Esta clasificación es análoga a la distancia entre los nodos básicos de cómputo. en cada ciclo. 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. un procesador multinúcleo puede ejecutar múltiples instrucciones por ciclo de secuencias de instrucciones múltiples. se utiliza para procesar un segundo hilo.Computación paralela 10 resultado.[24] 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—. es decir. 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. durante un error de caché—. las arquitecturas de memoria compartida no son tan escalables como los sistemas de memoria distribuida. un bus compartido o una red interconectada de una gran variedad de topologías como estrella. pero cuando esa unidad de ejecución está desocupada —por ejemplo. 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.[26] «Debido al pequeño tamaño de los procesadores y de la significativa reducción en los requisitos de ancho de banda de bus. Cada núcleo en un procesador multinúcleo potencialmente puede ser superescalar. Clases de computadoras paralelas Las computadoras paralelas se pueden clasificar de acuerdo con el nivel en el que el hardware soporta paralelismo. [25] . siempre que exista una cantidad suficiente de ancho de banda». El microprocesador Cell de IBM. Es probable que el medio utilizado para la comunicación entre los procesadores de grandes máquinas multiprocesador sea jerárquico. hipercubo grueso —un hipercubo con más de un procesador en un nodo —. árbol. los SMPs generalmente no comprenden más de 32 procesadores. El ''Multithreading'' simultáneo —de la cual Intel HyperThreading es el más conocido— era una forma de pseudo-multinúcleo. a diferencia de este. o de malla n-dimensional. Estos no son excluyentes entre sí. [25] La contención del bus previene el escalado de esta arquitectura. tales multiprocesadores simétricos son extremadamente rentables. un conmutador de barras cruzadas (crossbar switch). por ejemplo. los grupos de multiprocesadores simétricos son relativamente comunes. es otro prominente procesador multinúcleo. Los procesadores superescalares pueden ejecutar múltiples instrucciones por ciclo de un flujo de instrucciones (hilo). diseñado para su uso en la consola Sony PlayStation 3. anillo.

Se hace uso de ordenadores que se comunican a través de la Internet para trabajar en un problema dado.[33] La mayoría de las aplicaciones de computación distribuida utilizan middleware. el balance de carga es más difícil de lograr. Los MPPs también tienden a ser más grandes que los clústeres. La gran mayoría de los superordenadores TOP500 son clústeres. Un gabinete de Blue Gene/L.[28] La tecnología Beowulf fue desarrollada originalmente por Thomas Sterling y Donald Becker. Cada subsistema se comunica con los demás a través de un interconexión de alta velocidad». conectados en red.[27] Los clústeres se componen de varias máquinas independientes conectadas por una red. pero cuentan con redes especializadas de interconexión —en tanto que las clústeres utilizan hardware estándar para la creación de redes —. . de modo que en algunos aspectos pueden considerarse como un solo equipo. Se han creado muchas aplicaciones de computación distribuida. que es un clúster implementado con múltiples ordenadores comerciales idénticos conectados a una red de área local TCP/IP Ethernet. «cada CPU tiene su propia memoria y una copia del sistema operativo y la aplicación. software que se encuentra entre el sistema operativo y la aplicación para administrar los recursos de red y estandarizar la interfaz de software.[29][30] Procesamiento paralelo masivo Un procesador paralelo masivo (MPP) es un solo equipo con varios procesadores Un clúster Beowulf. realizando cálculos cuando el procesador de un equipo está desocupado. con «mucho más» de 100 procesadores. [31] En un MPP.Computación paralela 11 Computación distribuida Un ordenador distribuido —también conocido como un multiprocesador de memoria distribuida — es un sistema computacional de memoria distribuida en el que los elementos de procesamiento están conectados por una red. Mientras que las máquinas de un clúster no tienen que ser simétricas. Tienen muchas de las características de los clúster. El tipo más común de clúster es el cluster Beowulf. El más común es la Infraestructura Abierta de Berkeley para Computación en Red (BOINC). Los ordenadores distribuidos son altamente escalables. clasificado como el cuarto mejor superordenador del mundo de acuerdo a la clasificación TOP500 en 11/2008.[32] Computación distribuida La computación distribuida es la forma más distribuida de la computación paralela. de no serlo. Computación en clúster Un clúster es un grupo de ordenadores débilmente acoplados que trabajan en estrecha colaboración. A menudo. la computación distribuida normalmente sólo se refiere a problemas vergonzosamente paralelos. SETI@home y Folding@home son los ejemplos más conocidos. Blue Gene/L es un procesador masivamente paralelo. los programas de computación distribuida hacen uso de «ciclos de repuesto». Debido al bajo ancho de banda y la latencia extremadamente alta de Internet.

con el que la mayoría de los programadores están familiarizados. El consorcio de tecnología Khronos Group ha lanzado OpenCL. También se pueden utilizar para este propósito subconjuntos específicos de SystemC basados en C++. Los lenguajes «C a HDL» más conocidos son Mitrion-C. que puede ser extremadamente cara.Computación paralela 12 Computadoras paralelas especializadas Dentro de la computación paralela. existen dispositivos paralelos especializados que generan interés. 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. y la tendencia a ser superados por la ley de Moore. Un FPGA es. un ASIC tiende a superar a un ordenador de propósito general.. Otros lenguajes de programación de GPU incluyen: BrookGPU. varios nuevos lenguajes de programación y plataformas se han construido para realizar cómputo de propósito general sobre GPUs. Los GPUs son co-procesadores que han sido fuertemente optimizados para procesamiento de gráficos por computadora. un chip de computadora que puede reconfigurarse para una tarea determinada. Director de Operaciones de la DRC Computer Corporation. Como resultado. C Impulse. Intel. 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. tienden a ser aplicables sólo a unas pocas clases de problemas paralelos. Varios vendedores han creado lenguajes «C a HDL» que tratan de emular la sintaxis y/o semántica del lenguaje de programación C. los programas de GPGPU normalmente utilizaban el API de gráficos para ejecutar programas. un ejemplo es el peta-flop RIKEN MDGRAPE-3 de la máquina que utiliza ASICs para la . Este proceso requiere una máscara. puede ser completamente optimizado para esa aplicación. [38][39] Mientras más pequeño sean los transistores necesarios para el chip. para una aplicación dada. Sin embargo. 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. respectivamente.[] De acuerdo con Michael D'Amour R. «cuando entramos en AMD. ha hecho inviable el uso de ASICs para la mayoría de las aplicaciones paralelas. Mientras tanto. Los FPGAs se pueden programar con lenguajes de descripción de hardware como VHDL o Verilog. AMD. Nvidia también ha lanzado productos específicos para la computación en su serie Tesla. nos llamaban ladrones de zócalos. Nvidia y otros están apoyando OpenCL. algunos han sido construidos.[34] 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. Tarjeta Nvidia Tesla GPGPU Al principio. los lenguajes de programación pueden ser tediosos.[35][36][37] Debido a que un ASIC (por definición) es específico para una aplicación dada. los ASICs son creados con litografía de rayos X. 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. que es un marco para la escritura de programas que se ejecutan en distintas plataformas conformadas por CPUs y GPUs. [] Cómputo de propósito general en unidades de procesamiento gráfico (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. en esencia. más cara será la máscara.[] El alto costo inicial. Sin embargo. Apple. DIME C y C-Handel. tanto Nvidia como AMD han liberado de entornos de programación con CUDA y Stream SDK. PeakStream y RapidMind. Sin embargo. Ahora nos llaman socios». Sin embargo. Una máscara puede costar más de un millón de dólares. Aunque no son específicos para un dominio.

o compartida-distribuida. Estos generalmente se pueden dividir en clases basadas en las suposiciones que se hacen sobre la arquitectura de memoria subyacente: compartida. Un ejemplo de operación con vectores es: A = B × C. «Los procesadores vectoriales tienen operaciones de alto nivel que trabajan sobre arreglos lineales de números o vectores. 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. Procesadores vectoriales Un procesador vectorial es un CPU o un sistema computacional que puede ejecutar la misma instrucción en grandes conjuntos de datos. [40] Están estrechamente relacionadas con la clasificación SIMD de Flynn. APIs y modelos de programación paralela han sido creados para la programación de computadores paralelos. mientras que Message Passing Interface (MPI) «Interfaz de Paso de Mensajes» es el API más utilizado en los sistemas de paso de mensajes. 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. Software Lenguajes de programación en paralelo Los lenguajes de programación concurrentes. y C son vectores de 64 elementos. 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. POSIX Threads y OpenMP son dos de las API más utilizadas con la memoria compartida. Los conjuntos de instrucciones de los procesadores modernos incluyen algunas instrucciones de procesamiento de vectores. han desaparecido. los procesadores vectoriales. En la arquitectura con memoria distribuida se utiliza el paso de mensajes. Las computadoras Cray se volvieron famosas por su procesamiento de vectores en los años 1970 y 1980. por ejemplo: AltiVec y Streaming SIMD Extensions (SSE). donde A.Computación paralela 13 simulación de dinámica molecular. Los lenguajes de programación de memoria compartida se comunican mediante la manipulación de variables en la memoria compartida. donde una parte de un programa promete proporcionar un dato requerido a otra parte del programa en un tiempo futuro. donde cada uno es un número de punto flotante de 64 bits».[41][42] El concepto «valor futuro» es muy utilizado en la programación de programas paralelos. Sin embargo.[40] Cray-1 es el procesador vectorial más famoso. 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. distribuida. tanto CPUs y como sistemas computacionales. B. bibliotecas. .

en los que un programador le da al compilador directivas de paralelización. Punto de control Mientras un sistema computacional crece en complejidad. 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.Computación paralela 14 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. desde la bioinformática (plegamiento de proteínas y análisis de secuencia) hasta la economía (matemática financiera). Existen pocos lenguajes de programación paralelos totalmente implícitos: SISAL. 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. se hace factible resolver problemas que antes tardaban demasiado tiempo en ejecutarse. un registro de todas las asignaciones actuales de recursos y estados variables. Parallel Haskell. semejante a un volcado de memoria. la paralelización automática ha tenido un éxito limitado.[45] Métodos algorítmicos Mientras que las computadoras paralelas se hacen más grandes y más rápidas. Disponer de un punto de control significa que el programa puede reiniciar desde este y no desde el principio. los algoritmos de ordenamiento) Programación dinámica Métodos de Ramificación y poda Modelos en grafos (tales como la detección de modelos ocultos de Markov y la construcción de redes bayesianas) Simulación de autómatas finitos . esta información se puede utilizar para restaurar el programa si el equipo falla. Los tipos de problemas encontrados comúnmente en las aplicaciones de computación en paralelo son: [46] • • • • • • • • • • • • • Álgebra lineal densa Álgebra lineal dispersa Métodos espectrales (tales como la transformada rápida de Fourier de Cooley-Tukey) Problemas de n-cuerpos (tales como la simulación Barnes-Hut) Problemas de grids estructurados (métodos de Lattice Boltzmann) Problemas de grids no estructurados (tales como los encontrados en el análisis de elementos finitos) Simulación de Montecarlo Lógica combinacional (por ejemplo. el tiempo medio entre fallos por lo general disminuye. y (para FPGAs) Mitrion C.[43][44] Los principales lenguajes de programación en paralelo permanecen explícitamente paralelos o en el mejor de los casos parcialmente implícitos. Mientras que los puntos de control proporcionan beneficios en una variedad de situaciones. técnicas criptográficas de fuerza bruta) Recorridos en grafos (por ejemplo. La computación en paralelo se utiliza en una amplia gama de campos.

en vez de hacer más rápido un solo núcleo. un sistema con multiprocesador simétrico capaz de ejecutar hasta ocho procesadores en paralelo. 15. [] 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. 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. [4] Antigua [sabiduría convencional]: La energía es gratuita y los transistores son caros. con hasta 256 procesadores. p.[52] En 1964. Sin embargo. p. Notas [2] 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. fue «uno de los primeros multiprocesadores con más de unos pocos procesadores».[50] También en 1958. [49] En abril de 1958. p. 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. Gill (Ferranti) analizó la programación en paralelo y la necesidad de la ramificación y la espera. 124. []En 1970. 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. Tardó 11 años. [23] Culler et al.[48] «El primer bus con conexión multi-procesador y caché espía fue el Synapse N+1 en el año 1984». como el Cray-1. [20] Culler et al. p. a través de un proyecto en el que Gene Amdahl fue uno de los principales arquitectos. fue superado por supercomputadoras comerciales.[] Su diseño fue financiado por la Fuerza Aérea de los Estados Unidos. Se convirtió en el primer equipo disponible en el mercado que utilizaba comandos aritméticos de punto flotante totalmente automáticos. 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.[47][48] IBM introdujo el IBM 704 en 1954. [51] En 1967. que fue el primer esfuerzo por lograr la computación en paralelo SIMD.. S. pues solo se había completado una cuarta parte del proyecto. [] Burroughs ILLIAC IV. 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. Slotnick había propuesto la construcción de un ordenador masivamente paralelo para el Laboratorio Nacional Lawrence Livermore. En 1969.. [19] Culler et al. .[48] Las computadoras paralelas SIMD se remontan a la década de 1970. ILLIAC IV fue llamado «el más infame de los superordenadores». 748. 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.Computación paralela 15 Historia Los orígenes del verdadero paralelismo (MIMD) se remontan a Federico Luigi. Incluso los representantes de Intel. Nueva [sabiduría convencional]: el incremento del paralelismo es el método principal para mejorar el rendimiento del procesador . «quizás el más infame de los [] superordenadores» Corporation presentó la D825 en 1962. un proyecto en la Universidad Carnegie Mellon con varios procesadores. Menabrea Conte y su «Bosquejo de la máquina analítica inventada por Charles Babbage». p.mmp. la compañía estadounidense Honeywell introdujo su primer sistema Multics. 15. [22] Culler et al. los investigadores de IBM John Cocke y Daniel Slotnick discutieron por primera vez el uso del paralelismo en cálculos numéricos.[] La clave de su diseño fue un paralelismo bastante alto. costando casi cuatro veces la estimación original. una empresa asociada a la posición: "mayor velocidad de reloj es mejor". C. 125.[53][] Cuando estaba listo para ejecutar una aplicación real por primera vez en 1976. Nueva [sabiduría convencional]: la energía es cara y los transistores son "gratuitos" [6] Antigua [sabiduría convencional]: incrementar la frecuencia de reloj es el método principal de mejorar el rendimiento del procesador. [18] Patterson y Hennessy.

2007. doi: 10. John L. p. p. Hennessy. El proyecto comenzó en 1965 y ejecutó su primera aplicación real en 1976 Referencias Bibliografía • Singh... [40] Patterson y Hennessy.. 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.org/xpl/articleDetails.. [53] Aunque tuvo éxito en impulsar varias tecnologías útiles en proyectos posteriores.60% de las máquinas en la lista. David A. 751. « Asynchronous team algorithms for Boolean Satisfiability (http://ieeexplore.jsp?arnumber=4610083)» (en inglés).openhmpp. Computación paralela (http://dmoz. Information and Computing Systems. 4610083). (27 de septiembre de 2006) (en inglés).. 66–69.mcs. A New Standard for Manycore (http://www.org) (en inglés) Internet Parallel Computing Archive (http://wotug. Parallel computer architecture (Nachdr. Aunque la paralelización automática de ciertas clases de algoritmos se ha demostrado. (29 de agosto de 2008). • Hennessy.net/) (en inglés) . p. Bionetics 2007. el santo grial de la investigación —paralelización automática de programas en serie— todavía tiene que materializarse. p. Wikimedia Commons alberga contenido multimedia sobre Computación paralelaCommons. C. Morgan Kaufmann. Enlaces externos Wikilibros • • • • • • Wikilibros alberga un libro o manual sobre Distributed Systems. 4ta edición: La interfaz hardware/software] (4ta edición). San Francisco: Morgan Kaufmann Publ.4610083 (http:/ / dx.org/Computers/Parallel_Computing/) en Open Directory Project. recorridos en grandes arreglos multidimensionales de datos de punto flotante—. B. [26] Patterson y Hennessy.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. 2nd: pp. [25] Hennessy y Patterson. J.1109/BIMNICS..ukc. 753. org/ 10.Computación paralela 16 [24] Patterson y Hennessy..2007.ac. 537. ISBN 0123704901. by Ian Foster (http://www-unix. Bio-Inspired Models of Network. David A.uk/parallel/) (en inglés) Universal Parallel Computing Research Center (http://www. 2007.sourceforge. • Patterson. Fourth Edition: The Hardware/Software Interface [Organización y diseño de computadoras.ieee. (9 de noviembre de 2011) (en inglés). [41] Se referencia la Interfaz de Paso de Mensajes como "la interfaz dominante de HPC" [43] Sin embargo.. ISBN 0123747503. Computer Organization and Design. edición). 1109/ BIMNICS. John L. Baran.. M.upcrc.anl. p. [29] En los TOP500 Supercomputing Sites los clústeres alcanzan el 74. 749. p.edu/) (en inglés) • Designing and Building Parallel Programs. Fue tal vez la más infame de las supercomputadoras. [48] Patterson y Hennessy. 713. Lectura adicional • Rodriguez. Los costos se ascendieron de los $8 millones estimados en 1966 a $31 millones en 1972.gov/dbpp/) (en inglés) • Go Parallel: Translating Multicore Power into Application Performance (http://goparallel. [31] Hennessy y Patterson. [52] Patterson y Hennessy. Computer Architecture: A Quantitative Approach [Arquitectura de computadoras: un enfoque cuantitativo] (4ta edición). a pesar de la construcción de sólo un cuarto de la máquina planeada . OpenHMPP. Patterson. 549.. p.illinois. 714. p. [38] . (1997) (en inglés). el IV ILLIAC no triunfó como ordenador..P. David Culler . ISBN 1-55860-343-3. 15. doi. este éxito ha sido en gran parte limitado a aplicaciones científicas y numéricas con control de flujo predecible —por ejemplo. Morgan Kaufmann. Villagra.

futurechips.html) (en inglés) • Comparing programmability of Open MP and pthreads (http://www.new-npac.htm) (en inglés) • Parallel and distributed Gr obner bases computation in JAS (http://arxiv. 0011v1.jsp?pageID=dso_level1_home&path=dsonline/topics/parallel&file=index. xsl) (en inglés) • Esta obra deriva de la traducción de Parallel_computing.cdlib.g ov/ computing/tutorials/parallel_comp/) (en inglés) • Course in Parallel Programming at Columbia University (in collaboration with IBM T.org/portal/site/ dsonline/index.0 Unported por editores de la Wikipedia en inglés.ning.futurechips.org/tips -for-power-coders/ open-mp-pthreads.llnl.Computación paralela • What makes parallel programming hard? (http://www.html) (en inglés) • Lawrence Livermore National Laboratory: Introduction to Parallel Computing (http://www.pdf) (en inglés) 17 • Parallel Computing Works Free On-line Book (http://www.edu/Courses/ME964/ 2011/index.com/) (en inglés) • Frontiers of Supercomputing Free On-line Book Covering topics like algorithms and industrial applications (http:/ /ark.computer.html) (en inglés) • Course in Parallel Computing at University of Wisconsin -Madison (http://sbel. .org/ark:/13030/ft0f59n73z/) (en inglés) • Parallel processing topic area at IEEE Distributed Computing Online (http://dsonline. publicada bajo la Licencia de documentación libre de GNU y la Licencia Creative Commons Atribución-CompartirIgual 3.wisc.org/PS_cache/arxiv/pdf/1008/1008.J Watson X10 project) (http://ppppcourse.org/tips-for-power-coders/ parallel-programming.org/projects/cdroms/cewes-1998-05/ copywrite/pcw/book.xml&xsl=generic.

Emijrp. GermanX.0/ . Qurren.jpg Fuente: http://es.svg Fuente: http://es.wikipedia.svg Licencia: Public Domain Contribuyentes: LordT (from the original by user:Gorivero File:Leslie Lamport.wikipedia.php?title=Archivo:BlueGeneL_cabinet. Cirt. Licencia Creative Commons Attribution-Share Alike 3.php?title=Archivo:Beowulf. Archivo:Commons-logo.org/licenses/by-sa/3.Monniaux File:IBM Blue Gene P supercomputer.org/w/index. Licencias y contribuyentes Archivo:Cray 2 Arts et Metiers dsc03940. created by Reidab. original version (File:Superscalarpipeline.0 Contribuyentes: Amit6.Fuentes y contribuyentes del artículo 18 Fuentes y contribuyentes del artículo Computación paralela Fuente: http://es. PACO.wikipedia.jpg Licencia: Creative Commons Attribution-Sharealike 2.org/w/index. based on the earlier PNG version. ManuelGR. Mercenario97. Gothmog. Kokoo.svg Fuente: http://es. Hawking.jpg Fuente: http://es.jpg Licencia: Creative Commons Attribution-Sharealike 2. Ganímedes.0 Contribuyentes: Dvd.0 Contribuyentes: Dvd.jpg Licencia: Public Domain Contribuyentes: Adamantios.jpg Fuente: http://es. Raul654.php?title=Archivo:NvidiaTesla. Dvd.png) by User:Poil Image:Esp Numa.wikipedia.org/w/index.php?title=Archivo:Optimizing-different-part-es. Diegusjaimes.0 Contribuyentes: Argonne National Laboratory's Flickr page File:Ley de Amdahl. Hyins. IvanM89. Farisori.jpg Fuente: http://es.org/w/index.darias. FAEP. Stan Shebs.jpg Licencia: GNU Free Documentation License Contribuyentes: Morio. Dodo.php?title=Archivo:Commons-logo.org/w/index.svg Licencia: Creative Commons Attribution-Sharealike 3.0 Contribuyentes: User:David.png Fuente: http://es.org/w/index. Yaleks Image:NvidiaTesla.darias Image:Beowulf.org/w/index.wikipedia.php?title=Archivo:Leslie_Lamport. Moriel.jpg Licencia: Creative Commons Attribution-Sharealike 2.jpg Licencia: GNU General Public License Contribuyentes: User Linuxbeak on en.org/w/index. Neumotoraxiv.jpg Fuente: http://es.wikipedia.wikipedia.svg Licencia: logo Contribuyentes: SVG version was created by User:Grunt and cleaned up by 3247.org/w/index. Shizhao Archivo:Wikibooks-logo.org/w/index.php?title=Archivo:ILLIAC_4_parallel_computer.svg Fuente: http://es.jpg Fuente: http://es. WikipediaMaster File:Cray 1 IMG 9126.svg Licencia: logo Contribuyentes: User:Bastique.php?oldid=64492415 Contribuyentes: Antipatico.wikipedia.0 Unported //creativecommons.org/w/index.php?title=Archivo:Cray_2_Arts_et_Metiers_dsc03940.org/w/index. JorgeGG.jpg Licencia: Creative Commons Attribution 2.wikipedia. FlickrLickr. Lobo. 22 ediciones anónimas Fuentes de imagen. User:Ramac et al.php?title=Archivo:Wikibooks-logo. Robert Mijaković.0 Contribuyentes: User:Rama/use_my_images Image:ILLIAC 4 parallel computer.org/w/index.php?title=Archivo:Fivestagespipeline.wikipedia.png Licencia: GNU Free Documentation License Contribuyentes: User:Poil Image:Superscalarpipeline.php?title=Archivo:Cray_1_IMG_9126.jpg Licencia: Copyrighted free use Contribuyentes: Hessam. Edslov.wikipedia.wikipedia Image:BlueGeneL cabinet.php?title=Archivo:Esp_Numa. Väsk Image:Fivestagespipeline.wikipedia.svg Licencia: Creative Commons Attribution-Sharealike 3. Hike395.svg Fuente: http://es. Dromero. Calvinsouto. Ipe. Piero71.php?title=Archivo:IBM_Blue_Gene_P_supercomputer. Vanbasten 23.org/w/index.wikipedia. Jaceksoci68.php?title=Archivo:Superscalarpipeline.php?title=Archivo:Ley_de_Amdahl.darias Archivo:optimizing-different-part-es. Martincarr.wikipedia.svg Licencia: Creative Commons Attribution-Sharealike 3.svg Fuente: http://es.svg Fuente: http://es.org/w/index. Ascánder.0 Contribuyentes: Edward.jpg Fuente: http://es.org/w/index.wikipedia.jpg Fuente: http://es. Rafa3040.wikipedia.

Sign up to vote on this title
UsefulNot useful