Articulo de referencia

Computación paralela

Las grandes supercomputadoras, como la Blue Gene/P de IBM , están diseñadas para aprovechar al máximo el paralelismo. La computación paralela es un tipo de computación en la que...

Escucha este artículo
Las grandes supercomputadoras, como la Blue Gene/P de IBM , están diseñadas para aprovechar al máximo el paralelismo.

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 problemas más pequeños, que luego se pueden resolver al mismo tiempo. Hay varias formas diferentes de computación paralela: paralelismo a nivel de bits , a nivel de instrucciones , de datos y de tareas . El paralelismo se ha empleado durante mucho tiempo en la computación de alto rendimiento , pero ha ganado un interés más amplio debido a las limitaciones físicas que impiden el escalado de frecuencia . [ 2 ] Como el consumo de energía (y, por consiguiente, 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 computadoras , principalmente en forma de procesadores multinúcleo . [ 4 ]

Paralelismo frente a concurrencia

En informática , el paralelismo y la concurrencia son dos cosas distintas: un programa paralelo utiliza múltiples núcleos de CPU , y cada núcleo realiza una tarea de forma independiente. Por otro lado, la concurrencia permite que un programa gestione múltiples tareas incluso en un solo núcleo de CPU; el núcleo alterna entre tareas (es decir, hilos ) sin necesidad de completarlas todas. Un programa puede tener ambas características, ninguna o una combinación de ellas. [ 5 ]

Las computadoras paralelas se pueden clasificar, a grandes rasgos, según el nivel de paralelismo que ofrece su hardware. Las computadoras multinúcleo y multiprocesador cuentan con múltiples elementos de procesamiento en una sola máquina, mientras que los clústeres , los sistemas multiprocesador y las redes utilizan varias computadoras para realizar la misma tarea. En ocasiones, se emplean arquitecturas de computadoras paralelas especializadas junto con 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 instrucciones, pero los algoritmos explícitamente paralelos , en particular los que utilizan concurrencia, son más difíciles de escribir que los secuenciales , [ 6 ] porque la concurrencia introduce varias clases nuevas 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 lograr un rendimiento óptimo de los programas paralelos.

La ley de Amdahl proporciona un límite superior teórico para la aceleración de un solo programa como resultado de la paralelización , el cual establece que está limitado por la fracción de tiempo durante la cual se puede utilizar la paralelización.

Fondo

Tradicionalmente, el software informático se ha escrito para la computación en serie . Para resolver un problema, se construye un algoritmo y se implementa como una secuencia 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 que finaliza una instrucción, se ejecuta la siguiente. [ 7 ]

Por otro lado, la computación paralela utiliza 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 como una sola computadora con múltiples procesadores, varias computadoras en red, hardware especializado o cualquier combinación de los anteriores. [ 7 ] 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 la ingeniería , como la meteorología . Esto condujo al diseño de hardware y software paralelos, y a la computación de alto rendimiento . [ 8 ]

El escalado de frecuencia fue la razón principal de las mejoras en el rendimiento de las computadoras 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, aumentar la frecuencia del reloj disminuye el tiempo promedio que se tarda en ejecutar una instrucción. Por lo tanto, un aumento en la frecuencia disminuye el tiempo de ejecución para todos los programas que requieren mucha computación . [ 9 ] Sin embargo, el consumo de energía P de un chip viene dado por la ecuación P = C × V 2 × F , donde C es la capacitancia que se conmuta por ciclo de reloj (proporcional al número de transistores cuyas entradas cambian), V es el voltaje y F es la frecuencia del procesador (ciclos por segundo). [ 10 ] Los aumentos en la frecuencia aumentan la cantidad de energía utilizada en un procesador. El aumento del consumo de energía del procesador condujo finalmente a la cancelación por parte de Intel , el 8 de mayo de 2004, de sus procesadores Tejas y Jayhawk , lo que generalmente se cita como el fin del escalado de frecuencia como paradigma dominante de la arquitectura de computadoras. [ 11 ]

Para abordar el problema del consumo de energía y el sobrecalentamiento, los principales fabricantes de unidades centrales de procesamiento (CPU o procesadores) comenzaron a producir procesadores de bajo consumo con múltiples núcleos. El núcleo es la unidad de cálculo del procesador y, en los procesadores multinúcleo, cada núcleo es independiente y puede acceder a la misma memoria simultáneamente. Los procesadores multinúcleo han llevado la computación paralela a las computadoras de escritorio . Así, la paralelización de programas seriales se ha convertido en una tarea de programación común. En 2012, los procesadores de cuatro núcleos se convirtieron en el estándar para las computadoras de escritorio , mientras que los servidores tenían procesadores de más de 10 núcleos. La ley de Moore predijo que el número de núcleos por procesador se duplicaría cada 18-24 meses. [ 12 ] Para 2023, algunos procesadores tenían más de cien núcleos. Algunos diseños tenían una mezcla de núcleos de rendimiento y eficiencia (como el diseño big.LITTLE de ARM ) debido a las limitaciones térmicas y de diseño.

Un sistema operativo puede garantizar que diferentes tareas y programas de usuario se ejecuten en paralelo en los núcleos disponibles. Sin embargo, para que un programa de software serial aproveche al máximo la arquitectura multinúcleo, el programador necesita reestructurar y paralelizar el código. La aceleración del tiempo de ejecución del software de aplicación ya no se logrará mediante el escalado de frecuencia; en cambio, los programadores deberán paralelizar su código de software para aprovechar la creciente potencia de cálculo de las arquitecturas multinúcleo. [ 13 ]

Leyes pertinentes

Representación gráfica de la ley de Amdahl . Esta ley demuestra la aceleración máxima teórica de un sistema y el concepto de rendimientos decrecientes. Si se puede paralelizar exactamente el 50 % del trabajo, la mejor aceleración posible es de 2 veces. Si se puede paralelizar el 95 %, la mejor aceleración posible es de 20 veces. Según la ley, incluso con un número infinito de procesadores, la aceleración está limitada por la parte no paralelizable.
Supongamos que una tarea consta de dos partes independientes, A y B. La parte B consume aproximadamente el 25 % del tiempo total del cálculo. Con un esfuerzo considerable, se podría lograr que esta parte sea cinco veces más rápida, pero esto solo reduciría ligeramente el tiempo total del cálculo. En cambio, para duplicar la velocidad de la parte A , con menos esfuerzo , el cálculo sería mucho más rápido que optimizando la parte B , aunque la aceleración de esta última sea proporcionalmente mayor (cinco veces frente a dos).

Idealmente, la aceleración derivada de la paralelización sería lineal: duplicar el número de elementos de procesamiento debería reducir el tiempo de ejecución a la mitad, y duplicarlo una segunda vez debería reducirlo nuevamente a la mitad. Sin embargo, muy pocos algoritmos paralelos logran una aceleración óptima. La mayoría presenta una aceleración casi lineal para un número reducido de elementos de procesamiento, la cual se estabiliza en un valor constante para un número elevado de ellos.

La máxima aceleración potencial de un sistema global se puede calcular mediante la ley de Amdahl . [ 14 ] La ley de Amdahl indica que la mejora óptima del rendimiento se logra equilibrando las mejoras tanto en los componentes paralelizable como en los no paralelizable de una tarea. Además, revela que aumentar el número de procesadores produce rendimientos decrecientes, con ganancias de aceleración insignificantes a partir de cierto punto. [ 15 ] [ 16 ]

La Ley de Amdahl tiene limitaciones, incluyendo supuestos de carga de trabajo fija, descuidando la comunicación entre procesos y los costos generales de sincronización , centrándose principalmente en el aspecto computacional e ignorando factores extrínsecos como la persistencia de datos, las operaciones de E/S y los costos generales de acceso a la memoria. [ 17 ] [ 18 ] [ 19 ]

La ley de Gustafson y la ley de escalabilidad universal ofrecen una evaluación más realista del rendimiento en paralelo. [ 20 ] [ 21 ]

Representación gráfica de la ley de Gustafson

Dependencias

Comprender las dependencias de los datos es fundamental para implementar algoritmos paralelos . Ningún programa puede ejecutarse más rápido 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 previos en la cadena deben ejecutarse en orden. Sin embargo, la mayoría de los algoritmos no consisten únicamente en una larga cadena de cálculos dependientes; generalmente existen oportunidades para ejecutar cálculos independientes en paralelo.

Sean P i y P j dos segmentos de programa. Las condiciones de Bernstein [ 22 ] describen cuándo ambos 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, y de manera similar para P j . P i y P j son independientes si satisfacen

IjOi=,{\displaystyle I_{j}\cap O_{i}=\varnothing ,}
IiOj=,{\displaystyle I_{i}\cap O_{j}=\varnothing ,}
OiOj=.{\displaystyle O_{i}\cap O_{j}=\varnothing .}

La violación de la primera condición introduce una dependencia de flujo, correspondiente a que el primer segmento produzca un resultado utilizado por el segundo segmento. La segunda condición representa una antidependencia, 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. [ 23 ]

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

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

En este ejemplo, la instrucción 3 no puede ejecutarse antes (ni siquiera en paralelo) con la instrucción 2, porque la instrucción 3 utiliza un resultado de la instrucción 2. Esto viola la condición 1 y, por lo tanto, introduce una dependencia de flujo.

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

En este ejemplo, no existen dependencias entre las instrucciones, por lo que todas pueden ejecutarse en paralelo.

Las condiciones de Bernstein no permiten que la memoria se comparta entre diferentes procesos. Para ello, es necesario algún medio para imponer un orden entre los accesos, como semáforos , barreras u otro método de sincronización .

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

Las subtareas en un programa paralelo a menudo se denominan hilos . Algunas arquitecturas de computadoras paralelas utilizan versiones más pequeñas y ligeras de hilos, conocidas como fibras , mientras que otras utilizan versiones más grandes, conocidas como procesos . Sin embargo, "hilos" se acepta generalmente como un término genérico para subtareas. [ 24 ] Los hilos a menudo necesitarán acceso sincronizado a un objeto u otro recurso , por ejemplo, cuando deben actualizar una variable que comparten. Sin sincronización, las instrucciones entre los dos hilos pueden intercalarse 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 bloqueo para garantizar la exclusión mutua . Un bloqueo es una construcción del lenguaje de programación que permite que un hilo tome el control de una variable e impida que otros hilos la lean o escriban, hasta que dicha variable se desbloquee. El hilo que mantiene el bloqueo puede ejecutar libremente su sección crítica (la sección del programa que requiere acceso exclusivo a alguna variable) y desbloquear los datos cuando termine. Por lo tanto, para garantizar la correcta ejecución del programa, el programa anterior puede reescribirse para usar bloqueos:

Un hilo bloqueará correctamente la variable V, mientras que el otro hilo quedará bloqueado , sin poder continuar hasta que V se desbloquee de nuevo. Esto garantiza la correcta ejecución del programa. Los bloqueos pueden ser necesarios para asegurar la correcta ejecución del programa cuando los hilos deben serializar el acceso a los recursos, pero su uso puede ralentizar considerablemente un programa y afectar su fiabilidad . [ 25 ]

El bloqueo de múltiples variables mediante bloqueos no atómicos introduce la posibilidad de un interbloqueo del programa . Un bloqueo atómico bloquea múltiples variables simultáneamente. Si no puede bloquearlas todas, no bloquea ninguna. Si dos hilos necesitan bloquear las mismas dos variables mediante bloqueos no atómicos, es posible que un hilo bloquee una de ellas y el segundo la otra. En tal caso, ninguno de los hilos puede completarse y se produce un interbloqueo. [ 26 ]

Muchos programas paralelos requieren que sus subtareas actúen de forma sincronizada . Esto exige el uso de una barrera . Las barreras se implementan típicamente mediante un bloqueo o un semáforo . [ 27 ] Una clase de algoritmos, conocidos como algoritmos sin bloqueo ni espera , evitan por completo el uso de bloqueos y barreras. Sin embargo, este enfoque suele ser difícil de implementar y requiere estructuras de datos diseñadas correctamente. [ 28 ]

No toda paralelización resulta en una aceleración. Generalmente, a medida que una tarea se divide en más y más hilos, estos dedican una porción cada vez mayor de su tiempo a comunicarse entre sí o a esperar el acceso de otros a los recursos. [ 29 ] [ 30 ] Una vez que la sobrecarga derivada de la contención de recursos o la comunicación domina el tiempo dedicado a otros cálculos, una mayor paralelización (es decir, dividir la carga de trabajo en aún más hilos) aumenta, en lugar de disminuir, el tiempo necesario para finalizar. Este problema, conocido como ralentización paralela , [ 31 ] puede mejorarse en algunos casos mediante el análisis y el rediseño del software. [ 32 ]

Paralelismo de grano fino, de grano grueso y embarazoso

Las aplicaciones suelen clasificarse según la frecuencia con la que sus subtareas necesitan sincronizarse o comunicarse entre sí. Una aplicación presenta paralelismo de grano fino si sus subtareas deben comunicarse muchas veces por segundo; presenta paralelismo de grano grueso si no se comunican muchas veces por segundo, y presenta paralelismo trivial si rara vez o nunca necesitan comunicarse. Las aplicaciones con paralelismo trivial se consideran las más fáciles de paralelizar.

La taxonomía de Flynn

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

La clasificación de instrucción única y datos únicos (SISD) equivale a un programa completamente secuencial. La clasificación de instrucción única y datos múltiples (SIMD) es análoga a realizar la misma operación repetidamente sobre un conjunto de datos grande. Esto se hace comúnmente en aplicaciones de procesamiento de señales . La clasificación de instrucción múltiple y datos únicos (MISD) se usa con poca frecuencia. Si bien se diseñaron arquitecturas de computadoras para manejar esto (como las matrices sistólicas ), pocas aplicaciones que se ajusten a esta clase se materializaron. Los programas de instrucción múltiple y datos múltiples (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íbridas de estas categorías, por supuesto, pero este modelo clásico ha perdurado porque es simple, fácil de entender y proporciona una buena primera aproximación. También es —quizás debido a su comprensibilidad— el esquema más utilizado». [ 34 ]

Desventajas

La computación paralela puede generar una sobrecarga significativa en la práctica, principalmente debido a los costos asociados con la fusión de datos de múltiples procesos. Específicamente, la comunicación y sincronización entre procesos pueden generar sobrecargas sustancialmente mayores —a menudo dos o más órdenes de magnitud— en comparación con el procesamiento de los mismos datos en un solo hilo. [ 35 ] [ 36 ] [ 37 ] Por lo tanto, la mejora general debe evaluarse cuidadosamente.

Granularidad

Paralelismo a nivel de bits

Taiwania 3 de Taiwán , un dispositivo de supercomputación paralela que se unió a la investigación sobre la COVID-19.

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, el aumento de velocidad en la arquitectura de computadoras fue impulsado por duplicar el tamaño de palabra de la computadora , la cantidad de información que el procesador puede manipular por ciclo. [ 38 ] Aumentar el tamaño de palabra reduce la cantidad 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 debe primero sumar los 8 bits de orden inferior de cada entero usando la instrucción de suma estándar, luego sumar los 8 bits de orden superior usando una instrucción de suma con acarreo y el bit de acarreo de la suma de orden inferior; por lo tanto, un procesador de 8 bits requiere dos instrucciones para completar una sola operación, mientras que 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, 16 y 32 bits. Esta tendencia generalmente finalizó con la introducción de los procesadores de 32 bits, que se convirtieron en el estándar de la informática general durante dos décadas. No fue hasta principios de la década de 2000, con la llegada de las arquitecturas x86-64 , que los procesadores de 64 bits se generalizaron.

Paralelismo a nivel de instrucción

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

Un programa informático es, en esencia, una secuencia 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 pueden reordenarse y combinarse en grupos que luego se ejecutan en paralelo sin alterar 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 informática desde mediados de la década de 1980 hasta mediados de la década de 1990. [ 39 ]

Un procesador segmentado 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 ofrecer un rendimiento escalar ( IPC = 1 ).

Todos los procesadores modernos tienen tuberías de instrucciones de múltiples etapas . Cada etapa de la tubería corresponde a una acción diferente que el procesador realiza sobre esa instrucción en esa etapa; un procesador con una tubería de N etapas puede tener hasta N instrucciones diferentes en distintas 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 con tubería es un procesador RISC , con cinco etapas: búsqueda de instrucciones (IF), decodificación de instrucciones (ID), ejecución (EX), acceso a memoria (MEM) y escritura de registros (WB). El procesador Pentium 4 tenía una tubería de 35 etapas. [ 40 ]

Un procesador segmentado 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 ofrecer un rendimiento superescalar ( IPC = 2 > 1 ).

La mayoría de los procesadores modernos también cuentan con múltiples unidades de ejecución . Suelen combinar esta característica con la segmentación (pipelining) 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 distintas unidades de ejecución no constituyen procesadores completos (es decir, unidades de procesamiento). Las instrucciones solo pueden agruparse si no existe dependencia de datos entre ellas. El algoritmo de puntuación (scoreboarding ) y el algoritmo de Tomasulo (similar al scoreboarding pero que utiliza el 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

El paralelismo de tareas es la característica de un programa paralelo que permite realizar cálculos completamente diferentes sobre conjuntos de datos iguales o diferentes. [ 41 ] Esto contrasta con el paralelismo de datos, donde se realiza el mismo cálculo sobre conjuntos de datos iguales o diferentes. El paralelismo de tareas implica la descomposición de una tarea en subtareas y la asignación de cada subtarea a un procesador para su ejecución. Los procesadores ejecutan estas subtareas de forma concurrente y, a menudo, cooperativa. El paralelismo de tareas no suele ser proporcional al tamaño del problema. [ 42 ]

paralelismo a nivel de supermundo

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 distingue de los algoritmos de vectorización de bucles en que puede aprovechar el paralelismo del código en línea , como la manipulación de coordenadas, canales de color o en bucles desenrollados manualmente. [ 43 ]

Hardware

Memoria y comunicación

La memoria principal en una computadora paralela es memoria compartida (compartida entre todos los elementos de procesamiento en un único espacio de direcciones ) o memoria distribuida (en la que cada elemento de procesamiento tiene su propio espacio de direcciones local). [ 44 ] 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 memoria combinan ambos 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 en un nodo de cómputo accedan de forma transparente a la memoria remota de otro nodo de cómputo. Todos los nodos de cómputo también están conectados a un sistema de memoria compartida externo a través de una interconexión de alta velocidad, como Infiniband . Este sistema de memoria compartida externo se conoce como búfer de ráfaga , que normalmente se construye a partir de matrices de memoria no volátil distribuidas físicamente en múltiples nodos de E/S.

Una representación lógica de una arquitectura de acceso a memoria no uniforme (NUMA). Los procesadores en un directorio pueden acceder a la memoria de ese directorio con menor latencia que la que tendrían al acceder a la memoria en el 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 memoria (UMA). Normalmente, esto solo se logra con un sistema de memoria compartida , en el que la memoria no está distribuida físicamente. Un sistema que no posee esta propiedad se conoce como arquitectura de acceso no uniforme a memoria (NUMA). Los sistemas de memoria distribuida presentan acceso no uniforme a memoria.

Los sistemas informáticos (con la excepción de las LPU de Groq ) utilizan cachés : memorias pequeñas y rápidas ubicadas cerca del procesador que almacenan copias temporales de valores de memoria (cercanas tanto en el sentido físico como lógico). Los sistemas informáticos paralelos presentan 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. Estos ordenadores 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 correcta ejecución del programa. El espionaje del bus es uno de los métodos más comunes para controlar qué valores se están accediendo (y, por lo tanto, deben purgarse). Diseñar sistemas de coherencia de caché grandes y de alto rendimiento es un problema muy difícil en la arquitectura de ordenadores. Como resultado, las arquitecturas de ordenadores de memoria compartida no escalan y los sistemas de memoria distribuida sí. [ 44 ]

La comunicación entre procesadores y entre procesador y memoria se puede implementar en hardware de varias maneras, incluyendo 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 necesitan algún tipo de enrutamiento para permitir el paso de mensajes entre nodos que no están conectados directamente. En grandes sistemas multiprocesador, es probable que el medio de comunicación entre los procesadores sea jerárquico.

Clases de computadoras paralelas

Las computadoras paralelas pueden clasificarse, a grandes rasgos, según el nivel de paralelismo que admite su hardware. Esta clasificación es, en términos generales, análoga a la distancia entre nodos de computación básicos. Estas clasificaciones no son mutuamente excluyentes; por ejemplo, los clústeres de multiprocesadores simétricos son relativamente comunes.

computación multinúcleo

Un procesador multinúcleo es aquel que integra varias unidades de procesamiento (denominadas "núcleos") en un mismo chip. Se diferencia de un procesador superescalar , que incluye múltiples unidades de ejecución y puede emitir varias instrucciones por ciclo de reloj desde un único hilo de instrucciones. En cambio, un procesador multinúcleo puede emitir varias instrucciones por ciclo de reloj desde múltiples hilos de instrucciones. El microprocesador Cell de IBM , diseñado para la Sony PlayStation 3 , es un ejemplo destacado de procesador multinúcleo. Cada núcleo de un procesador multinúcleo también puede ser superescalar; es decir, en cada ciclo de reloj, cada núcleo puede emitir varias instrucciones desde un único hilo.

El procesamiento multihilo simultáneo (del cual Hyper-Threading de Intel es el más conocido) fue una forma temprana de pseudomultinúcleo. Un procesador capaz de procesamiento multihilo concurrente incluye múltiples unidades de ejecución en la misma unidad de procesamiento —es decir, tiene una arquitectura superescalar— y puede emitir múltiples instrucciones por ciclo de reloj desde múltiples hilos. El procesamiento multihilo temporal, por otro lado, incluye una única unidad de ejecución en la misma unidad de procesamiento y puede emitir una instrucción a la vez desde múltiples hilos.

Multiprocesamiento simétrico

Un multiprocesador simétrico (SMP) es un sistema informático con múltiples procesadores idénticos que comparten memoria y se conectan mediante un bus . [ 45 ] La contención del bus impide la escalabilidad de las arquitecturas de bus. Como resultado, los SMP generalmente no constan de más de 32  procesadores. [ 46 ] Debido al pequeño tamaño de los procesadores y a la importante reducción en los requisitos de ancho de banda del bus que se logra con grandes cachés, estos multiprocesadores simétricos son extremadamente rentables, siempre que exista un ancho de banda de memoria suficiente. [ 45 ]

computación distribuida

Un ordenador distribuido (también conocido 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. Los ordenadores distribuidos son altamente escalables. Los términos " computación concurrente ", "computación paralela" y "computación distribuida" se superponen en gran medida y no existe una distinción clara entre ellos. [ 47 ] [ 48 ] El mismo sistema puede caracterizarse tanto como "paralelo" como "distribuido"; los procesadores en un sistema distribuido típico se ejecutan concurrentemente en paralelo. [ 49 ] [ 50 ]

computación en clúster
Un grupo de Beowulf

Un clúster es un grupo de computadoras débilmente acopladas que trabajan juntas estrechamente, de modo que en algunos aspectos pueden considerarse como una sola computadora. [ 51 ] Los clústeres están compuestos por múltiples máquinas independientes conectadas por una red. Si bien las máquinas en 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 listas para usar conectadas con una red de área local Ethernet TCP/IP . [ 52 ] La tecnología Beowulf fue desarrollada originalmente por Thomas Sterling y Donald Becker . El 87% de todas las supercomputadoras Top500 son clústeres. [ 53 ] El resto son procesadores masivamente paralelos, que se explican más adelante.

Debido a que los sistemas de computación en malla (que se describen a continuación) pueden manejar fácilmente problemas fácilmente paralelizados, los clústeres modernos suelen diseñarse para manejar problemas más difíciles, problemas que requieren que los nodos compartan resultados intermedios entre sí con mayor frecuencia. Esto requiere un ancho de banda alto y, más importante aún, 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. [ 54 ] A partir de 2014, la mayoría de las supercomputadoras actuales utilizan algún hardware de red estándar disponible en el mercado, a menudo Myrinet , InfiniBand o Gigabit Ethernet .

computación masivamente paralela
Un gabinete de la supercomputadora masivamente paralela Blue Gene/L de IBM .

Un procesador masivamente paralelo (MPP) es un ordenador con muchos procesadores en red. Los MPP comparten muchas características con los clústeres, pero cuentan con redes de interconexión especializadas (mientras que los clústeres utilizan hardware estándar para la interconexión). Además, los MPP suelen ser más grandes que los clústeres, con más de 100  procesadores. [ 55 ] 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 mediante una interconexión de alta velocidad». [ 56 ]

El Blue Gene/L de IBM , la quinta supercomputadora más rápida del mundo según la clasificación TOP500 de junio de 2009 , es un MPP (Procesamiento Multipropósito).

computación en malla

La computación en malla es la forma más distribuida de computación paralela. Utiliza ordenadores que se comunican a través de Internet para trabajar en un problema determinado. Debido al bajo ancho de banda y la altísima latencia de Internet, la computación distribuida suele limitarse a problemas fácilmente paralelizable .

La mayoría de las aplicaciones de computación en malla utilizan middleware (software que se sitúa entre el sistema operativo y la aplicación para gestionar los recursos de red y estandarizar la interfaz del software). El middleware más común para la computación en malla es la Infraestructura Abierta de Berkeley para la Computación en Red (BOINC). A menudo, el software de computación distribuida utiliza "ciclos de reserva", realizando cálculos en momentos en que un ordenador está inactivo. [ 57 ]

computación en la nube

La omnipresencia de internet y las redes de alto ancho de banda hicieron posible la computación en la nube , un modelo donde los recursos masivamente paralelos se proporcionan como un servicio. Este paradigma abstrae el hardware subyacente, lo que permite a los usuarios acceder a clústeres virtualizados para cargas de trabajo escalables sin gestionar la infraestructura física.

Tecnología de registro distribuido

Los protocolos modernos de registro distribuido aplican principios de computación paralela para superar los cuellos de botella secuenciales de las cadenas de bloques tradicionales . Al fragmentar el espacio de estados, las arquitecturas de consenso más recientes permiten el "procesamiento de transacciones masivamente paralelo". En este modelo, utilizado por protocolos como Cerberus, las transacciones independientes se tratan como tareas paralelas que pueden ejecutarse simultáneamente en diferentes nodos, en lugar de procesarse en serie en un único bloque global. [ 58 ]

Computadoras paralelas especializadas

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

Computación reconfigurable con matrices de puertas programables en campo

La computación reconfigurable consiste en el uso de una matriz de puertas programables en campo (FPGA) como coprocesador de una computadora de propósito general. Una FPGA es, en esencia, un chip de computadora que puede reconfigurarse para realizar una tarea específica.

Los FPGA se pueden programar con lenguajes de descripción de hardware como VHDL [ 59 ] o Verilog [ 60 ] . Varios proveedores han creado lenguajes de 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 de C a HDL más conocidos son Mitrion-C , Impulse C y Handel-C . También se pueden utilizar 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 clave para la computación reconfigurable de alto rendimiento. [ 61 ] Según Michael R. D'Amour, director de operaciones de DRC Computer Corporation, «cuando entramos por primera vez en AMD, nos llamaban "los ladrones de sockets ". Ahora nos llaman sus socios». [ 61 ]

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

La computación de propósito general en unidades de procesamiento gráfico (GPGPU) es una tendencia relativamente reciente en la investigación en ingeniería informática. Las GPU son coprocesadores que han sido altamente optimizados para el procesamiento de gráficos por computadora . [ 62 ] El procesamiento de gráficos por computadora es un campo dominado por operaciones de paralelismo de datos, particularmente operaciones matriciales de álgebra lineal .

En sus inicios, los programas GPGPU utilizaban las API gráficas estándar para su ejecución. Sin embargo, se han desarrollado nuevos lenguajes de programación y plataformas para realizar computación 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 para 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 publicado la especificación OpenCL , un marco para escribir programas que se ejecutan en plataformas que incluyen CPU y GPU. AMD , Apple , Intel , Nvidia y otros son compatibles con OpenCL .

Circuitos integrados de aplicación específica

Se han ideado varios enfoques de circuitos integrados de aplicación específica (ASIC) para abordar aplicaciones paralelas. [ 63 ] [ 64 ] [ 65 ]

Debido a que un ASIC es (por definición) específico para una aplicación determinada, puede optimizarse completamente para esa aplicación. Como resultado, para una aplicación dada, un ASIC tiende a superar el rendimiento de una computadora de propósito general. Sin embargo, los ASIC se crean mediante fotolitografía UV . Este proceso requiere un conjunto de máscaras, que puede ser extremadamente costoso. Un conjunto de máscaras puede costar más de un millón de dólares estadounidenses. [ 66 ] (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 a lo largo del tiempo (como describe la ley de Moore ) tienden a eliminar estas ganancias en solo una o dos generaciones de chips. [ 61 ] El alto costo inicial y la tendencia a ser superados por la computación de propósito general impulsada por la ley de Moore han hecho que los ASIC sean inviables para la mayoría de las aplicaciones de computación paralela. Sin embargo, algunos se han construido. Un ejemplo es la máquina PFLOPS RIKEN MDGRAPE-3 que utiliza ASIC personalizados para simulación de dinámica molecular .

Procesadores vectoriales
El Cray-1 es un procesador vectorial.

Un procesador vectorial es una CPU o sistema informático capaz de ejecutar la misma instrucción en grandes conjuntos de datos. Los procesadores vectoriales cuentan con operaciones de alto nivel que trabajan con 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, cada uno compuesto por números de coma flotante de 64 bits . [ 67 ] Están estrechamente relacionados con la clasificación SIMD de Flynn. [ 67 ]

Los ordenadores Cray se hicieron famosos por sus procesadores vectoriales en las décadas de 1970 y 1980. Sin embargo, los procesadores vectoriales, tanto como CPU como sistemas informáticos completos, prácticamente han desaparecido. Los conjuntos de instrucciones de los procesadores modernos incluyen algunas instrucciones de procesamiento vectorial, como las de AltiVec de Freescale Semiconductor y Streaming SIMD Extensions (SSE) de Intel .

Software

Lenguajes de programación paralela

Se han creado lenguajes de programación concurrentes , bibliotecas , API y modelos de programación paralela (como esqueletos algorítmicos ) para programar computadoras paralelas. Estos generalmente se pueden dividir en clases según las suposiciones que hacen sobre la arquitectura de memoria subyacente: memoria compartida, memoria distribuida o memoria compartida distribuida. 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 de sistema de paso de mensajes más utilizada. [ 68 ] Un concepto utilizado en la programación de programas paralelos es el concepto de futuro , donde una parte de un programa promete entregar un dato requerido a otra parte de un programa en algún momento futuro.

Los esfuerzos por estandarizar la programación paralela incluyen un estándar abierto llamado OpenHMPP para la programación paralela híbrida multinúcleo. El modelo de programación basado en directivas de 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 mediante llamadas a procedimientos remotos .

El auge de las GPU para el consumidor ha propiciado la compatibilidad con los núcleos de cómputo , ya sea en las API gráficas (conocidas como sombreadores de cómputo ), en las API dedicadas (como OpenCL ) o en otras extensiones de lenguaje.

Paralelización automática

La paralelización automática de un programa secuencial mediante un compilador es el "santo grial" de la computación paralela, especialmente con la limitación de la frecuencia del procesador ya mencionada. A pesar de décadas de trabajo por parte de los investigadores de compiladores, la paralelización automática ha tenido un éxito limitado. [ 69 ]

Los lenguajes de programación paralela más comunes siguen siendo explícitamente paralelos o (en el mejor de los casos) parcialmente implícitos , en los que el programador proporciona al compilador directivas para la paralelización. Existen algunos lenguajes de programación paralela totalmente implícitos: SISAL , Parallel Haskell , SequenceL , SystemC (para FPGA ), Mitrion-C , VHDL y Verilog .

Punto de control de la aplicación

A medida que un sistema informático aumenta en complejidad, 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 y estados de variables actuales, similar a un volcado de memoria— ; esta información se puede utilizar para restaurar el programa si el ordenador falla. El punto de control de la aplicación implica que el programa debe reiniciarse desde su último punto de control en lugar de desde el principio. Si bien el punto de control ofrece ventajas en diversas situaciones, resulta especialmente útil en sistemas altamente paralelos con un gran número de procesadores utilizados en la computación de alto rendimiento . [ 70 ]

Métodos algorítmicos

A medida que las computadoras paralelas se vuelven más grandes y rápidas, ahora podemos resolver problemas que antes requerían demasiado tiempo para ejecutarse. Campos tan diversos como la bioinformática (para el plegamiento de proteínas y el análisis de secuencias ) y la economía se han beneficiado de la computación paralela. Los tipos comunes de problemas en las aplicaciones de computación paralela incluyen: [ 71 ]

Tolerancia a fallos

La computación paralela también puede aplicarse al diseño de sistemas informáticos tolerantes a fallos , en particular mediante sistemas síncronos 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 y corrección automática de errores si los resultados difieren. Estos métodos pueden utilizarse para ayudar a prevenir perturbaciones puntuales causadas por errores transitorios. [ 73 ] Si bien pueden requerirse medidas adicionales en sistemas embebidos o especializados, este método puede proporcionar un enfoque rentable para lograr redundancia n-modular en sistemas comerciales estándar.

Historia

ILLIAC IV , "la más infame de las supercomputadoras" [ 74 ]

Los orígenes del verdadero paralelismo (MIMD) se remontan a Luigi Federico Menabrea y su Bosquejo de la máquina analítica inventada por Charles Babbage . [ 75 ] [ 76 ] [ 77 ]

En 1957, Compagnie des Machines Bull anunció la primera arquitectura de computadora diseñada específicamente para el paralelismo, la Gamma 60. [ 78 ] Utilizaba un modelo de bifurcación-unión y un "Distribuidor de Programas" para enviar y recopilar datos desde y hacia unidades de procesamiento independientes conectadas a una memoria central. [ 79 ] [ 80 ]

En abril de 1958, Stanley Gill (Ferranti) habló sobre la programación paralela y la necesidad de ramificación y espera. [ 81 ] También en 1958, los investigadores de IBM John Cocke y Daniel Slotnick hablaron por primera vez sobre el uso del paralelismo en cálculos numéricos. [ 82 ] Burroughs Corporation presentó la D825 en 1962, una computadora de cuatro procesadores que accedía hasta 16 módulos de memoria a través de un conmutador de barra cruzada . [ 83 ] 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 la Información. [ 82 ] Fue durante este debate que se acuñó la ley de Amdahl 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. [ 82 ] C.mmp , un proyecto multiprocesador de 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 por bus con cachés de inspección fue el Synapse N+1 en 1984. [ 76 ]

Las computadoras paralelas SIMD se remontan a la década de 1970. La motivación detrás de las primeras computadoras SIMD fue amortizar el retardo de puerta de la unidad de control del procesador en múltiples instrucciones. [ 84 ] En 1964, Slotnick propuso construir una computadora masivamente paralela para el Laboratorio Nacional Lawrence Livermore . [ 82 ] Su diseño fue financiado por la Fuerza Aérea de los EE. UU. , que fue el primer esfuerzo de computación paralela SIMD, ILLIAC IV . [ 82 ] La clave de su diseño fue un paralelismo bastante alto, con hasta 256  procesadores, lo que permitió a la máquina trabajar con grandes conjuntos de datos en lo que más tarde se conocería como procesamiento vectorial . Sin embargo, ILLIAC IV fue llamada "la más infame de las supercomputadoras", porque el proyecto solo se completó en una cuarta parte, pero tomó 11  años y costó casi cuatro veces la estimación original. [ 74 ] Cuando finalmente estuvo lista para ejecutar su primera aplicación real en 1976, fue superada por supercomputadoras comerciales existentes como la Cray-1 .

El cerebro biológico como computadora masivamente paralela

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 masivamente paralela . En 1986, Minsky publicó * La Sociedad de la Mente* , donde afirma que "la mente se forma a partir de muchos pequeños agentes, cada uno sin mente propia". [ 85 ] La teoría intenta explicar cómo lo que llamamos inteligencia podría ser producto de la interacción de partes no inteligentes. Minsky afirma que la principal fuente de ideas para la teoría provino de su trabajo en la creación de una máquina que utiliza un brazo robótico, una cámara de video y una computadora para construir con bloques infantiles. [ 86 ]

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

Véase también

Referencias

  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 et al. (noviembre de 2008). "Investigación en computación paralela en Illinois: La agenda de 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 obtener estas ventajas de rendimiento —mayor frecuencia de reloj y arquitecturas más inteligentes pero cada vez más complejas— están llegando al llamado límite de potencia. La industria informática ha aceptado que los futuros aumentos de rendimiento deben provenir en gran medida de incrementar el número de procesadores (o núcleos) en un chip, en lugar de hacer que un solo núcleo funcione más rápido".
  3. Asanovic et al. Antigua [sabiduría convencional]: La energía es gratis, pero los transistores son caros. 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 perspectiva desde Berkeley" (PDF). Universidad de California, Berkeley. Informe técnico n.° UCB/EECS-2006-183. "Antigua [sabiduría convencional]: aumentar la frecuencia de reloj es el método principal para mejorar el rendimiento del procesador. Nueva [sabiduría convencional]: aumentar el paralelismo es el método principal para mejorar el rendimiento del procesador... Incluso representantes de Intel, una empresa generalmente asociada con la postura de que 'a mayor velocidad de reloj, mejor', advirtieron que los enfoques tradicionales para maximizar el rendimiento mediante la maximización de la velocidad de reloj han llegado a sus límites."
  5. Programación paralela y concurrente en Haskell . O'Reilly Media. 2013. ISBN 9781449335922.
  6. Hennessy, John L .; Patterson, David A .; Larus, James R. (1999). Organización y diseño de computadoras: la interfaz hardware/software (2.ª ed., 3.ª reimpresión ). San Francisco: Kaufmann. ISBN  978-1-55860-428-5.
  7. 1 2 Barney, Blaise. "Introducción a la computación paralela" . Laboratorio Nacional Lawrence Livermore . Recuperado el 9 de noviembre de 2007 .
  8. Thomas Rauber; Gudula Rünger (2013). Programación paralela: para sistemas multinúcleo y en clúster . Springer Science & Business Media. pág. 1. ISBN  9783642378010.
  9. Hennessy, John L.; Patterson, David A. (2002). Arquitectura de computadoras / un enfoque cuantitativo (3.ª ed.). San Francisco, California: International Thomson. pág. 43. ISBN   978-1-55860-724-8.
  10. Rabaey, Jan M. (1996). Circuitos integrados digitales : una perspectiva de diseño . Upper Saddle River, NJ: Prentice-Hall. pág. 235. ISBN   978-0-13-178609-7.
  11. 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 .
  12. Thomas Rauber; Gudula Rünger (2013). Programación paralela: para sistemas multinúcleo y en clúster . Springer Science & Business Media. pág. 2. ISBN  9783642378010.
  13. Thomas Rauber; Gudula Rünger (2013). Programación paralela: para sistemas multinúcleo y en clúster . Springer Science & Business Media. pág. 3. ISBN  9783642378010.
  14. Bakos, Jason D. (2016-01-01), Bakos, Jason D. (ed.), "Capítulo 2 - Multicore y optimización a nivel de datos: OpenMP y SIMD" , Embedded Systems , Boston: Morgan Kaufmann, pp. 49–103 , doi : 10.1016/b978-0-12-800342-8.00002-x , ISBN  978-0-12-800342-8, consultado el 18 de noviembre de 2024{{citation}}: CS1 mantenimiento: parámetro de trabajo con ISBN ( enlace )
  15. El arte de la programación multiprocesador, reimpresión revisada . Morgan Kaufmann. 22 de mayo de 2012. ISBN 9780123973375.
  16. ^ Vajda, András (10 de junio de 2011). Programación de chips de muchos núcleos . Saltador. ISBN 9781441997395.
  17. Amdahl, Gene M. (18 de abril de 1967). «Validez del enfoque de procesador único para lograr capacidades de computación a gran escala» . Actas de la conferencia conjunta de computación de primavera del 18 al 20 de abril de 1967 - AFIPS '67 (Primavera) . Nueva York, NY, EE. UU.: Association for Computing Machinery. págs. 483–485 . doi : 10.1145/1465482.1465560 . ISBN  978-1-4503-7895-6.
  18. Arquitectura de computadoras: un enfoque cuantitativo . Morgan Kaufmann. 2003. ISBN 978-8178672663.
  19. Arquitectura de computadoras paralelas: un enfoque de hardware/software . Elsevier Science. 1999. ISBN 9781558603431.
  20. McCool, Michael; Reinders, James; Robison, Arch (2013). Programación paralela estructurada: patrones para una computación eficiente . Elsevier. pág. 61. ISBN  978-0-12-415993-8.
  21. Gunther, Neil (2007). Planificación de capacidad guerrillera: un enfoque táctico para la planificación de aplicaciones y servicios altamente escalables . ISBN 978-3540261384.
  22. Bernstein, Arthur J. (1 de octubre de 1966). "Análisis de programas para procesamiento paralelo". IEEE Transactions on Electronic Computers . EC-15 (5): 757– 763. Bibcode : 1966ITECm..15..757B . doi : 10.1109/PGEC.1966.264565 .
  23. Roosta, Seyed H. (2000). Procesamiento paralelo y algoritmos paralelos : teoría y computación . Nueva York, NY [ua]: Springer. pág. 114. ISBN   978-0-387-98716-3.
  24. "Procesos e hilos" . Microsoft Developer Network . Microsoft Corp. 2018. Consultado el 10 de mayo de 2018 .
  25. Krauss, Kirk J (2018). "Seguridad de roscas para el rendimiento" . Develop for Performance . Archivado del original el 13 de mayo de 2018. Recuperado el 10 de mayo de 2018 .
  26. Tanenbaum, Andrew S. (1 de febrero de 2002). Introducción a los interbloqueos del sistema operativo . Pearson Education, Informit . Recuperado el 10 de mayo de 2018 .
  27. Cecil, David (2015-11-03). "Aspectos internos de la sincronización : el semáforo" . Embedded . AspenCore . Recuperado el 2018-05-10 .
  28. Preshing, Jeff (2012-06-08). "Una introducción a la programación sin bloqueo" . Preshing on Programming . Recuperado el 2018-05-10 .
  29. "¿Cuál es el opuesto de "paralelo vergonzoso"?" . StackOverflow . Consultado el 10 de mayo de 2018 .
  30. Schwartz, David (15 de agosto de 2011). "¿Qué es la contención de hilos?" . StackOverflow . Consultado el 10 de mayo de 2018 .
  31. Kukanov, Alexey (2008-03-04). "Por qué una prueba simple puede provocar una ralentización paralela" . Recuperado el 15 de febrero de 2015 .
  32. Krauss, Kirk J (2018). "Threading for Performance" . Develop for Performance . Archivado del original el 13 de mayo de 2018. Recuperado el 10 de mayo de 2018 .
  33. Flynn, Michael J. (septiembre de 1972). "Algunas organizaciones informáticas y su eficacia" (PDF) . IEEE Transactions on Computers . C-21 (9): 948–960 . doi : 10.1109/TC.1972.5009071 .
  34. Patterson y Hennessy, pág. 748.
  35. Silberschatz, Abraham; Galvin, Peter B.; Gagne, Greg (29 de julio de 2008). Conceptos de sistemas operativos . Wiley. ISBN 978-0470128725.
  36. Organización y diseño de computadoras, edición MIPS: La interfaz hardware/software (Serie Morgan Kaufmann de arquitectura y diseño de computadoras) . Morgan Kaufmann. 2013. ISBN 978-0124077263.
  37. Programación paralela: técnicas y aplicaciones con estaciones de trabajo en red y ordenadores paralelos . Pearson. 2005. ISBN 978-0131405639.
  38. ^ Singh, David Culler; JP (1997). Arquitectura informática paralela ([Nachdr.] ed.). San Francisco: Morgan Kaufmann Publ. pag. 15.ISBN   978-1-55860-343-1.{{cite book}}: CS1 maint: varios nombres: lista de autores ( enlace )
  39. Culler et al. pág. 15.
  40. Patt, Yale (abril de 2004). " El microprocesador dentro de diez años: ¿Cuáles son los desafíos y cómo los afrontamos?". Archivado el 14 de abril de 2008 en Wayback Machine (wmv). Charla de conferenciante distinguido en la Universidad Carnegie Mellon . Consultado el 7 de noviembre de 2007.
  41. Culler et al. pág. 124.
  42. Culler et al. pág. 125.
  43. Samuel Larsen; Saman Amarasinghe. "Aprovechamiento del paralelismo a nivel de superpalabra con conjuntos de instrucciones multimedia" (PDF) .
  44. 1 2 Patterson y Hennessy, pág. 713.
  45. 1 2 Hennessy y Patterson, pág. 549.
  46. Patterson y Hennessy, pág. 714.
  47. Ghosh, Sukumar (2007). Sistemas distribuidos: un enfoque algorítmico . Chapman & Hall/CRC. pág. 10. ISBN  978-1-58488-564-1.
  48. Keidar, Idit (2008). "Columna 32 sobre computación distribuida: resumen del año" . ACM SIGACT News . 39 (4): 53– 54. CiteSeerX 10.1.1.116.1285 . doi : 10.1145/1466390.1466402 . S2CID 7607391. Archivado del original el 16 de enero de 2014. Consultado el 20 de agosto de 2009 .  
  49. Lynch, Nancy A. (1996), Algoritmos distribuidos , Morgan Kaufmann , págs. 1-2, ISBN  978-1-55860-348-6
  50. Peleg, David (2000). Computación distribuida: un enfoque sensible a la localidad . SIAM . pág. 1. ISBN  978-0-89871-464-7Archivado del original el 6 de agosto de 2009. Consultado el 16 de julio de 2009 .
  51. ¿Qué es la agrupación en clústeres? Diccionario informático de Webopedia. Consultado el 7 de noviembre de 2007.
  52. Definición de Beowulf. Archivado el 10 de octubre de 2012 en Wayback Machine PC Magazine . Consultado el 7 de noviembre de 2007.
  53. "Estadísticas de la lista | TOP500 Sitios de supercomputadoras" . www.top500.org . Consultado el 5 de agosto de 2018 .
  54. "Interconexión" Archivado el 28/01/2015 en Wayback Machine .
  55. Hennessy y Patterson, pág. 537.
  56. Definición de MPP. Archivado el 11 de mayo de 2013 en Wayback Machine PC Magazine . Consultado el 7 de noviembre de 2007.
  57. Kirkpatrick, Scott (2003). "CIENCIAS DE LA COMPUTACIÓN: Tiempos difíciles por delante". Science . 299 ( 5607): 668– 669. doi : 10.1126/science.1081623 . PMID 12560537. S2CID 60622095 .  
  58. Hellings, Jelle; Sadoghi, Mohammad (2021). "Cerberus: Procesamiento de transacciones minimalista multi-fragmento resistente a la manipulación bizantina" (PDF) . Actas de la Fundación VLDB . 14 (11): 2230– 2243. arXiv : 2202.04522 . doi : 10.14778/3476249.3476274 .
  59. Valueva, Maria; Valuev, Georgii; Semyonova, Nataliya; Lyakhov, Pavel; Chervyakov, Nikolay; Kaplun, Dmitry; Bogaevskiy, Danil (2019-06-20). "Construcción de un sistema de numeración de residuos utilizando una función diagonal eficiente en hardware" . Electronics . 8 (6): 694. doi : 10.3390/electronics8060694 . ISSN 2079-9292 . Todos los circuitos simulados se describieron en lenguaje de descripción de hardware (VHDL) para circuitos integrados de muy alta velocidad (VHSIC). El modelado de hardware se realizó en una FPGA Xilinx Artix 7 xc7a200tfbg484-2. 
  60. Gupta, Ankit; Suneja, Kriti (mayo de 2020). «Diseño de hardware de un multiplicador de matrices aproximado basado en FPGA en Verilog». 4.ª Conferencia Internacional sobre Sistemas Inteligentes de Computación y Control (ICICCS) de 2020. Madurai, India: IEEE. págs. 496–498 . doi : 10.1109/ICICCS48265.2020.9121004 . ISBN  978-1-7281-4876-2. S2CID 219990653 . 
  61. 1 2 3 D'Amour, Michael R., Director de Operaciones, DRC Computer Corporation. "Computación reconfigurable estándar". Ponente invitado en la Universidad de Delaware, 28 de febrero de 2007.
  62. Boggan, Sha'Kia y Daniel M. Pressel (agosto de 2007). GPU: una plataforma emergente para la computación de propósito general (PDF). ARL-SR-154, Laboratorio de Investigación del Ejército de los EE. UU. Consultado el 7 de noviembre de 2007.
  63. Maslennikov, Oleg (2002). "Generación sistemática de programas ejecutables para elementos de procesador en sistemas paralelos basados ​​en ASIC o FPGA y su transformación en descripciones VHDL de unidades de control de elementos de procesador". Lecture Notes in Computer Science , 2328/2002: p. 272.
  64. Shimokawa, Y.; Fuwa, Y.; Aramaki, N. (18–21 de noviembre de 1991). «Un neuroordenador VLSI ASIC paralelo para un gran número de neuronas y una velocidad de mil millones de conexiones por segundo». [ Actas ] Conferencia Internacional Conjunta IEEE de 1991 sobre Redes Neuronales . Vol. 3. págs. 2162–2167 . doi : 10.1109/IJCNN.1991.170708 . ISBN   978-0-7803-0227-3. S2CID 61094111 . 
  65. Acken, Kevin P.; Irwin, Mary Jane; Owens, Robert M. (julio de 1998). "Una arquitectura ASIC paralela para la codificación eficiente de imágenes fractales". The Journal of VLSI Signal Processing . 19 (2): 97– 113. Bibcode : 1998JSPSy..19...97A . doi : 10.1023/A:1008005616596 . S2CID 2976028 . 
  66. Kahng, Andrew B. (21 de junio de 2004) " Análisis del problema del DFM en la industria de semiconductores. Archivado el 31 de enero de 2008 en Wayback Machine ". Universidad de California, San Diego. "La futura tecnología de diseño para la fabricación (DFM) debe reducir el costo del diseño [gastos no recuperables] y abordar directamente los [gastos no recuperables] de fabricación: el costo de un juego de máscaras y una tarjeta de sonda, que supera el millón de dólares en el nodo tecnológico de 90 nm y supone un freno significativo para la innovación basada en semiconductores".
  67. 1 2 Patterson y Hennessy, pág. 751.
  68. El premio Sidney Fernbach otorgado al inventor de MPI, Bill Gropp (archivado el 25/07/2011 en Wayback Machine) , se refiere a MPI como "la interfaz de comunicaciones HPC dominante".
  69. Shen, John Paul; Lipasti, Mikko H. (2004). Diseño de procesadores modernos: fundamentos de los procesadores superescalares (1.ª ed.). Dubuque, Iowa: McGraw-Hill. pág. 561. ISBN   978-0-07-057064-1Sin embargo , el santo grial de esta investigación —la paralelización automatizada de programas en serie— aún no se ha materializado. Si bien se ha demostrado la paralelización automatizada de ciertas clases de algoritmos, este éxito se ha limitado en gran medida a aplicaciones científicas y numéricas con control de flujo predecible (por ejemplo, estructuras de bucles anidados con recuentos de iteraciones determinados estáticamente) y patrones de acceso a memoria analizables estáticamente (por ejemplo, recorridos sobre grandes matrices multidimensionales de datos de punto flotante).
  70. Enciclopedia de Computación Paralela, Volumen 4 por David Padua 2011 ISBN 0387097651página 265
  71. Asanovic, Krste , et al. (18 de diciembre de 2006). «El panorama de la investigación en computación paralela: una perspectiva desde Berkeley» (PDF). Universidad de California, Berkeley. Informe técnico n.º UCB/EECS-2006-183. Véase la tabla en las páginas 17-19.
  72. David R., Helman; David A., Bader; JaJa, Joseph (1998). "Un algoritmo de ordenación paralela aleatoria con un estudio experimental" (PDF) . Journal of Parallel and Distributed Computing . 52 : 1–23 . doi : 10.1006/jpdc.1998.1462 . hdl : 1903/835 . Archivado del original (PDF) el 19 de noviembre de 2012. Recuperado el 26 de octubre de 2012 .
  73. Dobel, B., Hartig, H., & Engel, M. (2012) "Soporte del sistema operativo para multihilo redundante". Actas de la Décima Conferencia Internacional ACM sobre Software Embebido , 83–92. doi : 10.1145/2380356.2380375
  74. 1 2 Patterson y Hennessy, págs. 749-750: «Aunque logró impulsar varias tecnologías útiles en proyectos posteriores, el ILLIAC IV fracasó como supercomputadora. Los costos se dispararon desde los 8 millones de dólares estimados en 1966 hasta los 31 millones de dólares en 1972, a pesar de que solo se construyó una cuarta parte de la máquina planificada . Fue quizás la supercomputadora más infame. El proyecto comenzó en 1965 y ejecutó su primera aplicación real en 1976».
  75. Menabrea, LF (1842). Bosquejo de la máquina analítica inventada por Charles Babbage . Bibliothèque Universelle de Genève. Recuperado el 7 de noviembre de 2007. Cita: «Cuando se debe realizar una larga serie de cálculos idénticos, como los necesarios para la formación de tablas numéricas, la máquina puede utilizarse para dar varios resultados al mismo tiempo, lo que acortará considerablemente la cantidad total de procesos».
  76. 1 2 Patterson y Hennessy, pág. 753.
  77. RW Hockney, CR Jesshope. Computadoras paralelas 2: Arquitectura, programación y algoritmos, Volumen 2. 1988. pág. 8 cita: "Se cree que la primera referencia al paralelismo en el diseño de computadoras se encuentra en la publicación del general LF Menabrea en… 1842, titulada Bosquejo de la máquina analítica inventada por Charles Babbage ".
  78. Bataille, M. (1972-04-01). "Algo viejo: la Gamma 60, la computadora que se adelantó a su tiempo" . ACM SIGARCH Computer Architecture News . 1 (2): 10– 15. doi : 10.1145/641276.641278 . ISSN 0163-5964 . S2CID 34642285 .  
  79. "Boceto arquitectónico de Bull Gamma 60 - Mark Smotherman" . www.feb-patrimoine.com . Consultado el 14 de agosto de 2023 .
  80. Tumlin, Smotherman (14 de agosto de 2023). "Una evaluación del diseño de la Gamma 60" . Museo de Historia de la Computación ACONIT . Departamento de Ciencias de la Computación, Universidad de Clemson . Recuperado el 14 de agosto de 2023 .
  81. "Programación paralela", S. Gill, The Computer Journal Vol. 1 #1, pp2-10, British Computer Society, abril de 1958.
  82. 1 2 3 4 5 Wilson, Gregory V. (1994). "La historia del desarrollo de la computación paralela" . Virginia Tech/Universidad Estatal de Norfolk, Aprendizaje interactivo con una biblioteca digital en ciencias de la computación . Recuperado el 8 de enero de 2008 .
  83. Anthes, Gry (19 de noviembre de 2001). "El poder del paralelismo" . Computerworld . Archivado del original el 31 de enero de 2008. Consultado el 8 de enero de 2008 .
  84. Patterson y Hennessy, pág. 749.
  85. Minsky, Marvin (1986). La sociedad de la mente . Nueva York: Simon & Schuster. 17 págs . ISBN  978-0-671-60740-1.
  86. Minsky, Marvin (1986). La sociedad de la mente . Nueva York: Simon & Schuster. 29 págs . ISBN  978-0-671-60740-1.
  87. Blakeslee, Thomas (1996). Más allá de la mente consciente. Desvelando los secretos del yo . Springer. págs. 6–7 . ISBN  9780306452628.
  88. Gazzaniga, Michael ; LeDoux, Joseph (1978). La mente integrada . págs. 132–161 . 
  89. Gazzaniga, Michael (1985). El cerebro social. Descubriendo las redes de la mente . Basic Books. págs. 77–79 . ISBN  9780465078509.
  90. Ornstein, Robert (1992). Evolución de la conciencia: Los orígenes de nuestra forma de pensar . págs. 2 . 
  91. 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.
  92. 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.
  93. Kaku, Michio (2014). El futuro de la mente .
  94. Ouspenskii, Pyotr (1992). «Capítulo 3». En busca de lo milagroso. Fragmentos de una enseñanza desconocida . págs. 72–83 . 
  95. "Sitio web oficial del modelo cerebral Neurocluster" . Consultado el 22 de julio de 2017 .

Lecturas adicionales

  • Rodríguez, C.; Villagra, M.; Baran, B. (29 de agosto de 2008). "Algoritmos de equipo asíncronos para la satisfacibilidad booleana". 2007 2nd Bio-Inspired Models of Network, Information and Computing Systems . pp. 66– 69. doi : 10.1109/BIMNICS.2007.4610083 . S2CID 15185219 .  
  • Sechin, A.; Computación paralela en fotogrametría. GIM International. N.° 1, 2016, págs.  21–23.
  • 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 en Internet