La computación paralela, Fondo, Tipos de paralelismo, Hardware, Software, Métodos algorítmicos, Historia


La computación paralela es una forma de cálculo en la que se llevan a cabo de forma simultánea muchos cálculos, que opera sobre el principio de que grandes problemas a menudo se pueden dividir en los más pequeños, que luego se resuelven simultáneamente. Hay varias formas diferentes de la computación paralela: a nivel de bits, nivel de instrucción, los datos y paralelismo de tareas. El paralelismo se ha empleado durante muchos años, sobre todo en la computación de alto rendimiento, pero el interés en ella ha crecido últimamente debido a las limitaciones físicas que impiden el ajuste de frecuencia. Como el consumo de energía por las computadoras se ha convertido en una preocupación en los últimos años, la computación paralela se ha convertido en el paradigma dominante en la arquitectura de computadores, principalmente en forma de procesadores multinúcleo.

Computadoras paralelas se pueden clasificar más o menos de acuerdo con el nivel en el que el hardware admite paralelismo con los ordenadores de varios núcleos y varios procesadores con múltiples elementos de procesamiento en una sola máquina, mientras que las agrupaciones, MPP y redes utilizan varios equipos a trabajar en el mismo tarea. Arquitecturas informáticas paralelas especializadas se utilizan a veces junto con los procesadores tradicionales, para acelerar las tareas específicas.

Programas informáticos paralelos son más difíciles de escribir que los secuenciales, debido a la concurrencia introduce varias nuevas clases de los posibles errores de software, de los cuales las condiciones de carrera son los más comunes. Comunicación y sincronización entre las diferentes subtareas suelen ser algunos de los más grandes obstáculos para conseguir un buen rendimiento de los programas paralelos.

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

Fondo

Tradicionalmente, los programas informáticos se ha escrito para el cómputo serial. Para resolver un problema, un algoritmo se construye y se implementa como un flujo en serie de instrucciones. Estas instrucciones se ejecutan en una unidad central de procesamiento de una computadora. Sólo una instrucción puede ejecutar a la vez-una vez terminada esa instrucción, el siguiente se ejecuta.

La computación paralela, por otra parte, utiliza múltiples elementos de proceso al mismo tiempo para resolver un problema. Esto se logra mediante la ruptura del problema en partes independientes de modo que cada elemento de procesamiento puede ejecutar su parte del algoritmo de forma simultánea con los otros. Los elementos de procesamiento pueden ser diversas e incluyen recursos como un solo equipo con varios procesadores, varios ordenadores en red, hardware especializado, o cualquier combinación de los anteriores.

Escalado de la frecuencia fue la razón dominante para mejoras en el rendimiento del equipo desde mediados de 1980 hasta 2004 - El tiempo de ejecución de un programa es igual al número de instrucciones multiplicado por el promedio de tiempo por instrucción. Manteniendo todo lo demás constante, el aumento de la frecuencia de reloj se reduce el tiempo medio que se tarda en ejecutar una instrucción. Un aumento en la frecuencia de este modo disminuye tiempo de ejecución para todos los programas de cómputo de ruedas.

Sin embargo, el consumo de energía por un chip está dada por la ecuación P = C V2 F, donde P es el poder, C es la capacidad de ser conmutada por ciclo de reloj, V es el voltaje, y F es la frecuencia del procesador. Los aumentos en la frecuencia aumentan la cantidad de energía utilizada en un procesador. El aumento del consumo de energía del procesador en última instancia condujo a mayo de cancelación de sus Tejas y procesadores Jayhawk, que generalmente se citan como el final de la escala de frecuencia como el paradigma dominante de la arquitectura de computadores Intel 2004.

La Ley de Moore es la observación empírica de que la densidad de los transistores en un microprocesador se duplica cada 18 a 24 meses. A pesar de los problemas de consumo de energía, y las predicciones repetidas de su fin, la ley de Moore sigue vigente. Con el final de la calibración de la frecuencia, estos transistores adicionales se pueden utilizar para añadir hardware adicional para la computación en paralelo.

La ley de Amdahl y la ley de Gustafson

