Escuche este articulo
De Wikipedia, la enciclopedia libre
  (Redirigido desde computadoras paralelas )
Saltar a navegación Saltar a búsqueda

La computación paralela es un tipo de computación en la que se realizan muchos cálculos o procesos simultáneamente. [1] Los problemas grandes a menudo se pueden dividir en otros más pequeños, que luego se pueden resolver al mismo tiempo. Hay varias formas diferentes de computación en paralelo: a nivel de bit , a nivel de instrucción , los datos , y el paralelismo de tareas . El paralelismo se ha empleado durante mucho tiempo en la informática de alto rendimiento , pero ha ganado un interés más amplio debido a las limitaciones físicas que impiden el escalado de frecuencias . [2]Dado que el consumo de energía (y, en consecuencia, la generación de calor) de las computadoras se ha convertido en una preocupación en los últimos años, [3] la computación paralela se ha convertido en el paradigma dominante en la arquitectura de las computadoras , principalmente en forma de procesadores de múltiples núcleos . [4]

La computación paralela está estrechamente relacionada con la computación concurrente; con frecuencia se usan juntas y, a menudo, se combinan, aunque las dos son distintas: es posible tener paralelismo sin concurrencia (como el paralelismo a nivel de bits ) y concurrencia sin paralelismo (como multitarea por tiempo compartido en una CPU de un solo núcleo). [5] [6] En la computación paralela, una tarea computacional se divide típicamente en varias, a menudo muchas, subtareas muy similares que se pueden procesar de forma independiente y cuyos resultados se combinan posteriormente, una vez completadas. Por el contrario, en la computación concurrente, los diversos procesos a menudo no abordan tareas relacionadas; cuando lo hacen, como es típico en la computación distribuida, las tareas separadas pueden tener una naturaleza variada y, a menudo, requieren alguna comunicación entre procesos durante la ejecución.

Las computadoras paralelas se pueden clasificar aproximadamente según el nivel en el que el hardware admite el paralelismo, con computadoras de múltiples núcleos y multiprocesadores que tienen múltiples elementos de procesamiento dentro de una sola máquina, mientras que los clústeres , MPP y cuadrículas usan múltiples computadoras para trabajar en la misma tarea. Las arquitecturas de computadora paralelas especializadas a veces se utilizan junto con los procesadores tradicionales, para acelerar tareas específicas.

En algunos casos, el paralelismo es transparente para el programador, como en el paralelismo a nivel de bits o de instrucción, pero los algoritmos explícitamente paralelos , particularmente aquellos que usan concurrencia, son más difíciles de escribir que los secuenciales , [7] porque la concurrencia introduce varios nuevos clases de posibles errores de software , de los cuales las condiciones de carrera son las más comunes. La comunicación y la sincronización entre las diferentes subtareas suelen ser algunos de los mayores obstáculos para obtener un rendimiento óptimo del programa paralelo.

Un límite superior teórico sobre la aceleración de un solo programa como resultado de la paralelización viene dado por la ley de Amdahl .

Antecedentes [ editar ]

Tradicionalmente, el software de computadora se ha escrito para computación en serie . Para resolver un problema, se construye e implementa un algoritmo como un flujo de instrucciones en serie. Estas instrucciones se ejecutan en una unidad central de procesamiento en una computadora. Solo se puede ejecutar una instrucción a la vez; una vez finalizada esa instrucción, se ejecuta la siguiente. [8]

La computación paralela, por otro lado, usa múltiples elementos de procesamiento simultáneamente para resolver un problema. Esto se logra dividiendo el problema en partes independientes para que cada elemento de procesamiento pueda ejecutar su parte del algoritmo simultáneamente con los demás. Los elementos de procesamiento pueden ser diversos e incluir recursos tales como una sola computadora con múltiples procesadores, varias computadoras en red, hardware especializado o cualquier combinación de los anteriores. [8] Históricamente, la computación paralela se utilizó para la computación científica y la simulación de problemas científicos, particularmente en las ciencias naturales y de la ingeniería, como la meteorología . Esto llevó al diseño de hardware y software en paralelo, así como a la informática de alto rendimiento .[9]

La escala de frecuencia fue la razón principal para las mejoras en el rendimiento de la computadora desde mediados de la década de 1980 hasta 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 del reloj reduce el tiempo promedio que se tarda en ejecutar una instrucción. Por tanto, un aumento en la frecuencia reduce el tiempo de ejecución de todos los programas vinculados al cálculo . [10] Sin embargo, el consumo de energía P por un chip viene dado por la ecuación P = C × V 2 × F , donde C es la capacitanciasiendo conmutado por ciclo de reloj (proporcional al número de transistores cuyas entradas cambian), V es voltaje y F es la frecuencia del procesador (ciclos por segundo). [11] Los aumentos en la frecuencia aumentan la cantidad de energía utilizada en un procesador. El aumento del consumo de energía del procesador llevó en última instancia a la cancelación de Intel el 8 de mayo de 2004 de sus procesadores Tejas y Jayhawk , que generalmente se cita como el fin del escalado de frecuencias como el paradigma de la arquitectura informática dominante. [12]

Para hacer frente al problema del consumo de energía y el sobrecalentamiento, los principales fabricantes de unidades de procesamiento central (CPU o procesador) comenzaron a producir procesadores energéticamente eficientes con múltiples núcleos. El núcleo es la unidad informática del procesador y en los procesadores de múltiples núcleos cada núcleo es independiente y puede acceder a la misma memoria al mismo tiempo. Los procesadores de múltiples núcleos han llevado la computación paralela a las computadoras de escritorio . Por lo tanto, la paralelización de programas en serie se ha convertido en una tarea de programación principal. En 2012, los procesadores de cuatro núcleos se convirtieron en estándar para las computadoras de escritorio , mientras que los servidores tienen procesadores de 10 y 12 núcleos. De la ley de MooreSe puede predecir que el número de núcleos por procesador se duplicará cada 18-24 meses. Esto podría significar que después de 2020 un procesador típico tendrá decenas o cientos de núcleos. [13]

Un sistema operativo puede garantizar que las diferentes tareas y programas de usuario se ejecuten en paralelo en los núcleos disponibles. Sin embargo, para que un programa de software en serie aproveche al máximo la arquitectura de múltiples núcleos, el programador necesita reestructurar y paralelizar el código. Ya no se logrará una aceleración del tiempo de ejecución del software de aplicación a través del escalado de frecuencia, sino que los programadores deberán paralelizar su código de software para aprovechar la creciente potencia informática de las arquitecturas multinúcleo. [14]

Ley de Amdahl y ley de Gustafson [ editar ]

Una representación gráfica de la ley de Amdahl . La aceleración de un programa a partir de la paralelización está limitada por la cantidad de programa que se puede paralelizar. Por ejemplo, si el 90% del programa se puede paralelizar, la aceleración máxima teórica usando computación paralela sería 10 veces sin importar cuántos procesadores se usen.
Supongamos que una tarea tiene dos partes independientes, A y B . La parte B toma aproximadamente el 25% del tiempo de todo el cálculo. Trabajando muy duro, es posible que esta parte sea 5 veces más rápida, pero esto solo reduce un poco el tiempo para todo el cálculo. Por el contrario, es posible que sea necesario realizar menos trabajo para que la parte A sea ​​dos veces más rápida. Esto hará que el cálculo sea mucho más rápido que si se optimiza la parte B , aunque la aceleración de la parte B es mayor en proporción (5 veces frente a 2 veces).

De manera óptima, la aceleración de la paralelización sería lineal: duplicar el número de elementos de procesamiento debería reducir a la mitad el tiempo de ejecución, y duplicarlo por segunda vez debería reducirlo nuevamente a la mitad. Sin embargo, muy pocos algoritmos paralelos logran una aceleración óptima. La mayoría de ellos tienen una aceleración casi lineal para pequeñas cantidades de elementos de procesamiento, que se aplana a un valor constante para una gran cantidad de elementos de procesamiento.

La posible aceleración de un algoritmo en una plataforma informática paralela viene dada por la ley de Amdahl [15].

dónde

  • La latencia es la aceleración potencial en la latencia de la ejecución de toda la tarea;
  • s es la aceleración en latencia de la ejecución de la parte paralelizable de la tarea;
  • p es el porcentaje del tiempo de ejecución de toda la tarea con respecto a la parte paralelizable de la tarea antes de la paralelización .