En condiciones óptimas, la aceleración de la puesta en paralelo sería lineal duplicar el número de elementos de procesamiento debe reducir a la mitad el tiempo de ejecución, y doblando por segunda vez debería volver a reducir a la mitad el tiempo de ejecución. Sin embargo, muy pocos algoritmos paralelos lograr una óptima acelerar. La mayoría de ellos tienen una casi lineal de aceleración para un pequeño número de elementos de procesamiento, que se aplana en un valor constante para un gran número de elementos de procesamiento.

El potencial de aceleración de un algoritmo en una plataforma de computación en paralelo viene dada por la ley de Amdahl, formulada originalmente por Gene Amdahl en 1960. Se afirma que una pequeña porción del programa que no se puede paralelizar limitará la velocidad en marcha total disponible de paralelización. Un programa de la solución de un gran problema matemático o de ingeniería consistirá típicamente en varias partes paralelizables y varias piezas no paralelizables. Si es la fracción de tiempo en marcha un programa gasta en partes no paralelizables, a continuación,

es la aceleración máxima con paralelización del programa. Si la parte secuencial de un programa representa el 10% del tiempo de ejecución, se puede obtener no más de un 10 speed-up, independientemente del número de procesadores se añaden. 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 por limitaciones secuenciales, la aplicación de un mayor esfuerzo no tiene ningún efecto en el calendario. El rodamiento de un niño lleva nueve meses sin importar cuántas mujeres están asignados."

La ley de Gustafson es otra ley en informática, en estrecha relación con la ley de Amdahl. Afirma que el aumento de velocidad de los procesadores es

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

Dependencias

Comprender los datos dependencias es fundamental en la implementación de algoritmos paralelos. Ningún programa puede correr más rápido que la cadena más larga de los cálculos dependientes, ya que los cálculos que dependen de cálculos anteriores de la cadena deben ser ejecutados en orden. Sin embargo, la mayoría de los algoritmos no sólo consisten en una larga cadena de cálculos dependientes; por lo general hay oportunidades para ejecutar cálculos independientes en paralelo.

Deje Pi y Pj sean dos segmentos del programa. Condiciones de Bernstein describe cuando los dos son independientes y se pueden ejecutar en paralelo. Para Pi, vamos Ii ser todas las variables de entrada y Oi variables de la salida, y lo mismo para Pj. Pi y Pj son independientes si cumplen

La violación de la primera condición introduce una dependencia de flujo, correspondiente al primer segmento producir un resultado utilizado por el segundo segmento. La segunda condición representa un anti-dependencia, cuando el segundo segmento produce una variable que necesita 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 de la lógica último segmento ejecutado.

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

 1: La función Dep 2: c: = ab 3: d: = 3c 4: fin de la función

Operación 3 en Dep. no puede ser ejecutada antes de la operación 2, porque la operación 3 utiliza un resultado de la operación 2 - Viola condición 1, y por lo tanto presenta una dependencia de flujo.

 1: La función NoDep 2: c: = ab 3: d: = 3b 4: e: = a b 5: fin de la función

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

Condiciones Bernstein no permiten que la memoria se comparte entre diferentes procesos. Para ello, es necesario algún medio de hacer cumplir una orden entre los accesos, tales como semáforos, barreras o algún otro método de sincronización.

Las condiciones de carrera, la exclusión mutua, la sincronización, y la desaceleración paralela

Subtareas en un programa paralelo a menudo son llamados hilos. Algunas arquitecturas informáticas paralelas utilizan pequeños, versiones ligeras de temas conocidos como fibras, mientras que otros utilizan versiones más grandes conocidos como procesos. Sin embargo, los "hilos" es generalmente aceptado como un término genérico para las subtareas. Temas a menudo tendrá que actualizar alguna variable que se comparte entre ellos. Las instrucciones entre los dos programas se pueden intercalar en cualquier orden. Por ejemplo, considere el siguiente programa:

Si la instrucción se ejecuta entre 1B 1A y 3A, o si la instrucción se ejecuta entre 1A 1B y 3B, el programa producirá datos incorrectos. Esto se conoce como una condición de carrera. El programador tiene que utilizar una cerradura para proporcionar la exclusión mutua. Un bloqueo es una construcción del lenguaje de programación que permite a un hilo para tomar el control de una variable y evitar otros temas de la lectura o la escritura, hasta que se desbloquee esa variable. El hilo que mantiene el bloqueo es libre de ejecutar su sección crítica, y para desbloquear los datos cuando esté terminado. Por lo tanto, para garantizar la correcta ejecución del programa, el programa anterior puede ser reescrito para utilizar bloqueos:

Un hilo se bloquea con éxito variable de V, mientras que el otro hilo se bloqueará-no puede proceder hasta que V se abre de nuevo. Esto garantiza la correcta ejecución del programa. Cerraduras, si bien es necesaria para garantizar la ejecución del programa correcta, pueden reducir en gran medida un programa.

Bloqueo de múltiples variables con las cerraduras no atómicas introduce la posibilidad de bloqueo del programa. Un bloqueo atómica encierra múltiples variables a la vez. Si no puede bloquear todos ellos, no se bloquea ninguna de ellas. Si dos hilos cada uno necesitan para bloquear las mismas dos variables utilizando cerraduras no atómicas, es posible que un hilo se bloquea uno de ellos y el segundo hilo se bloqueará la segunda variable. En tal caso, ni el hilo puede completar, y los resultados de interbloqueo.

Muchos programas paralelos requieren que sus subtareas actúan en sincronía. Esto requiere el uso de una barrera barreras se implementa típicamente usando un bloqueo de software. Una clase de algoritmos, conocida como algoritmos libres de bloqueo y de espera libre, 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.

No todos los resultados de paralelización en aceleración. Por lo general, como una tarea se divide en más y más temas, los temas pasan una porción cada vez mayor de su tiempo a comunicarse entre sí. Con el tiempo, la sobrecarga de la comunicación domina el tiempo empleado para resolver el problema, y aún más paralelización aumenta más que disminuye la cantidad de tiempo requerido para terminar. Esto se conoce como desaceleración paralelo.

De grano fino de grano grueso, y el paralelismo, vergonzoso

Las aplicaciones se clasifican a menudo de acuerdo con la frecuencia con sus subtareas necesitan para sincronizar o comunicarse entre sí. Una aplicación muestra el paralelismo de grano fino si sus subtareas deben comunicarse varias veces por segundo, sino que muestra el paralelismo de grano grueso, si no se comunican muchas veces por segundo, y es vergonzosamente paralelas si nunca o casi nunca tienen que comunicar. Aplicaciones embarazosamente paralelos son considerados los más fáciles de poner en paralelo.

Modelos de consistencia

Lenguajes de programación en paralelo y computadoras paralelas deben tener un modelo de consistencia. El modelo de consistencia define reglas sobre cómo se producen las operaciones en la memoria del ordenador y cómo se producen resultados.

Uno de los primeros modelos de consistencia fue modelo de consistencia secuencial de Leslie Lamport. Consistencia secuencial es propiedad de un programa paralelo que su ejecución en paralelo produce los mismos resultados que un programa secuencial. En concreto, un programa es secuencial consistente si "... los resultados de cualquier ejecución es el mismo que si las operaciones de todos los procesadores se ejecutan en un orden secuencial, y las operaciones de cada procesador individual aparecen en esta secuencia en el orden especificado por su programa ".

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

Matemáticamente, estos modelos pueden representarse de varias maneras. Redes de Petri, que se introdujo en 1962 la tesis doctoral de Carl Adam Petri, fueron un primer intento de codificar las normas de los modelos de consistencia. Teoría de flujo de datos más tarde construyó sobre estos, y las arquitecturas de flujo de datos se creó para poner en práctica físicamente las ideas de la teoría de flujo de datos. A partir de finales de 1970, los cálculos de proceso, tales como el cálculo de Comunicación y Sistemas de Comunicación Procesos secuenciales fueron desarrollados para permitir el razonamiento algebraico sobre los sistemas integrados por componentes que interactúan. Más adiciones recientes a la familia proceso de cálculo, tales como el p-cálculo, se han añadido la capacidad para razonar acerca de topologías dinámico. Lógicas tales como de Lamport TLA , y modelos matemáticos, tales como huellas y diagramas de eventos Actor, también se han desarrollado para describir el comportamiento de sistemas concurrentes.

Taxonomía de Flynn