Dado que S latencia <1 / (1 - p ) , muestra que una pequeña parte del programa que no se puede paralelizar limitará la aceleración general disponible de la paralelización. Un programa que resuelve un gran problema matemático o de ingeniería constará típicamente de varias partes paralelizables y varias partes no paralelizables (en serie). Si la parte no paralelizable de un programa representa el 10% del tiempo de ejecución ( p= 0.9), no podemos obtener una aceleración superior a 10 veces, independientemente de cuántos procesadores se agreguen. Esto pone un límite superior a la utilidad de agregar más unidades de ejecución paralelas. "Cuando una tarea no se puede dividir debido a restricciones secuenciales, la aplicación de más esfuerzo no tiene ningún efecto en el horario. El parto de un hijo toma nueve meses, sin importar cuántas mujeres se asignen". [dieciséis]

Una representación gráfica de la ley de Gustafson

La ley de Amdahl solo se aplica a los casos en los que se soluciona el tamaño del problema. En la práctica, a medida que se dispone de más recursos informáticos, tienden a utilizarse en problemas más grandes (conjuntos de datos más grandes) y el tiempo dedicado a la parte paralelizable a menudo crece mucho más rápido que el trabajo inherentemente en serie. [17] En este caso, la ley de Gustafson ofrece una evaluación menos pesimista y más realista del desempeño paralelo: [18]

Tanto la ley de Amdahl como la ley de Gustafson asumen que el tiempo de ejecución de la parte serial del programa es independiente del número de procesadores. La ley de Amdahl asume que todo el problema es de tamaño fijo, de modo que la cantidad total de trabajo a realizar en paralelo también es independiente del número de procesadores , mientras que la ley de Gustafson supone que la cantidad total de trabajo a realizar en paralelo varía linealmente con el número de procesadores .

Dependencias [ editar ]

Comprender las dependencias de datos es fundamental para implementar algoritmos paralelos . Ningún programa puede ejecutarse más rápidamente que la cadena más larga de cálculos dependientes (conocida como ruta crítica ), ya que los cálculos que dependen de cálculos anteriores en la cadena deben ejecutarse en orden. Sin embargo, la mayoría de los algoritmos no constan solo de una larga cadena de cálculos dependientes; Por lo general, existen oportunidades para ejecutar cálculos independientes en paralelo.

Sean P i y P j dos segmentos de programa. Las condiciones de Bernstein [19] describen cuándo los dos son independientes y pueden ejecutarse en paralelo. Para P i , sean I i todas las variables de entrada y O i las variables de salida, e igualmente para P j . P i y P j son independientes si satisfacen

La 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 produce una variable necesaria para el primer segmento. La tercera y última condición representa una dependencia de salida: cuando dos segmentos escriben en la misma ubicación, el resultado proviene del último segmento ejecutado lógicamente. [20]

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

1: función Dep (a, b)2: c: = a * b3: d: = 3 * c4: función final

En este ejemplo, la instrucción 3 no se puede ejecutar antes (o incluso en paralelo con) la instrucción 2, porque la instrucción 3 usa un resultado de la instrucción 2. Viola la condición 1 y, por lo tanto, introduce una dependencia de flujo.

1: función NoDep (a, b)2: c: = a * b3: d: = 3 * b4: e: = a + b5: función final

En este ejemplo, no hay dependencias entre las instrucciones, por lo que todas se pueden ejecutar en paralelo.

Las condiciones de Bernstein no permiten que la memoria se comparta entre diferentes procesos. Para eso, es necesario algún medio de hacer cumplir un ordenamiento entre accesos, 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 [ editar ]

Las subtareas de un programa paralelo a menudo se denominan subprocesos . Algunas arquitecturas de computadora paralelas usan versiones más pequeñas y livianas de hilos conocidos como fibras , mientras que otras usan versiones más grandes conocidas como procesos . Sin embargo, "subprocesos" se acepta generalmente como un término genérico para las subtareas. [21] Los subprocesos a menudo necesitarán acceso sincronizado a un objeto u otro recurso , por ejemplo, cuando deben actualizar una variable que se comparte entre ellos. Sin sincronización, las instrucciones entre los dos subprocesos se pueden intercalar en cualquier orden. Por ejemplo, considere el siguiente programa:

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 producirá datos incorrectos. Esto se conoce como condición de carrera . El programador debe usar un candado para proporcionar exclusión mutua . Un bloqueo es una construcción del lenguaje de programación que permite que un subproceso tome el control de una variable y evite que otros subprocesos la lean o escriban, hasta que esa variable se desbloquee. El hilo que sostiene el candado tiene libertad para ejecutar su sección crítica (la sección de un programa que requiere acceso exclusivo a alguna variable) y para desbloquear los datos cuando finaliza. Por lo tanto, para garantizar la ejecución correcta del programa, el programa anterior se puede reescribir para usar bloqueos:

Un subproceso bloqueará con éxito la variable V, mientras que el otro subproceso se bloqueará, no se puede continuar hasta que V se desbloquee nuevamente. Esto garantiza la correcta ejecución del programa. Los bloqueos pueden ser necesarios para garantizar la ejecución correcta del programa cuando los subprocesos deben serializar el acceso a los recursos, pero su uso puede ralentizar mucho un programa y afectar su fiabilidad . [22]

El bloqueo de múltiples variables mediante bloqueos no atómicos introduce la posibilidad de un bloqueo del programa . Un bloqueo atómico bloquea múltiples variables a la vez. Si no puede bloquearlos a todos, no bloquea ninguno de ellos. Si dos subprocesos necesitan bloquear las mismas dos variables utilizando bloqueos no atómicos, es posible que un subproceso bloquee uno de ellos y el segundo subproceso bloquee la segunda variable. En tal caso, ninguno de los subprocesos puede completarse y se produce un interbloqueo. [23]

Muchos programas paralelos requieren que sus subtareas actúen en sincronía . Esto requiere el uso de una barrera . Las barreras se implementan típicamente usando un candado o un semáforo . [24] Una clase de algoritmos, conocidos como algoritmos sin bloqueo y sin espera , evita por completo el uso de bloqueos y barreras. Sin embargo, este enfoque es generalmente difícil de implementar y requiere estructuras de datos diseñadas correctamente. [25]

No toda la paralelización da como resultado una aceleración. Generalmente, a medida que una tarea se divide en más y más subprocesos, esos subprocesos pasan una parte cada vez mayor de su tiempo comunicándose entre sí o esperando el acceso a los recursos. [26] [27] Una vez que la sobrecarga de la contención de recursos o la comunicación domina el tiempo dedicado a otros cálculos, la paralelización adicional (es decir, dividir la carga de trabajo en más subprocesos) aumenta en lugar de disminuir la cantidad de tiempo necesario para finalizar. Este problema, conocido como ralentización paralela , [28] se puede mejorar en algunos casos mediante el análisis y el rediseño del software. [29]

Paralelismo de grano fino, grueso y vergonzoso [ editar ]

Las aplicaciones a menudo se clasifican según la frecuencia con la que sus subtareas necesitan sincronizarse o comunicarse entre sí. Una aplicación muestra un paralelismo detallado si sus subtareas deben comunicarse muchas veces por segundo; exhibe un paralelismo de grano grueso si no se comunican muchas veces por segundo, y exhibe un paralelismo vergonzoso si rara vez o nunca tienen que comunicarse. Las aplicaciones vergonzosamente paralelas se consideran las más fáciles de paralelizar.

Modelos de coherencia [ editar ]

Los lenguajes de programación paralelos y las computadoras paralelas deben tener un modelo de coherencia (también conocido como modelo de memoria). El modelo de coherencia define reglas sobre cómo ocurren las operaciones en la memoria de la computadora y cómo se producen los resultados.

Uno de los primeros modelos de consistencia era Leslie Lamport 's consistencia secuencial modelo. La consistencia secuencial es la propiedad de un programa paralelo de que su ejecución paralela produce los mismos resultados que un programa secuencial. Específicamente, un programa es secuencialmente consistente si "los resultados de cualquier ejecución son los mismos que si las operaciones de todos los procesadores se ejecutaran en algún orden secuencial, y las operaciones de cada procesador individual aparecen en esta secuencia en el orden especificado por su programa". ". [30]