Michael J. Flynn creó uno de los primeros sistemas de clasificación para los equipos y los programas paralelos, ahora conocida como la taxonomía de Flynn. Flynn programas y computadoras clasificarse según si estaban operando con un solo conjunto o varios conjuntos de instrucciones, si esas instrucciones estaban utilizando una o varias series de datos.

 editar

La clasificación-instrucción-única-de datos único es equivalente a un programa totalmente secuencial. La clasificación, instrucción, múltiples datos solo es análogo a hacer la misma operación varias veces sobre un conjunto de datos grande. Esto se hace comúnmente en aplicaciones de procesamiento de señales. -Datos de múltiples instrucciones de un solo es una clasificación rara vez se utiliza. Mientras arquitecturas informáticas para hacer frente a esto se ideó, pocas aplicaciones que se ajustan a esta clase se materializaron. Programas de instrucción, datos múltiples múltiple son, con mucho, el tipo más común de los 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 da una buena primera aproximación. Es también- tal vez por su comprensibilidad, el esquema más utilizado ".

Tipos de paralelismo

Paralelismo Bit,

Desde el advenimiento de la tecnología de fabricación de chips de computadora integración a gran escala muy en la década de 1970 hasta alrededor de 1986, la velocidad en la arquitectura de computadores fue impulsado por doble palabra computadora del tamaño, la cantidad de información que el procesador puede manipular por ciclo. El aumento del tamaño de la palabra se reduce el número de instrucciones del procesador debe ejecutar para llevar a cabo una operación en variables cuyos tamaños son mayores que la longitud de la palabra. Por ejemplo, en un procesador de 8 bits debe agregar dos enteros de 16 bits, el procesador debe agregar primero los 8 bits de orden inferior de cada número entero con la instrucción de adición de patrón, a continuación, añadir los 8 bits de orden superior utilizando un complemento de -llevar a la instrucción y el bit de acarreo de la adición de orden inferior; por lo tanto, un procesador de 8 bits requiere dos instrucciones para completar una sola operación, en donde un procesador de 16 bits sería capaz de completar la operación con una sola instrucción.

Históricamente, los microprocesadores de 4 bits fueron reemplazados con 8 bits, a continuación, 16 bits, a continuación, microprocesadores de 32 bits. Esta tendencia general, llegó a su fin con la introducción de los procesadores de 32 bits, lo que ha sido un estándar en la informática de uso general durante dos décadas. No hasta hace poco, con el advenimiento de las arquitecturas x86-64, han procesadores de 64 bits convertido en algo común.

Paralelismo a nivel de instrucción

Un programa de ordenador es, en esencia, una corriente de instrucciones ejecutadas por un procesador. Estas instrucciones pueden ser reordenadas y se combinan 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 computadores desde mediados de 1980 hasta mediados de la década de 1990.

Los procesadores modernos tienen tuberías de instrucciones de múltiples etapas. Cada etapa en la tubería corresponde a una acción diferente que el procesador lleva a cabo en el que la instrucción en esa etapa; un procesador con una tubería N-etapa puede tener hasta N diferentes instrucciones en diferentes fases de ejecución. El ejemplo canónico de un procesador segmentado es un procesador RISC, con cinco etapas: extracción de instrucción, decodificar, ejecutar, acceso a la memoria, y escribir de nuevo. El procesador Pentium 4 con una cartera de 35 etapas.

Además de paralelismo a nivel de instrucción de la canalización, algunos procesadores pueden emitir más de una instrucción a la vez. Estos son conocidos como procesadores superescalares. Las instrucciones pueden ser agrupados juntos sólo si no hay dependencia de datos entre ellos. Scoreboarding y el algoritmo Tomasulo son dos de las técnicas más comunes para la aplicación de ejecución de órdenes y el paralelismo a nivel de instrucción.

Paralelismo de tareas

Paralelismo de tareas es la característica de un programa paralelo que "completamente diferentes cálculos se pueden realizar en cualquiera de los mismos o diferentes conjuntos de datos". Esto contrasta con paralelismo de datos, donde el mismo cálculo se lleva a cabo en los mismos o diferentes conjuntos de datos. Paralelismo de tareas por lo general no escala con el tamaño de un problema.

Hardware

La memoria y la comunicación

La memoria principal de una computadora paralela o bien se comparte la memoria o la memoria distribuida. Memoria distribuida se refiere al hecho de que la memoria se distribuye lógicamente, pero a menudo implica que se distribuye también físicamente. Distributed memoria compartida y la virtualización de memoria combinan los dos enfoques, donde el elemento de proceso tiene su propia memoria local y el acceso a la memoria en los procesadores que no son locales. Accesos a la memoria local suelen ser más rápido que los accesos a memoria no local.

Arquitecturas de ordenadores en los que se puede acceder a cada elemento de la memoria principal con la misma latencia y ancho de banda son conocidos como sistemas de Memoria de Acceso Uniforme. Por lo general, que se puede lograr sólo por un sistema de memoria compartida, en la que la memoria no se distribuye físicamente. Un sistema que no tenga esta propiedad se conoce como una arquitectura de acceso a memoria no uniforme. Sistemas de memoria distribuida tienen acceso a memoria no uniforme.

Los sistemas informáticos utilizan caches-pequeñas memorias rápidas ubicadas cerca del procesador que almacenan copias temporales de valores de memoria. Sistemas informáticos paralelos tienen dificultades con cachés que pueden almacenar el mismo valor en más de un lugar, con la posibilidad de la ejecución del programa correctos. Estos equipos requieren un sistema de coherencia de caché, que realiza un seguimiento de los valores almacenados en caché y estratégicamente a las purgas, lo que garantiza la ejecución del programa correcto. Snooping autobús es uno de los métodos más comunes para hacer el seguimiento de lo que se está accediendo a los valores. Diseño de sistemas grandes y de alto rendimiento de la caché de coherencia es un problema muy difícil en la arquitectura de computadores. Como resultado, arquitecturas de computadora de memoria compartida no hacen escala, así como los sistemas de memoria distribuida hacer.

Procesador-procesador y la memoria del procesador, la comunicación puede ser implementado en hardware de varias maneras, incluyendo a través de la memoria compartida, un conmutador de barras cruzadas, un bus compartido o una red de interconexión de un gran número de topologías incluyendo estrella, anillo, árbol, hipercubo, grasa hipercubo, o malla n-dimensional.

Ordenadores paralelos basados en redes de interconexión deben tener algún tipo de enrutamiento para permitir el paso de mensajes entre nodos que no están conectados directamente. El medio utilizado para la comunicación entre los procesadores es probable que sea jerárquica en grandes máquinas multiprocesador.

Clases de computadoras paralelas

Ordenadores paralelos se pueden clasificar más o menos de acuerdo con el nivel en el que el hardware soporta paralelismo. Esta clasificación es ampliamente análogo a la distancia entre los nodos básicos de computación. Estos no son mutuamente excluyentes, por ejemplo, grupos de multiprocesadores simétricos son relativamente comunes.

Un procesador multi-núcleo es un procesador que incluye múltiples unidades de ejecución en el mismo chip. Estos procesadores se diferencian de los procesadores superescalares, que pueden emitir múltiples instrucciones por ciclo de un flujo de instrucciones, en cambio, un procesador multinúcleo puede emitir múltiples instrucciones por ciclo de múltiples flujos de instrucciones. Cada núcleo en un procesador multi-núcleo puede ser potencialmente superescalar como es bien que, en cada ciclo, cada núcleo puede emitir varias instrucciones de un flujo de instrucciones.

Multithreading simultáneo era una forma de pseudo-multicoreism. Un procesador con capacidad de multithreading simultáneo sólo tiene una unidad de ejecución, pero cuando esa unidad de ejecución está en punto muerto, se utiliza esa unidad de ejecución para procesar un segundo hilo. Microprocesador célula de IBM, diseñado para su uso en el Sony PlayStation 3, es otro procesador multi-núcleo prominente.

Un multiprocesador simétrico es un sistema informático con múltiples procesadores idénticos que comparten la memoria y se conectan a través de un bus. Contención de bus impide arquitecturas de bus de ampliación. Como resultado, las SMP generalmente no comprenden más de 32 procesadores. "Debido al pequeño tamaño de los procesadores y la reducción significativa de los requisitos de ancho de banda de bus logrado por grandes memorias caché, tales multiprocesadores simétricos son extremadamente rentable, siempre que exista una cantidad suficiente de ancho de banda de la memoria."