La memoria transaccional de software es un tipo común de modelo de coherencia. La memoria transaccional de software toma prestado de la teoría de las bases de datos el concepto de transacciones atómicas y las aplica a los accesos a la memoria.

Matemáticamente, estos modelos se pueden representar de varias formas. Introducidas en 1962, las redes de Petri fueron un intento temprano de codificar las reglas de los modelos de consistencia. Posteriormente, la teoría del flujo de datos se basó en estos, y se crearon arquitecturas de flujo de datos para implementar físicamente las ideas de la teoría del flujo de datos. A partir de finales de la década de 1970, se desarrollaron cálculos de procesos como Cálculo de sistemas de comunicación y Procesos secuenciales de comunicación para permitir el razonamiento algebraico sobre sistemas compuestos por componentes que interactúan. Las adiciones más recientes a la familia del cálculo de procesos, como el cálculo π , han agregado la capacidad de razonar sobre topologías dinámicas. Lógicas como la de LamportTLA + y modelos matemáticos como trazos y diagramas de eventos de Actor también se han desarrollado para describir el comportamiento de sistemas concurrentes.

Taxonomía de Flynn [ editar ]

Michael J. Flynn creó uno de los primeros sistemas de clasificación para computadoras y programas paralelos (y secuenciales), ahora conocido como taxonomía de Flynn . Flynn clasificó los programas y las computadoras según si funcionaban con un solo conjunto o varios conjuntos de instrucciones, y si esas instrucciones utilizaban o no un único conjunto o varios conjuntos de datos.

La clasificación de instrucción única-datos únicos (SISD) es equivalente a un programa completamente secuencial. La clasificación de datos múltiples de instrucción única (SIMD) es análoga a realizar la misma operación repetidamente en un conjunto de datos grande. Esto se hace comúnmente en aplicaciones de procesamiento de señales . Datos únicos de instrucción múltiple (MISD) es una clasificación que se usa raramente. Si bien se idearon arquitecturas de computadora para lidiar con esto (como matrices sistólicas ), pocas aplicaciones que se ajustan a esta clase se materializaron. Los programas de múltiples instrucciones y múltiples datos (MIMD) son, con mucho, 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, pero este modelo clásico ha sobrevivido porque es simple, fácil de entender y ofrece una buena primera aproximación. También es: quizás debido a su comprensibilidad, el esquema más utilizado ". [31]

Tipos de paralelismo [ editar ]

Paralelismo a nivel de bits [ editar ]

Desde el advenimiento de la tecnología de fabricación de chips de computadora de integración a muy gran escala (VLSI) en la década de 1970 hasta aproximadamente 1986, la aceleración en la arquitectura de la computadora fue impulsada duplicando el tamaño de la palabra de la computadora , la cantidad de información que el procesador puede manipular por ciclo. [32] Aumentar el 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 sumar los 8 bits de orden inferior de cada entero utilizando la instrucción de suma estándar, luego sumar los 8 bits de orden superior utilizando un complemento. -Llevar instrucción y elllevar bit de la suma de orden inferior; por lo tanto, un procesador de 8 bits requiere dos instrucciones para completar una sola operación, donde un procesador de 16 bits podría completar la operación con una sola instrucción.

Históricamente, los microprocesadores de 4 bits fueron reemplazados por microprocesadores de 8 bits, luego de 16 bits y luego de 32 bits. Esta tendencia generalmente llegó a su fin con la introducción de procesadores de 32 bits, que ha sido un estándar en la computación de propósito general durante dos décadas. No fue hasta principios de la década de 2000, con el advenimiento de las arquitecturas x86-64 , que los procesadores de 64 bits se convirtieron en algo común.

Paralelismo a nivel de instrucción [ editar ]

Un procesador canónico sin pipeline . Se necesitan cinco ciclos de reloj para completar una instrucción y, por lo tanto, el procesador puede emitir un rendimiento subescalar ( IPC = 0.2 <1 ).

Un programa de computadora es, en esencia, un flujo de instrucciones ejecutadas por un procesador. Sin paralelismo a nivel de instrucción, un procesador solo puede emitir menos de una instrucción por ciclo de reloj ( IPC <1 ). Estos procesadores se conocen como procesadores subescalares . Estas instrucciones se pueden reordenar y combinar en grupos que luego se ejecutan 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 computadoras desde mediados de la década de 1980 hasta mediados de la de 1990. [33]

Un procesador canalizado canónico de cinco etapas . En el mejor de los casos, se necesita un ciclo de reloj para completar una instrucción y, por lo tanto, el procesador puede emitir un rendimiento escalar ( IPC = 1 ).

Todos los procesadores modernos tienen canales de instrucción de varias etapas . Cada etapa de la canalización corresponde a una acción diferente que realiza el procesador en esa instrucción en esa etapa; un procesador con una canalización de N etapas puede tener hasta N instrucciones diferentes en diferentes etapas de finalización y, por lo tanto, puede emitir una instrucción por ciclo de reloj ( IPC = 1 ). Estos procesadores se conocen como procesadores escalares . El ejemplo canónico de un procesador canalizado es un procesador RISC , con cinco etapas: obtención de instrucciones (IF), decodificación de instrucciones (ID), ejecución (EX), acceso a memoria (MEM) y escritura de registro (WB). El procesador Pentium 4 tenía una tubería de 35 etapas.[34]

Un procesador canalizado canónico de cinco etapas con dos unidades de ejecución. En el mejor de los casos, se necesita un ciclo de reloj para completar dos instrucciones y, por lo tanto, el procesador puede emitir un rendimiento superescalar ( IPC = 2> 1 ).

La mayoría de los procesadores modernos también tienen varias unidades de ejecución . Por lo general, combinan esta función con la canalización y, por lo tanto, pueden emitir más de una instrucción por ciclo de reloj ( IPC> 1 ). Estos procesadores se conocen como procesadores superescalares . Los procesadores superescalares se diferencian de los procesadores multinúcleo en que las diversas unidades de ejecución no son procesadores completos (es decir, unidades de procesamiento). Las instrucciones se pueden agrupar juntas solo si no hay dependencia de datos entre ellas. Scoreboarding y el algoritmo de Tomasulo (que es similar al scoreboarding pero hace uso del cambio de nombre de registros) son dos de las técnicas más comunes para implementar la ejecución fuera de orden y el paralelismo a nivel de instrucción.

Paralelismo de tareas [ editar ]

Los paralelismos de tareas son la característica de un programa paralelo en el que "se pueden realizar cálculos completamente diferentes en el mismo o en diferentes conjuntos de datos". [35] Esto contrasta con el paralelismo de datos, donde el mismo cálculo se realiza en el mismo conjunto de datos o en diferentes conjuntos. El paralelismo de tareas implica la descomposición de una tarea en subtareas y luego asignar cada subtarea a un procesador para su ejecución. A continuación, los procesadores ejecutarían estas subtareas al mismo tiempo y, a menudo, de forma cooperativa. El paralelismo de tareas no suele adaptarse al tamaño de un problema. [36]

Paralelismo a nivel de superpalabra [ editar ]

El paralelismo a nivel de superpalabra es una técnica de vectorización basada en el desenrollado de bucles y la vectorización de bloques básicos. Se diferencia de los algoritmos de vectorización de bucles en que puede explotar el paralelismo del código en línea , como la manipulación de coordenadas, canales de color o en bucles desenrollados a mano. [37]

Hardware [ editar ]

Memoria y comunicación [ editar ]

La memoria principal en una computadora paralela es memoria compartida (compartida entre todos los elementos de procesamiento en un solo espacio de direcciones ) o memoria distribuida (en la que cada elemento de procesamiento tiene su propio espacio de direcciones local). [38] La memoria distribuida se refiere al hecho de que la memoria está distribuida lógicamente, pero a menudo implica que también está distribuida físicamente. La memoria compartida distribuida y la virtualización de la memoria combinan los dos enfoques, donde el elemento de procesamiento tiene su propia memoria local y acceso a la memoria en procesadores no locales. Los accesos a la memoria local suelen ser más rápidos que los accesos a la memoria no local. En las supercomputadoras, el espacio de memoria compartida distribuida se puede implementar utilizando el modelo de programación como PGAS . Este modelo permite que los procesos de un nodo informático accedan de forma transparente a la memoria remota de otro nodo informático. Todos los nodos de cómputo también están conectados a un sistema de memoria compartida externa a través de una interconexión de alta velocidad, como Infiniband , este sistema de memoria compartida externa se conoce como búfer de ráfagas , que generalmente se construye a partir de matrices de memoria no volátil distribuidas físicamente en múltiples I / O nodos.

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