Un equipo distribuido es un sistema informático distribuido de memoria en la que los elementos de procesamiento están conectados por una red. Computadoras distribuidas son altamente escalable.

Un clúster es un grupo de ordenadores débilmente acoplados que trabajan en estrecha colaboración, por lo que en algunos aspectos que pueden ser considerados como un solo equipo. Las agrupaciones se componen de múltiples máquinas independientes conectadas por una red. Mientras que las máquinas de un clúster no tienen que ser simétrica, el equilibrio de carga es más difícil, si no lo son. El tipo más común de clúster es el cluster Beowulf, que es un conjunto implementado en múltiples comerciales idénticos de los ordenadores conectados a la plataforma de una red de área local Ethernet TCP/IP. Tecnología Beowulf fue desarrollado originalmente por Thomas Sterling y Donald Becker. La gran mayoría de los superordenadores TOP500 son agrupaciones.

Un procesador masivamente paralelo es una computadora con muchos procesadores de red. MPP tienen muchas de las mismas características que las agrupaciones, pero MPP tienen redes de interconexión especializados. MPP también tienden a ser más grandes que las agrupaciones, que tiene típicamente "mucho más" de 100 procesadores. En un MPP, "cada CPU contiene su propia memoria y copia del sistema operativo y la aplicación. Cada subsistema se comunica con los otros a través de una interconexión de alta velocidad."

Blue Gene/L, el quinto superordenador más rápido del mundo según El número de junio 2009 TOP500 ranking, es un MPP.

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

La mayoría de las aplicaciones informáticas de la red utilizan el middleware, software que se sitúa entre el sistema operativo y la aplicación para gestionar los recursos de red y estandarizar la interfaz de software. El middleware de computación distribuida más común es el de Infraestructura Abierta de Berkeley para Computación en Red. A menudo, el software de computación distribuida que hace uso de "ciclos de repuesto", realizar cálculos, a veces cuando un equipo está funcionando a ralentí.

 Computadoras paralelas Especializados

Dentro de la computación paralela, existen dispositivos paralelos especializados que siguen siendo las áreas de nicho de interés. Si bien no es específica del dominio, que tienden a ser aplicable a sólo unas pocas clases de problemas paralelos.

 Computación reconfigurable con arreglos de compuertas programables en campo

Reconfigurable informática es el uso de una matriz de puertas programable en campo como un co-procesador a un ordenador de propósito general. Un FPGA es, en esencia, un chip de computadora que puede reconfigurarse para una tarea determinada.

FPGAs se pueden programar con lenguajes de descripción de hardware como VHDL o Verilog. Sin embargo, la programación en idiomas puede ser tedioso. Varios fabricantes han creado lenguajes C a HDL que intentan emular a la sintaxis y/o la semántica del lenguaje de programación C, con el que la mayoría de los programadores están familiarizados. El C más conocido a las lenguas son Mitrion HDL-C, Impulse C, DIME-C y Handel-C. Subconjuntos específicos de SystemC basado en C también se puede utilizar para este propósito.

La decisión de AMD para abrir su tecnología HyperTransport a otros proveedores se ha convertido en la tecnología que permite un alto rendimiento en computación reconfigurable. De acuerdo con Michael R. D'Amour, Director de Operaciones de la RDC Computer Corporation ", cuando entramos en AMD, nos llamaron 'los ladrones de socket. Ahora nos llaman a sus parejas ".

Informática de uso general en las unidades de procesamiento gráfico es una tendencia relativamente reciente en la investigación de la ingeniería informática. GPUs son co-procesadores que han sido fuertemente optimizados para el procesamiento de gráficos por ordenador. Procesamiento de gráficos por ordenador es un campo dominado por las operaciones de álgebra matricial operaciones, particularmente lineales paralelas de datos.

En los primeros días, los programas de GPGPU utilizan las APIs de gráficos normal para la ejecución de programas. Sin embargo, varios lenguajes de programación y plataformas nuevas se han construido para hacer computación de propósito general de GPUs tanto con la liberación entornos de programación con CUDA y AMD Stream SDK Nvidia y respectivamente. Otros lenguajes de programación GPU incluyen BrookGPU, PeakStream y RapidMind. Nvidia también ha lanzado productos específicos para el cálculo de su serie Tesla. El consorcio tecnológico Khronos Group ha lanzado la especificación OpenCL, que es un marco para los programas que se ejecutan a través de plataformas consistentes en CPUs y GPUs escritura. AMD, Apple, Intel, Nvidia y otros están apoyando OpenCL.

Varios enfoques de circuitos integrados específicos de la aplicación se han ideado para hacer frente a las aplicaciones paralelas.

Debido a que un ASIC es específica para una aplicación dada, puede ser totalmente optimizado para esa aplicación. Como resultado, para una aplicación dada, un ASIC tiende a superar a un ordenador de propósito general. Sin embargo, ASIC se crean por la litografía de rayos-X. Este proceso requiere una máscara, que puede ser extremadamente caro. Una sola máscara puede costar más de un millón de dólares. Mientras tanto, aumenta el rendimiento en la computación de propósito general con el tiempo tienden a acabar con estas ganancias en sólo una o dos generaciones de chips. Alto costo inicial, y la tendencia a ser superada por la computación de propósito general Moore's-ley-conducido, ha rendido ASICs inviable para la mayoría de aplicaciones de computación en paralelo. Sin embargo, algunos han sido construidos. Un ejemplo es el peta-flop equipo RIKEN MDGrape-3 que utiliza ASIC para la simulación de dinámica molecular.

Un procesador vectorial es un sistema de la CPU o la computadora que puede ejecutar la misma instrucción en grandes conjuntos de datos. "Los procesadores vectoriales tienen operaciones de alto nivel que trabajan en las matrices lineales de números o vectores. Un ejemplo de operación de vector es A = BC, donde A, B, y C son cada uno de vectores de 64-elemento de números de punto flotante de 64 bits." Están estrechamente relacionados con la clasificación de SIMD de Flynn.

Ordenadores Cray se hizo famoso por sus computadoras vector de transformación en los años 1970 y 1980. Sin embargo, los procesadores, tanto vectoriales como CPU y como equipo completo de sistemas-por lo general han desaparecido. Conjuntos modernos de instrucciones del procesador no incluyen algunas instrucciones de procesamiento vectorial, como con AltiVec y Streaming SIMD Extensions.

Software

Lenguajes de programación paralela

Lenguajes de programación concurrente, las bibliotecas, las API y modelos de programación paralela se han creado para la programación de computadoras paralelas. Estos generalmente se pueden dividir en clases basadas en las suposiciones que hacen sobre la memoria subyacente arquitectura de memoria compartida, memoria distribuida, o memoria compartida distribuida. Lenguajes de programación de memoria compartida se comunican mediante la manipulación de las variables de memoria compartida. Memoria distribuida utiliza el paso de mensajes. Hilos POSIX y OpenMP son dos de los más utilizados API de memoria compartida, mientras que Message Passing Interface es la API del sistema de paso de mensajes más utilizados. Un concepto que se utiliza en los programas paralelos de programación es el concepto futuro, donde una parte de un programa se compromete a 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 que las directivas HMPP un estándar abierto denotado OpenHMPP. El modelo de programación basado Directiva OpenHMPP ofrece una sintaxis para los cálculos de manera eficiente offload en aceleradores de hardware y para optimizar la transferencia de datos hacia/desde la memoria del hardware. Directivas OpenHMPP describen llamada a procedimiento remoto en un dispositivo acelerador o más generalmente un conjunto de núcleos. El directivas anotar los códigos C o Fortran para describir dos conjuntos de funcionalidades: la descarga de los procedimientos en un dispositivo remoto y la optimización de las transferencias de datos entre la memoria principal de la CPU y la memoria del acelerador.

Paralelización automática

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

Lenguajes de programación paralelas Mainstream permanecen ya sea explícitamente paralelo o parcialmente implícita, en la que un programador da las directivas del compilador para la paralelización. Algunos lenguajes de programación paralela totalmente implícitas existen-SISAL, Parallel Haskell, y el Sistema C, Mitrion-C, VHDL y Verilog.