Las arquitecturas informáticas en las que se puede acceder a cada elemento de la memoria principal con la misma latencia y ancho de banda se conocen como sistemas de acceso uniforme a la memoria (UMA). Por lo general, eso solo se puede lograr mediante un sistema de memoria compartida , en el que la memoria no se distribuye físicamente. Un sistema que no tiene esta propiedad se conoce como arquitectura de acceso a memoria no uniforme (NUMA). Los sistemas de memoria distribuida tienen acceso a la memoria no uniforme.

Los sistemas informáticos utilizan cachés : memorias pequeñas y rápidas ubicadas cerca del procesador que almacenan copias temporales de los valores de la memoria (cercanas tanto en el sentido físico como lógico). Los sistemas informáticos paralelos tienen dificultades con las cachés que pueden almacenar el mismo valor en más de una ubicación, con la posibilidad de una ejecución incorrecta del programa. Estas computadoras requieren un sistema de coherencia de caché , que realiza un seguimiento de los valores almacenados en caché y los purga estratégicamente, asegurando así la ejecución correcta del programa. Espiando en el autobúses uno de los métodos más comunes para realizar un seguimiento de los valores a los que se accede (y, por lo tanto, deben purgarse). El diseño de sistemas de coherencia de caché grandes y de alto rendimiento es un problema muy difícil en la arquitectura de computadoras. Como resultado, las arquitecturas de computadora de memoria compartida no escalan tan bien como lo hacen los sistemas de memoria distribuida. [38]

La comunicación procesador-procesador y procesador-memoria se puede implementar en el hardware de varias formas, incluso a través de memoria compartida (ya sea multipuerto o multiplexada ), un conmutador de barra cruzada , un bus compartido o una red de interconexión de una miríada de topologías que incluyen estrella , anillo , árbol , hipercubo , hipercubo gordo (un hipercubo con más de un procesador en un nodo) o 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 sea jerárquico en las grandes máquinas multiprocesador.

Clases de computadoras paralelas [ editar ]

Las computadoras en paralelo se pueden clasificar aproximadamente según el nivel en el que el hardware admite el paralelismo. Esta clasificación es ampliamente análoga a la distancia entre los nodos informáticos básicos. Estos no son mutuamente excluyentes; por ejemplo, los grupos de multiprocesadores simétricos son relativamente comunes.

Computación multinúcleo [ editar ]

Un procesador de múltiples núcleos es un procesador que incluye múltiples unidades de procesamiento (llamadas "núcleos") en el mismo chip. Este procesador se diferencia de un procesador superescalar , que incluye varias unidades de ejecución y puede emitir varias instrucciones por ciclo de reloj desde un flujo de instrucciones (subproceso); en contraste, un procesador de múltiples núcleos puede emitir múltiples instrucciones por ciclo de reloj desde múltiples flujos de instrucciones. IBM 's microprocesador Cell , diseñado para su uso en la Sony PlayStation 3, es un prominente procesador de múltiples núcleos. Cada núcleo de un procesador de varios núcleos también puede ser superescalar, es decir, en cada ciclo de reloj, cada núcleo puede emitir varias instrucciones desde un hilo.

El multihilo simultáneo (de los cuales el Hyper-Threading de Intel es el más conocido) fue una forma temprana de pseudo-multi-coreismo. Un procesador capaz de subprocesos múltiples simultáneos incluye varias unidades de ejecución en la misma unidad de procesamiento, es decir, tiene una arquitectura superescalar, y puede emitir varias instrucciones por ciclo de reloj desde varios subprocesos. El subproceso múltiple temporal, por otro lado, incluye una sola unidad de ejecución en la misma unidad de procesamiento y puede emitir una instrucción a la vez desde múltiples subprocesos.

Multiprocesamiento simétrico [ editar ]

Un multiprocesador simétrico (SMP) es un sistema informático con varios procesadores idénticos que comparten memoria y se conectan a través de un bus . [39] La contención de bus evita que las arquitecturas de bus escalen. Como resultado, los SMP generalmente no comprenden más de 32 procesadores. [40] Debido al pequeño tamaño de los procesadores y la reducción significativa en los requisitos de ancho de banda de bus lograda por grandes cachés, tales multiprocesadores simétricos son extremadamente rentables, siempre que exista una cantidad suficiente de ancho de banda de memoria. [39]

Computación distribuida [ editar ]

Una computadora distribuida (también conocida como multiprocesador de memoria distribuida) es un sistema informático de memoria distribuida en el que los elementos de procesamiento están conectados por una red. Las computadoras distribuidas son altamente escalables. Los términos " computación concurrente ", "computación paralela" y "computación distribuida" se superponen mucho y no existe una distinción clara entre ellos. [41] El mismo sistema puede caracterizarse tanto como "paralelo" como "distribuido"; los procesadores de un sistema distribuido típico se ejecutan simultáneamente en paralelo. [42]

Computación en clúster [ editar ]
Un grupo de Beowulf

Un clúster es un grupo de computadoras poco acopladas que trabajan juntas en estrecha colaboración, por lo que en algunos aspectos pueden considerarse como una sola computadora. [43] Los clústeres están compuestos por varias máquinas independientes conectadas por una red. Si bien las máquinas de un clúster no tienen que ser simétricas, el equilibrio de carga es más difícil si no lo son. El tipo de clúster más común es el clúster Beowulf , que es un clúster implementado en múltiples computadoras comerciales idénticas conectadas con una red de área local Ethernet TCP / IP . [44] La tecnología Beowulf fue desarrollada originalmente por Thomas Sterling y Donald Becker. . El 87% de todas las supercomputadoras Top500 son clústeres. [45] El resto son procesadores masivamente paralelos, que se explican a continuación.

Debido a que los sistemas de computación en cuadrícula (descritos a continuación) pueden manejar fácilmente problemas embarazosamente paralelos, los clústeres modernos generalmente están diseñados para manejar problemas más difíciles, problemas que requieren que los nodos compartan resultados intermedios entre sí con mayor frecuencia. Esto requiere un gran ancho de banda y, lo que es más importante, una red de interconexión de baja latencia . Muchas supercomputadoras históricas y actuales utilizan hardware de red de alto rendimiento personalizado diseñado específicamente para la computación en clúster, como la red Cray Gemini. [46] A partir de 2014, la mayoría de las supercomputadoras actuales utilizan algún hardware de red estándar listo para usar, a menudo Myrinet , InfiniBand o Gigabit Ethernet .

Computación masivamente paralela [ editar ]
Un gabinete de IBM 's Blue Gene / L masivamente paralelo superordenador

Un procesador masivamente paralelo (MPP) es una sola computadora con muchos procesadores en red. Los MPP tienen muchas de las mismas características que los clústeres, pero los MPP tienen redes de interconexión especializadas (mientras que los clústeres utilizan hardware básico para la creación de redes). Los MPP también tienden a ser más grandes que los clústeres y suelen tener "mucho más" de 100 procesadores. [47] En un MPP, "cada CPU contiene 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 una interconexión de alta velocidad". [48]

IBM 's Blue Gene / L , el quinto mejor superordenador del mundo según la DE JUNIO 2009 TOP500 rango, es una MPP.

Computación en cuadrícula [ editar ]

La computación en cuadrícula es la forma más distribuida de computación en paralelo. Utiliza computadoras que se comunican a través de Internet para trabajar en un problema determinado. Debido al bajo ancho de banda y la latencia extremadamente alta disponibles en Internet, la computación distribuida generalmente solo se ocupa de problemas vergonzosamente paralelos . Se han creado muchas aplicaciones de computación distribuida , de las cuales SETI @ home y Folding @ home son los ejemplos más conocidos. [49]

La mayoría de las aplicaciones de computación en red utilizan middleware (software que se encuentra entre el sistema operativo y la aplicación para administrar los recursos de la red y estandarizar la interfaz del software). El middleware de computación distribuida más común es Berkeley Open Infrastructure for Network Computing (BOINC). A menudo, el software de computación distribuida hace uso de "ciclos libres", realizando cálculos en momentos en que una computadora está inactiva.

Computadoras paralelas especializadas [ editar ]

Dentro de la computación paralela, existen dispositivos paralelos especializados que siguen siendo áreas específicas de interés. Si bien no son específicos de un dominio , tienden a ser aplicables solo a unas pocas clases de problemas paralelos.

Computación reconfigurable con arreglos de puertas programables en campo [ editar ]

La computación reconfigurable es el uso de una matriz de puertas programable en campo (FPGA) como coprocesador para una computadora de propósito general. Un FPGA es, en esencia, un chip de computadora que puede volver a cablearse para una tarea determinada.

Los FPGA se pueden programar con lenguajes de descripción de hardware como VHDL o Verilog . Sin embargo, programar en estos lenguajes puede resultar tedioso. Varios proveedores han creado lenguajes C a HDL que intentan emular la sintaxis y la 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 , Impulse C , DIME-C y Handel-C . También se pueden usar subconjuntos específicos de SystemC basados ​​en C ++ para este propósito.

La decisión de AMD de abrir su tecnología HyperTransport a proveedores externos se ha convertido en la tecnología habilitadora para la computación reconfigurable de alto rendimiento. [50] Según Michael R. D'Amour, director de operaciones de DRC Computer Corporation , "cuando entramos por primera vez en AMD, nos llamaron 'los ladrones de sockets '. Ahora nos llaman sus socios ". [50]

Computación de propósito general en unidades de procesamiento de gráficos (GPGPU) [ editar ]
Tarjeta Tesla GPGPU de Nvidia

La computación de propósito general en unidades de procesamiento de gráficos (GPGPU) es una tendencia bastante reciente en la investigación de ingeniería informática. Las GPU son coprocesadores que se han optimizado en gran medida para el procesamiento de gráficos por computadora . [51] El procesamiento de gráficos por computadora es un campo dominado por operaciones paralelas de datos, particularmente operaciones matriciales de álgebra lineal .

En los primeros días, los programas GPGPU usaban las API de gráficos normales para ejecutar programas. Sin embargo, se han creado varios lenguajes y plataformas de programación nuevos para realizar cálculos de propósito general en GPU, con Nvidia y AMD lanzando 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 computación en su serie Tesla . El consorcio tecnológico Khronos Group ha lanzado OpenCLespecificación, que es un marco para escribir programas que se ejecutan en plataformas que constan de CPU y GPU. AMD , Apple , Intel , Nvidia y otros son compatibles con OpenCL .

Circuitos integrados de aplicaciones específicas [ editar ]

Se han ideado varios enfoques de circuitos integrados específicos de la aplicación (ASIC) para tratar con aplicaciones paralelas. [52] [53] [54]

Debido a que un ASIC es (por definición) específico para una aplicación determinada, se puede optimizar completamente para esa aplicación. Como resultado, para una aplicación determinada, un ASIC tiende a superar a una computadora de propósito general. Sin embargo, los ASIC se crean mediante fotolitografía UV . Este proceso requiere un juego de mascarillas, que puede resultar extremadamente caro. Un juego de mascarillas puede costar más de un millón de dólares estadounidenses. [55] (Cuanto más pequeños sean los transistores necesarios para el chip, más cara será la máscara). Mientras tanto, los aumentos de rendimiento en la computación de propósito general con el tiempo (como se describe en la ley de Moore ) tienden a eliminar estas ganancias en solo uno o dos generaciones de chips. [50]El alto costo inicial y la tendencia a ser superado por la computación de propósito general impulsada por la ley de Moore ha hecho que los ASIC sean inviables para la mayoría de las aplicaciones de computación paralela. Sin embargo, se han construido algunos. Un ejemplo es la máquina PFLOPS RIKEN MDGRAPE-3 que utiliza ASIC personalizados para la simulación de dinámica molecular .

Procesadores vectoriales [ editar ]
El Cray-1 es un procesador vectorial

Un procesador vectorial es una CPU o un sistema informático que puede ejecutar la misma instrucción en grandes conjuntos de datos. Los procesadores vectoriales tienen operaciones de alto nivel que funcionan en matrices lineales de números o vectores. Un ejemplo de operación vectorial es A = B × C , donde A , B y C son vectores de 64 elementos de números de coma flotante de 64 bits . [56] Están estrechamente relacionados con la clasificación SIMD de Flynn. [56]

Las computadoras Cray se hicieron famosas por sus computadoras de procesamiento de vectores en las décadas de 1970 y 1980. Sin embargo, los procesadores vectoriales, tanto como CPU como como sistemas informáticos completos, en general han desaparecido. Modernos juegos de instrucciones de procesador incluyen algunas instrucciones de procesamiento de vectores, como con Freescale Semiconductor 's AltiVec y Intel ' s extensiones Streaming SIMD (SSE).

Software [ editar ]

Lenguajes de programación paralelos [ editar ]

Se han creado lenguajes de programación concurrentes , bibliotecas , API y modelos de programación paralela (como esqueletos algorítmicos ) para programar computadoras paralelas. Por lo general, estos se pueden dividir en clases según las suposiciones que hacen sobre la arquitectura de memoria subyacente: memoria compartida, memoria distribuida o memoria distribuida compartida. Los lenguajes de programación de memoria compartida se comunican manipulando variables de memoria compartida. La memoria distribuida utiliza el paso de mensajes . POSIX Threads y OpenMP son dos de las API de memoria compartida más utilizadas, mientras que Message Passing Interface(MPI) es la API del sistema de paso de mensajes más utilizada. [57] Un concepto utilizado en la programación de programas paralelos es el concepto futuro , donde una parte de un programa promete entregar un dato requerido a otra parte de un programa en algún momento futuro.

CAPS entreprise y Pathscale también están coordinando sus esfuerzos para hacer de las directivas híbridas de programación paralela de múltiples núcleos (HMPP) un estándar abierto llamado OpenHMPP . El modelo de programación basado en directivas OpenHMPP ofrece una sintaxis para descargar eficientemente los cálculos en aceleradores de hardware y optimizar el movimiento de datos hacia / desde la memoria del hardware. Las directivas OpenHMPP describen la llamada a procedimiento remoto (RPC) en un dispositivo acelerador (por ejemplo, GPU) o más generalmente un conjunto de núcleos. Las directivas anotan C o Fortran códigos para describir dos conjuntos de funcionalidades: la descarga de procedimientos (denominados codelets) 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.

El aumento de las GPU de consumo ha llevado a la compatibilidad con kernels de cómputo , ya sea en API de gráficos (denominadas sombreadores de cómputo ), en API dedicadas (como OpenCL ) o en otras extensiones de lenguaje.

Paralelización automática [ editar ]

La paralelización automática de un programa secuencial por parte de un compilador es el "santo grial" de la computación en paralelo, especialmente con el límite antes mencionado de la frecuencia del procesador. A pesar de décadas de trabajo por parte de los investigadores de compiladores, la paralelización automática ha tenido un éxito limitado. [58]

Los lenguajes de programación paralelos convencionales permanecen explícitamente paralelos o (en el mejor de los casos) parcialmente implícitos , en los que un programador da las directivas del compilador para la paralelización. Existen algunos lenguajes de programación paralelos totalmente implícitos: SISAL , Parallel Haskell , SequenceL , System C (para FPGA ), Mitrion-C , VHDL y Verilog .

Punto de control de la aplicación [ editar ]

A medida que aumenta la complejidad de un sistema informático, el tiempo medio entre fallos suele disminuir. El punto de control de la 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 de recursos actuales y estados variables, similar a un volcado de memoria ; esta información se puede utilizar para restaurar el programa si la computadora falla. El punto de control de la aplicación significa que el programa debe reiniciarse solo desde su último punto de control en lugar de desde el principio. Si bien el punto de control proporciona beneficios en una variedad de situaciones, es especialmente útil en sistemas altamente paralelos con una gran cantidad de procesadores utilizados en computación de alto rendimiento . [59]

Métodos algorítmicos [ editar ]