Aplicación puntos de control

Como un sistema informático crece en complejidad, el tiempo medio entre fallos normalmente disminuye. Los puntos de comprobación de aplicaciones es una técnica por la cual el sistema informático toma una "instantánea" de la aplicación - un registro de todas las asignaciones actuales de recursos y estados variables, similar a un volcado de memoria, esta información se puede utilizar para restaurar el programa si el equipo falla. Aplicación puntos de control significa que el programa tiene que reiniciar desde el último punto de control único en lugar de al principio. Mientras que los puntos de control proporciona beneficios en una variedad de situaciones, es especialmente útil en sistemas altamente paralelos con un gran número de procesadores utilizados en la computación de alto rendimiento.

Métodos algorítmicos

Mientras que las computadoras paralelas se hacen más grandes y más rápido, se hace factible para resolver problemas que antes tardaban mucho en ejecutarse. La computación paralela se utiliza en una amplia gama de campos, a partir de la bioinformática para la economía. Los tipos más comunes de los problemas encontrados en las aplicaciones de computación en paralelo son:

  • Álgebra lineal densa
  • Álgebra lineal dispersa
  • Métodos espectrales
  • problemas n-cuerpo
  • Problemas de red estructurada
  • Problemas con la red no estructurados
  • Simulación de Monte Carlo
  • Lógica combinacional
  • Gráfico recorrido
  • La programación dinámica
  • Métodos de ramificación y límite
  • Modelos gráficos
  • Simulación de la máquina de estados finitos

Historia

Los orígenes de cierto paralelismo se remontan a Federico Luigi, Conte Menabrea y su "Bosquejo del motor analítico inventado por Charles Babbage". IBM introdujo el 704 en 1954, a través de un proyecto en el que Gene Amdahl fue uno de los principales arquitectos. Se convirtió en el primer equipo disponible en el mercado a utilizar los comandos de aritmética de punto flotante completamente automáticas.

En abril de 1958, S. Gill discutió programación en paralelo y la necesidad de ramificación y de espera. También en 1958, los investigadores de IBM John Cocke y Daniel Slotnick discuten el uso de paralelismo en los cálculos numéricos para la primera vez. Burroughs Corporation presentó la D825 en 1962, un equipo de cuatro procesadores que accede hasta 16 módulos de memoria a través de un conmutador de barras cruzadas. En 1967, Amdahl y Slotnick publicaron un debate sobre la posibilidad de procesamiento en paralelo a la Federación Americana de Sociedades de Procesamiento de Información de la Conferencia. Fue durante este debate que la ley de Amdahl fue acuñado para definir el límite de velocidad en marcha debido al paralelismo.

En 1969, la compañía de EE.UU. Honeywell introdujo su primer sistema Multics, un sistema multiprocesador simétrico capaz de ejecutar hasta ocho procesadores en paralelo. C.mmp, un proyecto multi-procesador 1970 en la Universidad Carnegie Mellon, fue "uno de los primeros multiprocesadores con más de unos pocos procesadores". "El primero de varios procesadores de bus conectado con caches espionaje era el Synapse N en el año 1984."

Computadoras paralelas SIMD se remontan a la década de 1970. La motivación detrás de las primeras computadoras SIMD fue para amortizar el retardo de puerta de la unidad de control del procesador a través de múltiples instrucciones. En 1964, Slotnick había propuesto la construcción de una computadora paralela masiva para el Laboratorio Nacional Lawrence Livermore. Su diseño fue financiado por la Fuerza Aérea de los EE.UU., que fue el esfuerzo paralelo de computación antes SIMD, ILLIAC IV. La clave de su diseño era bastante alto paralelismo, con hasta 256 procesadores, lo que permitió que la máquina trabaje en grandes conjuntos de datos en lo que más tarde se conocería como el procesamiento de vectores. Sin embargo, ILLIAC IV fue llamado "el más infame de los superordenadores", porque el proyecto era sólo un cuarto completo, pero tardó 11 años y costó casi cuatro veces la estimación original. Cuando estaba listo para ejecutar su primera aplicación real en 1976, fue superado por supercomputadoras comerciales existentes, como el Cray-1.