A medida que las computadoras paralelas se vuelven más grandes y más rápidas, ahora podemos resolver problemas que anteriormente habían tardado demasiado en ejecutarse. Campos tan variados como la bioinformática (para el plegamiento de proteínas y el análisis de secuencias ) y la economía (para las finanzas matemáticas ) se han aprovechado de la computación paralela. Los tipos comunes de problemas en las aplicaciones de computación paralela incluyen: [60]

  • Álgebra lineal densa
  • Álgebra lineal dispersa
  • Métodos espectrales (como la transformada rápida de Fourier de Cooley-Tukey )
  • Problemas de N cuerpos (como la simulación de Barnes-Hut )
  • problemas de cuadrícula estructurada (como los métodos Lattice Boltzmann )
  • Problemas de cuadrícula no estructurada (como los que se encuentran en el análisis de elementos finitos )
  • Método de Montecarlo
  • Lógica combinacional (como técnicas criptográficas de fuerza bruta )
  • Recorrido de gráficos (como algoritmos de clasificación )
  • Programación dinámica
  • Métodos de ramificación y vinculación
  • Modelos gráficos (como la detección de modelos de Markov ocultos y la construcción de redes bayesianas )
  • Simulación de máquina de estados finitos

Tolerancia a fallos [ editar ]

La computación paralela también se puede aplicar al diseño de sistemas informáticos tolerantes a fallas , particularmente a través de sistemas bloqueados que realizan la misma operación en paralelo. Esto proporciona redundancia en caso de que falle un componente y también permite la detección automática de errores y la corrección de errores si los resultados difieren. Estos métodos se pueden utilizar para ayudar a prevenir alteraciones de un solo evento causadas por errores transitorios. [61] Aunque pueden ser necesarias medidas adicionales en sistemas integrados o especializados, este método puede proporcionar un enfoque rentable para lograr una redundancia n-modular en sistemas comerciales listos para usar.

Historia [ editar ]

ILLIAC IV , "el más infame de los superordenadores" [62]

Los orígenes del verdadero paralelismo (MIMD) se remontan a Luigi Federico Menabrea y su Sketch of the Analytic Engine Invented by Charles Babbage . [63] [64] [65]

En abril de 1958, Stanley Gill (Ferranti) discutió la programación paralela y la necesidad de ramificar y esperar. [66] También en 1958, los investigadores de IBM John Cocke y Daniel Slotnick discutieron el uso del paralelismo en cálculos numéricos por primera vez. [67] Burroughs Corporation introdujo la D825 en 1962, una computadora de cuatro procesadores que accedía a hasta 16 módulos de memoria a través de un interruptor de barra cruzada . [68] En 1967, Amdahl y Slotnick publicaron un debate sobre la viabilidad del procesamiento paralelo en la Conferencia de la Federación Estadounidense de Sociedades de Procesamiento de Información. [67] Fue durante este debate que la ley de Amdahl fue acuñado para definir el límite de aceleración debido al paralelismo.

En 1969, Honeywell presentó su primer sistema Multics , un sistema multiprocesador simétrico capaz de ejecutar hasta ocho procesadores en paralelo. [67] C.mmp , un proyecto de multiprocesador en la Universidad Carnegie Mellon en la década de 1970, fue uno de los primeros multiprocesadores con más de unos pocos procesadores. El primer multiprocesador conectado al bus con cachés de espionaje fue el Synapse N + 1 en 1984. [64]

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 retraso de la puerta de la unidad de control del procesador en múltiples instrucciones. [69] En 1964, Slotnick había propuesto construir una computadora masivamente paralela para el Laboratorio Nacional Lawrence Livermore . [67] Su diseño fue financiado por la Fuerza Aérea de los Estados Unidos , que fue el primer esfuerzo de computación paralela de SIMD, ILLIAC IV . [67] La clave de su diseño fue un paralelismo bastante alto, con hasta 256 procesadores, lo que permitió a la máquina trabajar en grandes conjuntos de datos en lo que más tarde se conocería como procesamiento vectorial.. Sin embargo, ILLIAC IV fue llamado "el más infame de los supercomputadores", porque el proyecto se completó solo en una cuarta parte, pero tomó 11 años y costó casi cuatro veces la estimación original. [62] Cuando finalmente estuvo listo para ejecutar su primera aplicación real en 1976, fue superado por supercomputadoras comerciales existentes como el Cray-1 .

El cerebro biológico como computadora masivamente paralela [ editar ]

A principios de la década de 1970, en el Laboratorio de Ciencias de la Computación e Inteligencia Artificial del MIT , Marvin Minsky y Seymour Papert comenzaron a desarrollar la teoría de la Sociedad de la Mente , que considera al cerebro biológico como una computadora enormemente paralela . En 1986, Minsky publicó La sociedad de la mente , que afirma que "la mente está formada por muchos pequeños agentes, cada uno sin mente por sí mismo". [70]La teoría intenta explicar cómo lo que llamamos inteligencia podría ser producto de la interacción de partes no inteligentes. Minsky dice que la mayor fuente de ideas sobre la teoría provino de su trabajo al intentar crear una máquina que usa un brazo robótico, una cámara de video y una computadora para construir con bloques de niños. [71]

Modelos similares (que también ven al cerebro biológico como una computadora masivamente paralela, es decir, el cerebro está formado por una constelación de agentes independientes o semiindependientes) también fueron descritos por:

  • Thomas R. Blakeslee, [72]
  • Michael S. Gazzaniga , [73] [74]
  • Robert E. Ornstein , [75]
  • Ernest Hilgard , [76] [77]
  • Michio Kaku , [78]
  • George Ivanovich Gurdjieff , [79]
  • Modelo cerebral de neurocluster. [80]

Ver también [ editar ]

  • Multitarea por computadora
  • Simultaneidad (informática)
  • Procesador paralelo direccionable de contenido
  • Lista de conferencias de informática distribuida
  • Lista de publicaciones importantes en computación concurrente, paralela y distribuida
  • Máquina de flujo de datos de Manchester
  • Manycore
  • Modelo de programación paralela
  • Serializabilidad
  • Programación sincrónica
  • Transputer
  • Procesamiento de vectores

Referencias [ editar ]

  1. ^ Gottlieb, Allan; Almasi, George S. (1989). Computación altamente paralela . Redwood City, California: Benjamin / Cummings. ISBN 978-0-8053-0177-9.
  2. ^ SV Adve y col. (Noviembre de 2008). "Investigación en computación paralela en Illinois: la agenda de la UPCRC" Archivado el 11 de enero de 2018 en Wayback Machine (PDF). Parallel @ Illinois, Universidad de Illinois en Urbana-Champaign. "Las principales técnicas para estos beneficios de rendimiento (mayor frecuencia de reloj y arquitecturas más inteligentes pero cada vez más complejas) están llegando al llamado muro de energía. La industria de la computación ha aceptado que los futuros aumentos del rendimiento deben provenir en gran medida del aumento de la cantidad de procesadores (o núcleos ) en un dado, en lugar de hacer que un solo núcleo vaya más rápido ".
  3. ^ Asanovic y col. Viejo [sabiduría convencional]: La energía es gratuita, pero los transistores son caros. La nueva [sabiduría convencional] es [que] la energía es cara, pero los transistores son "gratis".
  4. ^ Asanovic, Krste et al. (18 de diciembre de 2006). "El panorama de la investigación en computación paralela: una vista desde Berkeley" (PDF). Universidad de California, Berkeley. Informe técnico No. UCB / EECS-2006-183. "Antiguo [conocimiento convencional]: aumentar la frecuencia de reloj es el método principal para mejorar el rendimiento del procesador. Nuevo [conocimiento convencional]: aumentar el paralelismo es el método principal para mejorar el rendimiento del procesador ... Incluso los representantes de Intel, una empresa generalmente asociada con el 'reloj más alto -speed is better 'position, advirtió que los enfoques tradicionales para maximizar el rendimiento mediante la maximización de la velocidad del reloj se han llevado al límite ".
  5. ^ "La concurrencia no es paralelismo", conferencia de Waza el 11 de enero de 2012, Rob Pike ( diapositivas archivadas el 30 de julio de 2015 en la Wayback Machine ) ( video )
  6. ^ "Paralelismo frente a simultaneidad" . Wiki de Haskell .
  7. ^ Hennessy, John L .; Patterson, David A .; Larus, James R. (1999). Organización y diseño de computadoras: la interfaz hardware / software (2. ed., 3rd print. Ed.). San Francisco: Kaufmann. ISBN 978-1-55860-428-5.
  8. ^ a b Barney, Blaise. "Introducción a la Computación Paralela" . Laboratorio Nacional Lawrence Livermore . Consultado el 9 de noviembre de 2007 .
  9. ^ Thomas Rauber; Gudula Rünger (2013). Programación paralela: para sistemas multinúcleo y clúster . Springer Science & Business Media. pag. 1. ISBN 9783642378010.
  10. ^ Hennessy, John L .; Patterson, David A. (2002). Arquitectura informática / un enfoque cuantitativo (3ª ed.). San Francisco, California: Internacional Thomson. pag. 43. ISBN 978-1-55860-724-8.
  11. Rabaey, Jan M. (1996). Circuitos integrados digitales: una perspectiva de diseño . Upper Saddle River, Nueva Jersey: Prentice-Hall. pag. 235. ISBN 978-0-13-178609-7.
  12. ^ Flynn, Laurie J. (8 de mayo de 2004). "Intel detiene el desarrollo de 2 nuevos microprocesadores" . New York Times . Consultado el 5 de junio de 2012 .
  13. ^ Thomas Rauber; Gudula Rünger (2013). Programación paralela: para sistemas multinúcleo y clúster . Springer Science & Business Media. pag. 2. ISBN 9783642378010.
  14. ^ Thomas Rauber; Gudula Rünger (2013). Programación paralela: para sistemas multinúcleo y clúster . Springer Science & Business Media. pag. 3. ISBN 9783642378010.
  15. ^ Amdahl, Gene M. (1967). "Validez del enfoque de procesador único para lograr capacidades informáticas a gran escala" . Proceeding AFIPS '67 (Spring) Proceedings of the April 18-20, 1967, Spring Joint Computer Conference : 483-485. doi : 10.1145 / 1465482.1465560 .
  16. ^ Brooks, Frederick P. (1996). Los ensayos del mes del hombre mítico sobre ingeniería de software (Anniversary ed., Repr. With corr., 5. [Dr.] ed.). Reading, Mass. [Ua]: Addison-Wesley. ISBN 978-0-201-83595-3.
  17. ^ Michael McCool; James Reinders; Arch Robison (2013). Programación paralela estructurada: patrones para una computación eficiente . Elsevier. pag. 61.
  18. ^ Gustafson, John L. (mayo de 1988). "Reevaluación de la ley de Amdahl" . Comunicaciones de la ACM . 31 (5): 532–533. CiteSeerX 10.1.1.509.6892 . doi : 10.1145 / 42411.42415 . S2CID 33937392 . Archivado desde el original el 27 de septiembre de 2007.  
  19. ^ Bernstein, AJ (1 de octubre de 1966). "Análisis de programas para procesamiento paralelo". Transacciones IEEE en computadoras electrónicas . EC-15 (5): 757–763. doi : 10.1109 / PGEC.1966.264565 .
  20. ^ Roosta, Seyed H. (2000). Procesamiento paralelo y algoritmos paralelos: teoría y computación . Nueva York, NY [ua]: Springer. pag. 114. ISBN 978-0-387-98716-3.
  21. ^ "Procesos e hilos" . Red de desarrolladores de Microsoft . Microsoft Corp.2018 . Consultado el 10 de mayo de 2018 .
  22. Krauss, Kirk J (2018). "Seguridad del hilo para el rendimiento" . Desarrollar para el rendimiento . Consultado el 10 de mayo de 2018 .
  23. Tanenbaum, Andrew S. (1 de febrero de 2002). Introducción a los puntos muertos del sistema operativo . Informar . Educación de Pearson, Informit . Consultado el 10 de mayo de 2018 .
  24. Cecil, David (3 de noviembre de 2015). "Internos de sincronización - el semáforo" . Embebido . AspenCore . Consultado el 10 de mayo de 2018 .
  25. Preshing, Jeff (8 de junio de 2012). "Introducción a la programación sin bloqueo" . Presionando en Programación . Consultado el 10 de mayo de 2018 .
  26. ^ "¿Qué es lo opuesto a" vergonzosamente paralelo "?" . StackOverflow . Consultado el 10 de mayo de 2018 .
  27. Schwartz, David (15 de agosto de 2011). "¿Qué es la contención de hilos?" . StackOverflow . Consultado el 10 de mayo de 2018 .
  28. Kukanov, Alexey (4 de marzo de 2008). "Por qué una simple prueba puede obtener una ralentización paralela" . Consultado el 15 de febrero de 2015 .
  29. Krauss, Kirk J (2018). "Threading for Performance" . Desarrollar para el rendimiento . Consultado el 10 de mayo de 2018 .
  30. ^ Lamport, Leslie (1 de septiembre de 1979). "Cómo hacer una computadora multiprocesador que ejecute correctamente programas multiproceso". Transacciones IEEE en computadoras . C-28 (9): 690–691. doi : 10.1109 / TC.1979.1675439 . S2CID 5679366 . 
  31. ^ Patterson y Hennessy, p. 748.
  32. ^ Singh, David Culler; JP (1997). Arquitectura informática paralela ([Nachdr.] Ed.). San Francisco: Morgan Kaufmann Publ. pag. 15. ISBN 978-1-55860-343-1.
  33. ^ Culler y col. pag. 15.
  34. ^ Patt, Yale (abril de 2004). " El microprocesador dentro de diez años: ¿Cuáles son los desafíos, cómo los enfrentamos? Archivado el 14de abril de 2008en la Wayback Machine (wmv). Charla de conferenciante distinguida en la Universidad Carnegie Mellon . Recuperado el 7 de noviembre de 2007.
  35. ^ Culler y col. pag. 124.
  36. ^ Culler y col. pag. 125.
  37. ^ Samuel Larsen; Saman Amarasinghe. "Explotación del paralelismo a nivel de superpalabra con conjuntos de instrucciones multimedia" (PDF) .
  38. ↑ a b Patterson y Hennessy, p. 713.
  39. ↑ a b Hennessy y Patterson, p. 549.
  40. ^ Patterson y Hennessy, p. 714.
  41. ^ Ghosh (2007) , p. 10. Keidar (2008) .
  42. ^ Lynch (1996) , p. xix, 1–2. Peleg (2000) , pág. 1.
  43. ^ ¿Qué es la agrupación en clústeres? Diccionario informático de Webopedia. Consultado el 7 de noviembre de 2007.
  44. ^ Definición de Beowulf. Revista de PC . Consultado el 7 de noviembre de 2007.
  45. ^ "Estadísticas de la lista | Sitios de supercomputadoras TOP500" . www.top500.org . Consultado el 5 de agosto de 2018 .
  46. ^ "Interconexión" Archivado el 28 de enero de 2015 en la Wayback Machine .
  47. ^ Hennessy y Patterson, p. 537.
  48. ^ Definición de MPP. Revista de PC . Consultado el 7 de noviembre de 2007.
  49. ^ Kirkpatrick, Scott (2003). "CIENCIA DE LA COMPUTADORA: Tiempos difíciles por delante". Ciencia . 299 (5607): 668–669. doi : 10.1126 / science.1081623 . PMID 12560537 . S2CID 60622095 .  
  50. ^ a b c D'Amour, Michael R., director de operaciones, DRC Computer Corporation . "Computación estándar reconfigurable". Orador invitado en la Universidad de Delaware, 28 de febrero de 2007.
  51. ^ Boggan, Sha'Kia y Daniel M. Pressel (agosto de 2007). GPU: una plataforma emergente para la computación de propósito general Archivado el 25 de diciembre de 2016 en Wayback Machine (PDF). ARL-SR-154, Laboratorio de Investigación del Ejército de EE. UU. Consultado el 7 de noviembre de 2007.
  52. ^ Maslennikov, Oleg (2002). "Generación sistemática de programas de ejecución para elementos de procesador en sistemas paralelos ASIC o basados ​​en FPGA y su transformación en VHDL-Descripciones de unidades de control de elementos de procesador". Notas de la conferencia en Ciencias de la Computación , 2328/2002: p. 272.
  53. ^ Shimokawa, Y .; Fuwa, Y .; Aramaki, N. (18 a 21 de noviembre de 1991). "Un neuroordenador ASIC VLSI paralelo para una gran cantidad de neuronas y mil millones de conexiones por segundo de velocidad". Conferencia conjunta internacional sobre redes neuronales . 3 : 2162–2167. doi : 10.1109 / IJCNN.1991.170708 . ISBN 978-0-7803-0227-3. S2CID  61094111 .
  54. ^ Acken, Kevin P .; Irwin, Mary Jane; Owens, Robert M. (julio de 1998). "Una arquitectura ASIC paralela para una codificación de imágenes fractal eficiente". The Journal of VLSI Signal Processing . 19 (2): 97-113. doi : 10.1023 / A: 1008005616596 . S2CID 2976028 . 
  55. ^ Kahng, Andrew B. (21 de junio de 2004) " Alcance del problema de DFM en la industria de semiconductores Archivado 2008-01-31 en la Wayback Machine ". Universidad de California, San Diego. "La tecnología de diseño futuro para la fabricación (DFM) debe reducir el costo de diseño [gastos no recuperables] y abordar directamente los [gastos no recuperables] de fabricación, el costo de un juego de mascarillas y una tarjeta de sonda, que supera con creces el millón de dólares a 90 nm. nodo tecnológico y crea un freno significativo a la innovación basada en semiconductores ".
  56. ↑ a b Patterson y Hennessy, p. 751.
  57. ^ El Premio Sidney Fernbach dado a MPI inventor Bill Gropp Archivado 2011-07-25 en la Wayback Machine se refiere a MPI como "la interfaz de comunicaciones HPC dominante"
  58. ^ Shen, John Paul; Mikko H. Lipasti (2004). Diseño de procesador moderno: fundamentos de los procesadores superescalares (1ª ed.). Dubuque, Iowa: McGraw-Hill. pag. 561. ISBN 978-0-07-057064-1. Sin embargo, el santo grial de tal investigación — la paralelización automatizada de programas seriales — aún no se ha materializado. Si bien se ha demostrado la paralelización automatizada de ciertas clases de algoritmos, dicho éxito se ha limitado en gran medida a aplicaciones científicas y numéricas con control de flujo predecible (p. Ej., Estructuras de bucle anidado con recuentos de iteraciones determinados estáticamente) y patrones de acceso a memoria analizables estáticamente. (por ejemplo, camina sobre grandes conjuntos multidimensionales de datos de punto flotante).
  59. ^ Enciclopedia de Computación Paralela, Volumen 4 por David Padua 2011 ISBN 0387097651 página 265 
  60. ^ Asanovic, Krste, et al. (18 de diciembre de 2006). "El panorama de la investigación en computación paralela: una vista desde Berkeley" (PDF). Universidad de California, Berkeley. Informe técnico No. UCB / EECS-2006-183. Consulte la tabla en las páginas 17-19.
  61. ^ Dobel, B., Hartig, H. y Engel, M. (2012) "Soporte del sistema operativo para multiproceso redundante". Actas de la Décima Conferencia Internacional ACM sobre Software Embebido , 83–92. doi : 10.1145 / 2380356.2380375
  62. ^ a b Patterson y Hennessy, págs. 749-50: "Aunque logró impulsar varias tecnologías útiles en proyectos posteriores, ILLIAC IV fracasó como computadora. Los costos aumentaron de los $ 8 millones estimados en 1966 a $ 31 millones en 1972, a pesar de la construcción de sólo una cuarta parte de la máquina planificada. Fue quizás la más infame de las supercomputadoras. El proyecto se inició en 1965 y ejecutó su primera aplicación real en 1976 ".
  63. Menabrea, LF (1842). Bosquejo del motor analítico inventado por Charles Babbage . Bibliothèque Universelle de Genève. Recuperado el 7 de noviembre de 2007. quote: "cuando se va a realizar una larga serie de cálculos idénticos, como los necesarios para la formación de tablas numéricas, la máquina puede ponerse en juego para dar varios resultados al mismo tiempo , lo que reducirá enormemente la cantidad total de procesos ".
  64. ↑ a b Patterson y Hennessy, p. 753.
  65. ^ RW Hockney, CR Jesshope. Computadoras paralelas 2: Arquitectura, programación y algoritmos, Volumen 2 . 1988. p. 8 cita: "Se cree que la primera referencia al paralelismo en el diseño por computadora se encuentra en la publicación del General LF Menabrea en ... 1842, titulada Bosquejo del motor analítico inventado por Charles Babbage ".
  66. ^ "Programación paralela", S. Gill, The Computer Journal Vol. 1 # 1, pp2-10, British Computer Society, abril de 1958.
  67. ↑ a b c d e Wilson, Gregory V. (1994). "La Historia del Desarrollo de la Computación Paralela" . Virginia Tech / Norfolk State University, aprendizaje interactivo con una biblioteca digital en informática . Consultado el 8 de enero de 2008 .
  68. ^ Anthes, Gry (19 de noviembre de 2001). "El poder del paralelismo" . Computerworld . Archivado desde el original el 31 de enero de 2008 . Consultado el 8 de enero de 2008 .
  69. ^ Patterson y Hennessy, p. 749.
  70. ^ Minsky, Marvin (1986). La sociedad de la mente . Nueva York: Simon & Schuster. pp.  17 . ISBN 978-0-671-60740-1.
  71. ^ Minsky, Marvin (1986). La sociedad de la mente . Nueva York: Simon & Schuster. págs.  29 . ISBN 978-0-671-60740-1.
  72. ^ Blakeslee, Thomas (1996). Más allá de la mente consciente. Descubriendo los secretos del yo . págs.  6–7 .
  73. ^ Gazzaniga, Michael ; LeDoux, Joseph (1978). La mente integrada . págs. 132-161.
  74. ^ Gazzaniga, Michael (1985). El cerebro social. Descubriendo las redes de la mente . págs.  77–79 .
  75. ^ Ornstein, Robert (1992). Evolución de la conciencia: los orígenes de nuestra forma de pensar . págs.  2 .
  76. ^ Hilgard, Ernest (1977). Conciencia dividida: múltiples controles en el pensamiento y la acción humanos . Nueva York: Wiley. ISBN 978-0-471-39602-4.
  77. ^ Hilgard, Ernest (1986). Conciencia dividida: múltiples controles en el pensamiento y la acción humanos (edición ampliada) . Nueva York: Wiley. ISBN 978-0-471-80572-4.
  78. ^ Kaku, Michio (2014). El futuro de la mente .
  79. ^ Ouspenskii, Pyotr (1992). "Capítulo 3". En busca de lo milagroso. Fragmentos de una enseñanza desconocida . págs. 72–83.
  80. ^ "Sitio oficial del modelo de cerebro de neurocluster" . Consultado el 22 de julio de 2017 .

Lectura adicional [ editar ]

  • Rodríguez, C .; Villagra, M .; Baran, B. (29 de agosto de 2008). "Algoritmos de equipo asincrónico para la satisfacción booleana". Modelos bioinspirados de sistemas de redes, información y computación, 2007. Bionetics 2007. 2nd : 66–69. doi : 10.1109 / BIMNICS.2007.4610083 . S2CID  15185219 .
  • Sechin, A .; Computación Paralela en Fotogrametría. GIM International. # 1, 2016, págs. 21–23.

Enlaces externos [ editar ]

Escuche este artículo ( 54 minutos )
Icono de Wikipedia hablado
Este archivo de audio se creó a partir de una revisión de este artículo con fecha del 21 de agosto de 2013 y no refleja ediciones posteriores. (2013-08-21)
  • Videos instructivos sobre CAF en el estándar Fortran por John Reid (consulte el Apéndice B)
  • Computación paralela en Curlie
  • Laboratorio Nacional Lawrence Livermore: Introducción a la Computación Paralela
  • Diseño y construcción de programas paralelos, por Ian Foster
  • Archivo de computación paralela de Internet
  • Área temática de procesamiento paralelo en IEEE Distributed Computing Online
  • Parallel Computing Works Libro en línea gratuito
  • Frontiers of Supercomputing Libro en línea gratuito que cubre temas como algoritmos y aplicaciones industriales
  • Centro de Investigación de Computación Paralela Universal
  • Curso de Programación Paralela en la Universidad de Columbia (en colaboración con el proyecto IBM TJ Watson X10)
  • Cálculo de bases de Gröbner paralelas y distribuidas en JAS , ver también bases de Gröbner
  • Curso de Computación Paralela en la Universidad de Wisconsin-Madison
  • Berkeley Par Lab: progreso en el panorama de la computación paralela , Editores: David Patterson, Dennis Gannon y Michael Wrinn, 23 de agosto de 2013
  • El problema con multinúcleo , por David Patterson, publicado el 30 de junio de 2010
  • Computación paralela: una visión desde Techsevi
  • Introducción a la computación paralela
  • Coursera: programación paralela