Computacion Paralela

Contenido INTRODUCCION .................................................................................................

Views 83 Downloads 0 File size 2MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Contenido INTRODUCCION ................................................................................................................................... 3 1.

Antecedentes .............................................................................................................................. 4 1.1.

Evolución de los sistemas .................................................................................................... 4

Punto de vista de los Sistemas Operativos ................................................................................. 4 Punto de vista de la arquitectura ................................................................................................ 5 2.

3.

Vision general .............................................................................................................................. 6 2.1.

¿Qué es? .............................................................................................................................. 6

2.2.

¿Por qué usar la computación paralela? ........................................................................... 12

Conceptos básicos ..................................................................................................................... 15 3.1.

Ley de Amdhal y ley de Gustafson .................................................................................... 15

3.2.

Dependencias .................................................................................................................... 16

3.3.

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

3.4.

Paralelismo de grano fino, grano grueso y paralelismo vergonzoso ................................ 19

3.5.

Límites y costos de la programación paralela ................................................................... 19

Complejidad .............................................................................................................................. 19 Portabilidad ............................................................................................................................... 20 Requerimientos de recursos ..................................................................................................... 20 Escalabilidad .............................................................................................................................. 20 3.6.

Tipos de paralelismo ......................................................................................................... 21

Paralelismo a nivel de BIT ......................................................................................................... 21 Paralelismo a nivel de Instrucción ....................................................................................... 22 Paralelismo de datos ................................................................................................................. 23 Paralelismo de tareas ................................................................................................................ 24 3.7.

Arquitectura de la computadora de von Neumann .......................................................... 24

3.8.

La taxonomia de Flynn ...................................................................................................... 25

3.8.1.

SISD( Single Instruction, Single Data ) ....................................................................... 26

3.8.2.

SIMD (Single Instruction, Multiple Data)................................................................... 27

3.8.3.

MISD (Multiple Instruction, Single Data)................................................................... 29

3.8.4.

MISD (Multiple Instruction, Multiple Data)............................................................... 29

3.9.

Arquitecturas paralelas de memoria de computadora ..................................................... 34

3.9.1.

Memoria compartida ................................................................................................ 34

3.9.2.

Memoria distribuida .................................................................................................. 36

3.9.3.

Memoria hibrida distribuida-compartida.................................................................. 37

4.

Aplicaciones............................................................................................................................... 39

5.

Terminologia ................................................................................ ¡Error! Marcador no definido.

6.

Referencias ................................................................................................................................ 45

INTRODUCCION Cada vez se está exigiendo mayor potencia de cálculo en las computadoras a nivel científico, industrial, comercial. Cabe esperar que esta demanda se irá incrementando en el futuro sobre todo en aplicaciones de simulación y tiempo real, por tanto, existe una tendencia actual para alcanzar grandes capacidades de elaboración de datos. Pero la velocidad en la computación tiene limitaciones tecnológicas y lógicas. La eficiencia de un computador depende directamente del tiempo requerido para ejecutar una instrucción y del número de instrucciones que pueden ser ejecutadas concurrentemente. Esta eficiencia puede ser incrementada por avances en la arquitectura y por avances tecnológicos. Una vez incorporados estos avances, mejorar la eficiencia de un procesador implica reducir el tiempo de los ciclos: avances tecnológicos. Las soluciones planteadas para esta demanda se pueden concretar en 2 líneas importantes que son el Software y Hardware. La solución de software consiste en la mejora de los algoritmos, para que estos se ejecuten requiriendo el menor tiempo posible. Aunque los algoritmos poseen una complejidad y necesidad de recursos que los limitan. Las soluciones de Hardware consisten en mejoras en las tecnologías de las computadoras para una mayor rapidez en la ejecución de instrucciones. La solución que une el uso del Software y Hardware es el paralelismo, que por el lado del hardware abarca la réplica de unidades de tratamiento de información con el objetivo de repartir tareas entre las mismas y por el lado del software la adaptación de los algoritmos a estas arquitecturas paralelas. Todo esto impulsa al desarrollo de computadoras cada vez más potentes en las que se disponen procesadores en paralelo, actuando simultáneamente. Las ventajas de estos sistemas son notables por cuanto hacen uso de procesadores estándar para alcanzar enormes velocidades de cálculo, del orden de Tera instrucciones por segundo (1012 instrucciones) por segundo. La necesidad de resolver problemas de manera eficiente y en el menor tiempo posible ha hecho que se tengan que realizar mejoras en el poder computacional de los computadores.

1. Antecedentes En el año 1936 Alan Turing demostró que, al menos teóricamente, era posible diseñar una maquina secuencial de propósito general capaz de llevar a cabo eficientemente cualquier calculo que pudiese realizar una maquina secuencial de propósito específico, diseñada por tanto para resolver de forma muy eficiente un determinado tipo de cálculo. Años más tarde Von Neumann realiza su propuesta de computador secuencial de propósito general que refleja el trabajo de Turing en un modelo practico, conocido como el nombre de “Computador de von Neumann”. En este modelo se han basado la mayoría de computadores secuenciales construidos desde finales de los años cuarenta hasta la actualidad. EL modelo de von Neumann ha permitido y estimulado el desarrollo de lenguajes de alto nivel, aplicaciones portables, ejecutables en cualquier computadora secuencial con un buen rendimiento. La búsqueda de un mayor rendimiento en las aplicaciones, que no eran satisfechas por computadoras secuenciales, ha impulsado el desarrollo y construcción de computadores paralelos, más aun en los años 80 estos computadores paralelas tenían un rendimiento aceptable explotando los detalles de la arquitectura de la maquina ya que muchas de las aplicaciones paralelas producidas en ese entonces no podían adaptarse a todas las máquinas de la época. La diversidad de arquitecturas paralelas impidió el crecimiento de la computación en paralelo, lo cual ha mejorado sustancialmente desde ese entonces. Desde los noventa las diferentes clases de computadores paralelos están convergiendo a una estructura cada vez más parecida y se ha ido evolucionando a un modelo arquitectónico estándar, en un conjunto de pares procesador-memoria interconectadas mediante una red de comunicación que permite el empleo de un espacio de direcciones global.

1.1.

Evolución de los sistemas

Punto de vista de los Sistemas Operativos  Procesamiento por lotes: En el cual cada programa es cargado y ejecutado, en forma separada.  Multiprogramación: En el cual se carga una serie de programas en memoria, y se ejecutan de acuerdo a las necesidades de cada uno.  Tiempo compartido: En este caso, todos los programas están cargados en la memoria, y se asigna un tiempo de ejecución para cada uno, en forma tal que parecen ejecutarse todos simultáneamente.

 Multiprocesamiento: En este caso se disponen varias unidades de procesamiento, en forma tal que operan simultáneamente sobre varios programas.

Punto de vista de la arquitectura  Procesamiento de datos: es el tipo de procesamiento que mayormente se emplea aun actualmente, pues consiste en operar sobre datos alfanuméricos no relacionados  Procesamiento de información: La información consiste en un cúmulo de datos, que están de alguna manera ligados mediante una estructura sintáctica o una relación espacial cualquiera.  Procesamiento de conocimientos: El conocimiento, es una forma de información más algún significado semántico, o sea que forman un subespacio de la información.  Procesamiento de inteligencia: La inteligencia, es derivada de una colección de ítems de conocimiento.

2. Visión general 2.1. ¿Qué es? Computación en serie: Tradicionalmente, el software ha sido escrito para computación en serie, y su forma de trabajo era: 

Un problema se divide en una serie discreta de instrucciones



Las instrucciones se ejecutan secuencialmente una tras otra.



Ejecutado en un solo procesador



Solo se puede ejecutar una instrucción en cualquier momento.

Computación Paralela La computación paralela es una técnica en la que muchas instrucciones se ejecutan simultáneamente, operando sobre el principio de que problemas grandes, se pueden dividir en unos más pequeños, que luego son resueltos simultáneamente (paralelo), tiene las siguientes características: 

Un problema se divide en partes discretas que pueden resolverse simultáneamente



Cada parte se divide en una serie de instrucciones.



Las instrucciones de cada parte se ejecutan simultáneamente en diferentes procesadores.



Se emplea un mecanismo general de control / coordinación.

El paralelismo es posible en sistemas multinúcleo, multiprocesador o distribuidos.



El problema computacional debería ser capaz de: -

Se puede dividir en piezas de trabajo discretas que se pueden resolver simultáneamente;

-

Ejecute múltiples instrucciones de programa en cualquier momento;

-

Resuélvase en menos tiempo con múltiples recursos informáticos que con un solo recurso informático.



Los recursos de cómputo son típicamente: -

Una sola computadora con múltiples procesadores / núcleos

-

Un número arbitrario de tales computadoras conectadas por una red

Ordenadores Paralelos Prácticamente todas las computadoras independientes de hoy son paralelas desde una perspectiva de hardware: 

Múltiples unidades funcionales (caché L1, caché L2, rama, captación previa, decodificación, punto flotante, procesamiento de gráficos (GPU), entero, etc.)



Múltiples unidades / núcleos de ejecución.



Multiples hilos de hardware.

Las redes conectan varias computadoras independientes (nodos) para hacer grupos de computadoras paralelas más grandes.

Por ejemplo, el esquema a continuación muestra un clúster típico de computadoras paralelas LLNL: 

Cada nodo de cálculo es una computadora paralela multiprocesador en sí misma



Múltiples nodos de cómputo están conectados en red junto con una red Infiniband



Los nodos de propósito especial, también multiprocesador, se usan para otros propósitos

La mayoría de las grandes computadoras paralelas (supercomputadoras) del mundo son grupos de hardware producidos por un puñado de (en su mayoría) vendedores bien conocidos.

1

1

https://www.top500.org/statistics/list/

2.2. ¿Por qué usar la computación paralela? El mundo real es masivamente paralelo 

En el mundo natural, muchos eventos complejos e interrelacionados están ocurriendo al mismo tiempo, pero dentro de una secuencia temporal.



En comparación con la computación en serie, la computación en paralelo es mucho más adecuada para modelar, simular y comprender fenómenos complejos del mundo real.

Imaginemos modelar estos en serie:

Principales razones: Ahorra tiempo y/o dinero: 

En teoría, dedicar más recursos a una tarea acortará su tiempo hasta su finalización, con posibles ahorros de costos.



Las computadoras paralelas se pueden construir a partir de componentes baratos y básicos.

RESOLVER MÁS GRANDE / MÁS COMPLEJOS PROBLEMAS: 



Muchos problemas son tan grandes y / o complejos que no es práctico o imposible resolverlos en una sola computadora, especialmente dada la limitada memoria de la computadora. Ejemplo: "Problemas de gran desafío que requieren PetaFLOPS y PetaBytes de recursos informáticos.

PROPORCIONAR CONCURRENCIA:  

Un solo recurso de cómputo solo puede hacer una cosa a la vez. Múltiples recursos de cómputo pueden hacer muchas cosas simultáneamente. Ejemplo: las redes de colaboración proporcionan un lugar global donde personas de todo el mundo pueden reunirse y realizar el trabajo "virtualmente".

APROVECHE LOS RECURSOS NO LOCALES: 

 

Usar recursos informáticos en una red de área amplia, o incluso Internet cuando los recursos informáticos locales son escasos o insuficientes. Dos ejemplos a continuación, cada uno de los cuales tiene más de 1.7 millones de contribuyentes a nivel mundial (mayo de 2018): Ejemplo: SETI @ home ( setiathome.berkeley.edu ) Ejemplo: Folding @ home ( fold.stanford.edu )

HAGA UN MEJOR USO DE LOS HARDWARE PARALELOS SUBYACENTES:   

Las computadoras modernas, incluso las computadoras portátiles, tienen una arquitectura paralela con múltiples procesadores / núcleos. El software paralelo está específicamente diseñado para hardware paralelo con múltiples núcleos, hilos, etc. En la mayoría de los casos, los programas en serie que se ejecutan en computadoras modernas "desperdician" la potencia informática potencial.

3. Conceptos básicos 3.1. Ley de Amdhal y ley de Gustafson Ley de Amdhal:

Idealmente, la aceleración a partir de la paralelización es lineal, doblar el número de elementos de procesamiento debe reducir a la mitad el tiempo de ejecución y doblarlo por segunda vez, debe nuevamente reducir el tiempo a la mitad. Sin embargo, muy pocos algoritmos paralelos logran una aceleración óptima. La mayoría tiene una aceleración casi lineal para un pequeño número de elementos de procesamiento, y pasa a ser constante para un gran número de elementos de procesamiento. La aceleración potencial de un algoritmo en una plataforma de cómputo en paralelo está dada por la ley de Amdahl, formulada originalmente por Gene Amdahl en la década de 1960. Esta señala que: “Una pequeña porción del programa que no pueda paralelizarse va a limitar la aceleración que se logra con la paralelización.” Los programas que resuelven problemas matemáticos o ingenieriles típicamente consisten en varias partes paralelizables y varias no paralelizables (secuenciales). Si 𝛼 es la fracción de tiempo que un programa gasta en partes no paralelizables, luego: 𝑆=

1 1 = lim ( ) 𝑃→∞ 1 𝛼 + 𝛼 𝑃

Es la máxima aceleración que se puede alcanzar con la paralelización del programa. Si la parte secuencial del programa abarca el 10% del tiempo de ejecución, se puede obtener no más de 10× de aceleración, independientemente de cuántos procesadores se añadan. Esto pone un límite superior a la utilidad de añadir más unidades de ejecución paralelas. Cuando una tarea no puede dividirse debido a las limitaciones secuenciales, la aplicación de un mayor esfuerzo no tiene efecto sobre la programación. Ley de Gustafson: Ley relacionada a la de Amdahl, señala que el aumento de la velocidad con P procesadores es de: 𝑆(𝑃) = 𝑃 − 𝛼(𝑃 − 1) = 𝛼 + 𝑃(1 − 𝛼) Ambas leyes asumen que el tiempo de funcionamiento de la parte secuencial del programa es independiente del número de procesadores. La ley de Amdahl supone que todo el problema es de tamaño fijo, por lo que la cantidad total de trabajo que se hará en paralelo también es independiente del número de procesadores, mientras que la ley de Gustafson supone que la

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

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

función OperacionDep(a, b) c: = a · b d: = 3 · c fin función

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

Sin dependencia:

1: 2: 3: 4: 5:

función OperacionNoDep (a, b) c: = a · b d: b = 3 · e: = a + b fin función

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

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

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

Hilo B

1A: Lee variable V

1B: Lee variable V

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

Si la instrucción 1B se ejecuta entre 1A y 3A, o si la instrucción 1A se ejecuta entre 1B y 3B, el programa va a producir datos incorrectos. Esto se conoce como una condición de carrera. El programador debe utilizar un bloqueo (lock) para proporcionar exclusión mutua. Un bloqueo es una construcción del lenguaje de programación que permite a un hilo de tomar el control de una variable y evitar

que otros hilos la lean o escriban, hasta que la variable esté desbloqueado. El hilo que mantiene el bloqueo es libre de ejecutar su sección crítica —la sección de un programa que requiere acceso exclusivo a alguna variable—, y desbloquear los datos cuando termine. Por lo tanto, para garantizar la correcta ejecución del programa, el programa anterior se puede reescribir usando bloqueos de la siguiente manera: Hilo A

Hilo B

1A: Bloquear variable V

1B: Bloquear variable V

2A: Lee variable V

2B: Lee variable V

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

Un hilo bloqueará con éxito la variable V, mientras que el otro hilo no podrá continuar hasta que V se desbloquee. Esto garantiza la correcta ejecución del programa. Si bien los bloqueos son necesarios para asegurar la ejecución correcta del programa, pueden ralentizar en gran medida un programa. Bloquear múltiples variables utilizando cerraduras no atómicas introduce la posibilidad de que el programa alcance un bloqueo mutuo (deadlock). Un bloqueo atómico bloquea múltiples variables a la vez, si no puede bloquearlas todas, no se bloquea ninguna de ellas. Si hay dos hilos y cada uno necesita bloquear las mismas dos variables utilizando cerraduras no atómicas, es posible que un hilo bloquee uno de ellas y el otro bloquee la segunda variable. En tal caso se produce un bloqueo mutuo donde ningún hilo puede completar la ejecución. Muchos programas paralelos requieren que sus subtareas actúen en sincronía. Esto requiere el uso de una barrera. Las barreras se implementan normalmente mediante un bloqueo. Una clase de algoritmos, conocida como algoritmos libres de bloqueo y libres de espera, evitan el uso de bloqueos y barreras. Sin embargo, este enfoque es generalmente difícil de implementar y requiere estructuras de datos correctamente diseñadas. No todas las paralelizaciones conllevan una aceleración. Por lo general, mientras una tarea se divida en cada vez más hilos, estos hilos pasan una porción cada vez mayor de su tiempo comunicándose entre sí. Eventualmente, la sobrecarga de comunicación domina el tiempo empleado para resolver el problema, y la paralelización adicional —dividir la carga de trabajo entre incluso más hilos—

aumenta la cantidad de tiempo requerido para terminar. Esto se conoce como desaceleración paralela.

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

3.5. Límites y costos de la programación paralela Complejidad 

En general, las aplicaciones paralelas son mucho más complejas que las aplicaciones en serie correspondientes, quizás un orden de magnitud. No solo tiene múltiples secuencias de instrucciones ejecutándose al mismo tiempo, sino que también tiene datos que fluyen entre ellas.



Los costos de complejidad se miden en el tiempo del programador en prácticamente todos los aspectos del ciclo de desarrollo del software:



o

Diseño

o

Codificación

o

Depuración

o

Mantenimiento

Adherirse a "buenas" prácticas de desarrollo de software es esencial cuando se trabaja con aplicaciones paralelas, especialmente si alguien además de usted tendrá que trabajar con el software.

Portabilidad 

Gracias a la estandarización en varias API, como MPI, subprocesos POSIX y OpenMP, los problemas de portabilidad con programas paralelos no son tan serios como en años anteriores.



Todos los problemas de portabilidad habituales asociados con los programas serie se aplican a los programas paralelos. Por ejemplo, si utiliza las "mejoras" de los proveedores en Fortran, C o C ++, la portabilidad será un problema.



A pesar de que existen estándares para varias API, las implementaciones diferirán en una serie de detalles, a veces hasta el punto de requerir modificaciones de código para efectuar la portabilidad.



Los sistemas operativos pueden jugar un papel clave en los problemas de portabilidad de código.



Las arquitecturas de hardware son característicamente muy variables y pueden afectar la portabilidad.

Requerimientos de recursos 

El objetivo principal de la programación en paralelo es disminuir el tiempo de reloj de la pared de ejecución, sin embargo, para lograr esto, se requiere más tiempo de CPU. Por ejemplo, un código paralelo que se ejecuta en 1 hora en 8 procesadores en realidad usa 8 horas de tiempo de CPU.



La cantidad de memoria requerida puede ser mayor para los códigos paralelos que para los códigos seriales, debido a la necesidad de replicar los datos y para los gastos generales asociados con las bibliotecas y subsistemas de soporte paralelos.



Para los programas paralelos de ejecución corta, en realidad puede haber una disminución en el rendimiento en comparación con una implementación en serie similar. Los costos generales asociados con la configuración del entorno paralelo, la creación de tareas, las comunicaciones y la terminación de tareas pueden representar una parte significativa del tiempo total de ejecución para ejecuciones cortas.

Escalabilidad Dos tipos de escalamiento basados en el tiempo para la solución: escala fuerte y escala débil. 

Escala fuerte o

El tamaño total del problema permanece fijo a medida que se agregan más procesadores.

o

El objetivo es ejecutar el mismo problema más rápido

o



La escala perfecta significa que el problema se resuelve en tiempo 1 / P (en comparación con la serie)

Escalamiento débil o

El tamaño del problema por procesador se mantiene fijo a medida que se agregan más procesadores. El tamaño total del problema es proporcional al número de procesadores utilizados.

o

El objetivo es ejecutar un problema mayor en la misma cantidad de tiempo



La capacidad del rendimiento de un programa paralelo para escalar es el resultado de una serie de factores interrelacionados. Simplemente agregar más procesadores no es la respuesta.



El algoritmo puede tener límites inherentes a la escalabilidad. En algún momento, agregar más recursos hace que el rendimiento disminuya. Esta es una situación común con muchas aplicaciones paralelas.



Los factores de hardware juegan un papel importante en la escalabilidad. Ejemplos:



o

Ancho de banda del bus de memoria-CPU.

o

Ancho de banda de la red de comunicaciones.

o

Cantidad de memoria disponible en cualquier máquina o conjunto de máquinas determinado.

o

Velocidad del reloj del procesador.

Las bibliotecas de soporte paralelo y el software de subsistemas pueden limitar la escalabilidad independientemente de su aplicación.

3.6. Tipos de paralelismo Paralelismo a nivel de BIT Desde el advenimiento de la integración a gran escala (VLSI) como tecnología de fabricación de chips de computadora en la década de 1970 hasta alrededor de 1986, la aceleración en la arquitectura de computadores se lograba en gran medida duplicando el tamaño de la palabra en la computadora, la cantidad de información que el procesador puede manejar por ciclo. El aumento del tamaño de la palabra reduce el número de instrucciones que el procesador debe ejecutar para realizar una operación en variables cuyos tamaños son mayores que la longitud de la palabra. Por ejemplo: Cuando un procesador de 8 bits debe sumar dos enteros de 16 bits, el procesador primero debe adicionar los 8 bits de orden inferior de cada número entero con la instrucción de

adición, a continuación, añadir los 8 bits de orden superior utilizando la instrucción de adición con acarreo que tiene en cuenta el bit de acarreo de la adición de orden inferior, en este caso un procesador de 8 bits requiere dos instrucciones para completar una sola operación, en donde un procesador de 16 bits necesita una sola instrucción para poder completarla.

Paralelismo a nivel de Instrucción Un programa de ordenador es, en esencia, una secuencia de instrucciones ejecutadas por un procesador. Estas instrucciones pueden reordenarse y combinarse en grupos que luego son ejecutadas en paralelo sin cambiar el resultado del programa. Esto se conoce como paralelismo a nivel de instrucción. Los avances en el paralelismo a nivel de instrucción dominaron la arquitectura de computadores desde mediados de 1980 hasta mediados de la década de 1990. Los procesadores modernos tienen “pipeline” de instrucciones de varias etapas. Cada etapa en el pipeline corresponde a una acción diferente que el procesador realiza en la instrucción correspondiente a la etapa; un procesador con un pipeline de N etapas puede tener hasta n instrucciones diferentes en diferentes etapas de finalización. El ejemplo canónico de un procesador segmentado es un procesador RISC, con cinco etapas: pedir instrucción, decodificar, ejecutar, acceso a la memoria y escritura. El procesador Pentium 4tenía un pipeline de 35 etapas. Además del paralelismo a nivel de instrucción del pipelining, algunos procesadores pueden ejecutar más de una instrucción a la vez. Estos son conocidos como procesadores superes calares. Las instrucciones pueden agruparse juntas sólo si no hay dependencia de datos entre ellas.

Pipeline • Técnica de implementación • Persigue aumentar las prestaciones. • Divide la ejecución de una instrucción en etapas. • Cada etapa utiliza diferentes recursos. • Permite solapar la ejecución de distintas instrucciones en diferentes etapas. • Permite comenzar una instrucción en cada ciclo de reloj. Conceptos Importantes: • • • • • • • • •

Productividad (Throughtput): Nº de instrucciones por segundo Ciclo de procesador: Tiempo de una etapa; determinado por la etapa más lenta. Latencia: Tiempo total de ejecución de una instrucción. Objetivo del diseñador: Equilibrar el tiempo de cada etapa. La segmentación consigue una reducción del CPI (Ciclo por instrucción) o del Tciclo Si partimos de un procesador con muchos ciclos por instrucción => reduce el CPI. Si partimos de un procesador de ciclo largo => reduce Tciclo. Híbrido. La segmentación explota el paralelismo inherente en un conjunto de instrucciones.

• Es transparente al usuario. Ejemplo: Consideremos la siguiente descomposición del procesamiento de una instrucción.   

  

Captar instrucción (Fetch lnstruction, FI): Leer la supuesta siguiente instrucción en un buffer. Decodificar instrucción (Decode Instruction, DI): Determinar el código de operación y los campos de operando. Calcular operandos (Calculate Operands, CO): Calcular la dirección efectiva de cada operando fuente. Esto puede involucrar direccionamiento mediante un desplazamiento, indirecto a través de registro, indirecto, u otras formas de calcular la dirección. Captar operandos (Fetch Operands, FO): Captar cada operando de memoria. Los operandos en registros no tienen que ser captados. Ejecutar instrucción (Execute Instruction, EI): Realizar la operación indicada y almacenar el resultado, si lo hay, en la posición de operando destino especificada. Escribir operando (Write Operand, WO): Almacenar el resultado en memoria.

Paralelismo de datos El paralelismo de datos es el paralelismo inherente en programas con ciclos, que se centra en la distribución de los datos entre los diferentes nodos computacionales que deben tratarse en paralelo. La paralelización de ciclos conduce a menudo a secuencias similares de operaciones (no necesariamente idénticas) o funciones que se realizan en los elementos de una gran estructura de datos. Muchas de las aplicaciones científicas y de ingeniería muestran paralelismo de datos. Una dependencia de terminación de ciclo es la dependencia de una iteración de un ciclo en la salida de una o más iteraciones anteriores. Las dependencias de terminación de ciclo evitan la paralelización de ciclos.

A medida que el tamaño de un problema se hace más grande, la paralelización de datos disponible generalmente también lo hace.

Paralelismo de tareas El paralelismo de tareas es la característica de un programa paralelo en la que cálculos completamente diferentes se pueden realizar en cualquier conjunto igual o diferente de datos. Esto contrasta con el paralelismo de datos, donde se realiza el mismo cálculo en distintos o mismos grupos de datos. El paralelismo de tareas por lo general no escala con el tamaño de un problema. Durante muchos años, la computación paralela se ha aplicado en la computación de altas prestaciones, pero el interés en ella ha aumentado en los últimos años debido a las restricciones físicas que impiden el escalado en frecuencia. La computación paralela se ha convertido en el paradigma dominante en la arquitectura de computadores, principalmente en los procesadores multinúcleo. Sin embargo, recientemente, el consumo de energía de los ordenadores paralelos se ha convertido en una preocupación. Los ordenadores paralelos se pueden clasificar según el nivel de paralelismo que admite su hardware: los ordenadores multinúcleo y multiproceso tienen varios elementos de procesamiento en una sola máquina, mientras que los clusters, los MPP y los grids emplean varios ordenadores para trabajar en la misma tarea. Los programas de ordenador paralelos son más difíciles de escribir que los secuenciales porque la concurrencia introduce nuevos tipos de errores de software, siendo las condiciones de carrera los más comunes. La comunicación y la sincronización entre las diferentes subtareas son típicamente las grandes barreras para conseguir un buen rendimiento de los programas paralelos. El incremento de velocidad que consigue un programa como resultado de la paralelización viene dado por la ley de Amdahl.

3.7. Arquitectura de la computadora de von Neumann El matemático húngaro John von Neumann, quien fue el primero en escribir los requisitos generales para una computadora electrónica en sus artículos de 1945. También conocida como "computadora de programa almacenado", tanto las instrucciones del programa como los datos se guardan en la memoria electrónica. Difiere de las computadoras anteriores que fueron programadas a través de "cableado". Desde entonces, prácticamente todas las computadoras han seguido este diseño básico:





Consta de cuatro componentes principales: o

Memoria

o

Unidad de control

o

Unidad de lógica aritmética

o

De entrada y salida

La memoria de acceso aleatorio de lectura / escritura se utiliza para almacenar tanto las instrucciones del programa como los datos. o

Las instrucciones del programa son datos codificados que le dicen a la computadora que haga algo.

o

Los datos son simplemente información para ser utilizada por el programa.



La unidad de control obtiene las instrucciones / datos de la memoria, decodifica las instrucciones y luego coordina las operaciones de forma secuencial para realizar la tarea programada.



Unidad aritmética realiza operaciones aritméticas básicas.



Entrada / Salida es la interfaz para el operador humano

3.8. La taxonomía de Flynn Como toda clasificación (o taxonomía) de arquitecturas persigue dividir el conjunto de los computadores en una serie de clases de forma que, si se sabe la clase a la que pertenece un computador, automáticamente se conocen una serie de características interesantes del mismo. Una de las clasificaciones más utilizadas, en uso desde 1966, se llama Taxonomía de Flynn.

La taxonomía de Flynn distingue las arquitecturas de computadora multiprocesador según cómo pueden clasificarse a lo largo de las dos dimensiones independientes de Instruction Stream y Data Stream. Cada una de estas dimensiones puede tener solo uno de dos estados posibles: Único o Múltiple. La siguiente matriz define las 4 clasificaciones posibles según Flynn:

3.8.1. SISD (Single Instruction, Single Data)  La CPU activa un solo flujo de instrucciones.

 

Datos almacenados en una única memoria. Ejemplo: Computadores monoprocesador, mainframes de generación anterior, minicomputadoras, estaciones de trabajo. Descripción Estructural

3.8.2. SIMD (Single Instruction, Multiple Data) Una única instrucción máquina controla paso a paso la ejecución simultánea de un cierto número de elementos de proceso.

Cada elemento de proceso tiene una memoria asociada. Cada instrucción es ejecutada por cada procesador, con un conjunto de datos diferentes. Se aprovecha el paralelismo de datos. Instrucción única: todas las unidades de procesamiento ejecutan la misma instrucción en cualquier ciclo de reloj dado. Datos múltiples: cada unidad de procesamiento puede operar en un elemento de datos diferente. Más adecuado para problemas especializados caracterizados por un alto grado de regularidad, como el procesamiento de gráficos e imágenes. Dos variedades: matrices de procesadores y tuberías de vectores Ejemplos: Arreglos de procesadores: Máquinas de pensar CM-2, MasPar MP-1 y MP-2, ILLIAC IV Tuberías de vectores: IBM 9000, Cray X-MP, Y-MP y C90, Fujitsu VP, NEC SX-2, Hitachi S820, ETA10 La mayoría de las computadoras modernas, particularmente aquellas con unidades de procesamiento de gráficos (GPU) emplean instrucciones SIMD y unidades de ejecución.

3.8.3. MISD (Múltiple Instruction, Single Data) Se transmite una secuencia de datos a un conjunto de procesadores. Cada procesador ejecuta una secuencia de instrucciones diferente. Esta estructura nunca ha sido implementada. Pocos (si alguno) ejemplos reales de esta clase de computadora paralela han existido alguna vez. Algunos usos concebibles podrían ser:  Múltiples filtros de frecuencia que operan en una sola señal.  Algoritmos de criptografía múltiple que intentan descifrar un solo mensaje codificado.

3.8.4. MISD (Múltiple Instruction, Múltiple Data) La organización básica de un multiprocesador es la indicada en la figura adjunta líneas abajo. El sistema contiene dos o más procesadores de capacidades semejantes. Todos los procesadores comparten el acceso a varios módulos de memoria, varios canales de E/S, y dispositivos periféricos.

Lo más importante es que todo el conjunto puede ser controlado por un sistema operativo integrado, que provee interacción entre los procesadores y sus programas en varios niveles. Cada procesador posee su propia memoria y puede tener sus dispositivos privados. La intercomunicación entre procesadores puede ser a través de las memorias compartidas o por medio de una malla conmutada. La organización del hardware es determinada, primariamente, por la estructura de interconexión utilizada entre memorias y procesadores, de la cual se han utilizado al presente tres modelos: - Bus común de tiempo compartido - Malla de conmutación tipo crossbar - Memorias multipuerto. En resumen: 

Un conjunto de procesadores ejecuta simultáneamente secuencias de instrucciones diferentes.



Conjuntos de datos diferentes.



Un computador multiprocesador está formado por muchos procesadores lo cuales pueden comunicarse y cooperar entre ellos a diferentes niveles, para resolver un dado problema. Esta comunicación puede hacerse mediante mensajes entre ellos o mediante una memoria compartida. Ejemplo: SMP, los Clusters y los sistemas NUMA son ejemplos de esta categoría.

En general se denotan 2 modelos de multiprocesadores MIMD: a. MULTIPROCESADORES LEVEMENTE ACOPLADOS: En estos sistemas, cada procesador tiene un conjunto de dispositivos de entrada/salida y una gran memoria local, donde obtienen la mayoría de sus instrucciones y datos. Nos referiremos al procesador, a su memoria y a sus dispositivos de E/S como un "módulo computador". Los procesos que se ejecutan en diferentes módulos computadores, se comunican mediante el intercambio de mensajes a través de un sistema de transferencia de mensajes (STM). El grado de acoplamiento, o sea la interacción procesador-procesador, en estos sistemas es muy pobre, tanto que a veces se los conoce como "sistemas de procesamiento distribuido", aunque en realidad, el término procesamiento distribuido se aplica al procesamiento de un problema y sus partes en diferentes computadores, interconectados de alguna manera. En la figura adjunta, se indica la conformación de un módulo computador y del sistema de conexión entre ellos. En la interfase de cada módulo, hay un

conmutador de arbitraje y un canal. El canal es un dispositivo particular de E/S, mientras que la llave de arbitraje es la que permite la conexión con el STM de acuerdo con los requerimientos que se establezcan para evitar colisiones.

MODELO FUERTEMENTE ACOPLADO. En el modelo fuertemente acoplado, los procesadores se comunican por medio de una memoria compartida, con lo cual la velocidad a la que se transfieren datos es del orden del ancho de banda de la memoria. Cada procesador puede tener asimismo una pequeña cache o memoria local de alta velocidad, existiendo una total conectividad entre procesadores y memoria, la que puede ser implementada por una malla de interconexión o por una memoria multipuerto. La limitación más importante de este tipo de computadores, es la degradación que sufre el rendimiento por los múltiples accesos a memoria, necesarios para la comunicación.

Los multiprocesadores fuertemente acoplados, tienen un modelo tal como el expuesto en la figura, donde se tiene un conjunto de N procesadores, L módulos de memoria y varios canales de E/S, conectados mediante un conjunto de tres mallas de interconexión: 1 - La red de conexión procesador-memoria 2 - La red de conexión procesador-E/S 3 - La red de conexión para interrupción entre procesadores. La primera es un sistema de conmutación que conecta a cualquier procesador con cualquier módulo de memoria, normalmente es un conmutador crossbar. La red de conexión procesador-E/S permite a un procesador cualquiera conectarse con uno de los dispositivos periféricos. Esta también es normalmente una red crossbar. Finalmente, la red inter procesadores, permite que cualquiera de ellos interrumpa a cualquier otro a fin de o bien transferirle datos, o información de estado. En este último caso, la información puede ser la de mal funcionamiento, solicitando así su reemplazo.

Caso: CLUSTERS

Un clúster es un tipo de computador paralelo o distribuido que consiste en un conjunto de computadores independientes pero interconectados entre sí que trabajan conjuntamente como un único recurso para resolver un problema común. Multiprocesador “casero”: utiliza componentes comerciales, baratos y potentes: Commodity of the shelf (COTS) Los clusters se clasifican:   -

 -

Según la aplicación. Clusters de alto rendimiento: diseñados para la implementación de aplicaciones de alto coste computacional. Clusters de alta fiabilidad: diseñado para aplicaciones críticas, en las que lo importante es la disponibilidad. Según el propietario de los nodos: Clusters dedicados: las aplicaciones paralelas se ejecutan en todo el sistema, sin ningún tipo de restricción. Clusters no dedicados: cada nodo tiene un propietario y las aplicaciones paralelas se ejecutan en el tiempo en que los nodos están ociosos (ciclos libres). Configuración del clúster: Clusters homogéneos: la arquitectura (hardware y software) de todos los nodos es la misma. Clusters heterogéneos: los nodos tienen diferentes características, en cuanto a hardware o software.

3.9. Arquitecturas paralelas de memoria de computadora 3.9.1. Memoria compartida Características Generales: 

Las computadoras paralelas de memoria compartida varían ampliamente, pero generalmente tienen en común la capacidad de todos los procesadores para acceder a toda la memoria como espacio de direcciones global.



Múltiples procesadores pueden operar independientemente pero comparten los mismos recursos de memoria.



Los cambios en una ubicación de memoria efectuados por un procesador son visibles para todos los otros procesadores.



Históricamente, las máquinas de memoria compartida se han clasificado como UMA y NUMA, según los tiempos de acceso a la memoria.

Acceso Uniforme a la Memoria (UMA)



Lo más comúnmente representado en la actualidad por las máquinas de multiprocesador simétrico (SMP)



Procesadores idénticos.



Igual acceso y tiempos de acceso a la memoria.



A veces se llama CC-UMA - Caché UMA coherente. Caché coherente significa que si un procesador actualiza una ubicación en la memoria compartida, todos los demás procesadores conocen la actualización. La coherencia de caché se logra a nivel de hardware.

Acceso de Memoria no Uniforme (NUMA) 

A menudo se realiza mediante la vinculación física de dos o más SMP



Un SMP puede acceder directamente a la memoria de otro SMP



No todos los procesadores tienen el mismo tiempo de acceso a todas las memorias



El acceso a la memoria a través del enlace es más lento



Si se mantiene la coherencia de la memoria caché, también puede llamarse CC-NUMA NUMA coherente de la memoria caché

Ventajas: 

El espacio de direcciones global proporciona una perspectiva de programación fácil de usar para la memoria.



El intercambio de datos entre tareas es rápido y uniforme debido a la proximidad de la memoria a las CPU.

Desventajas: 

La principal desventaja es la falta de escalabilidad entre la memoria y las CPU. Agregar más CPU puede aumentar el tráfico geométricamente en la ruta de la CPU y la memoria compartida, y para los sistemas coherentes de caché, aumentar el tráfico asociado con la administración de memoria / caché.



Responsabilidad del programador para las construcciones de sincronización que aseguran el acceso "correcto" de la memoria global.

3.9.2. Memoria distribuida Características Generales: 

Al igual que los sistemas de memoria compartida, los sistemas de memoria distribuida varían ampliamente pero comparten una característica común. Los sistemas de memoria distribuida requieren una red de comunicación para conectar la memoria entre procesadores.



Los procesadores tienen su propia memoria local. Las direcciones de memoria en un procesador no se asignan a otro procesador, por lo que no existe un concepto de espacio de direcciones global en todos los procesadores.



Debido a que cada procesador tiene su propia memoria local, opera de manera independiente. Los cambios que realiza en su memoria local no tienen efecto en la memoria de otros procesadores. Por lo tanto, el concepto de coherencia de caché no se aplica.



Cuando un procesador necesita acceder a los datos en otro procesador, generalmente es tarea del programador definir explícitamente cómo y cuándo se comunican los datos. La sincronización entre tareas es responsabilidad del programador.



El "tejido" de red utilizado para la transferencia de datos varía ampliamente, aunque puede ser tan simple como Ethernet.

Ventajas: 

La memoria es escalable con el número de procesadores. Aumenta la cantidad de procesadores y el tamaño de la memoria aumenta proporcionalmente.



Cada procesador puede acceder rápidamente a su propia memoria sin interferencias y sin los gastos generales incurridos al tratar de mantener la coherencia de caché global.



Rentabilidad: puede utilizar productos básicos, procesadores estándar y redes.

Desventajas: 

El programador es responsable de muchos de los detalles asociados con la comunicación de datos entre procesadores.



Puede ser difícil asignar las estructuras de datos existentes, basadas en la memoria global, a esta organización de memoria.



Tiempos de acceso a la memoria no uniformes: los datos que residen en un nodo remoto tardan más en acceder a los datos locales del nodo.

3.9.3. Memoria hibrida distribuida-compartida Características Generales: 

Las computadoras más grandes y rápidas del mundo hoy en día emplean arquitecturas de memoria compartida y distribuida.



El componente de memoria compartida puede ser una máquina de memoria compartida y / o unidades de procesamiento de gráficos (GPU).



El componente de memoria distribuida es la conexión en red de múltiples máquinas de memoria compartida / GPU, que solo conocen su propia memoria, no la memoria de otra máquina. Por lo tanto, se requieren comunicaciones de red para mover datos de una máquina a otra.



Las tendencias actuales parecen indicar que este tipo de arquitectura de memoria continuará prevaleciendo y aumentará en el extremo superior de la computación en el futuro inmediato.

Ventajas y Desventajas: 

Lo que sea común a ambas arquitecturas de memoria compartida y distribuida.



El aumento de la escalabilidad es una ventaja importante



El aumento de la complejidad del programador es una desventaja importante

4. Aplicaciones  Ciencia e Ingenieria: 

Históricamente, la computación paralela ha sido considerada como "el extremo superior de la computación", y se ha utilizado para modelar problemas difíciles en muchas áreas de la ciencia y la ingeniería: o

Atmósfera, Tierra, Medio Ambiente.

o

Física: aplicada, nuclear, partículas, materia condensada, alta presión, fusión, fotónica.

o

Biociencia, Biotecnología, Genética.

o

Química, Ciencias Moleculares

o

Geología, sismología

o

Ingeniería mecánica - desde prótesis hasta naves espaciales.

o

Ingeniería Eléctrica, Diseño de Circuitos, Microelectrónica.

o

Informática, Matemáticas

o

Militar. defensa, Armas

o

Industrial y Comercial: 

Hoy en día, las aplicaciones comerciales proporcionan una fuerza motriz igual o mayor en el desarrollo de computadoras más rápidas. Estas aplicaciones requieren el procesamiento de grandes cantidades de datos de manera sofisticada. Por ejemplo: o

"Big Data", bases de datos, minería de datos

o

o

Inteligencia Artificial (IA)

o

Buscadores web, servicios empresariales basados en web.

o

Imagen médica y diagnóstico.

o

Diseño farmaceutico

o

Modelización financiera y económica.

o

Gestión de empresas nacionales y multinacionales.

o

Gráficos avanzados y realidad virtual, particularmente en la industria del entretenimiento.

o

Video en red y tecnologías multimedia.

o

Exploración de aceite

5. Terminología 

Como todo lo demás, la computación paralela tiene su propia "jerga". A continuación se enumeran algunos de los términos más comúnmente asociados con la computación paralela.



La mayoría de estos serán discutidos en más detalle más adelante.

Supercomputación / Computación de alto rendimiento (HPC) Usando las computadoras más grandes y rápidas del mundo para resolver grandes problemas. Nodo Un "ordenador en una caja" independiente. Por lo general, se compone de varias CPU / procesadores / núcleos, memoria, interfaces de red, etc. Los nodos están conectados en red para formar un supercomputador. CPU / Socket / Procesador / Core Esto varía, dependiendo de con quién hables. En el pasado, una CPU (Unidad central de procesamiento) era un componente de ejecución singular para una computadora. Luego, se incorporaron múltiples CPU a un nodo. Luego, las CPU individuales se subdividieron en múltiples "núcleos", cada uno de los cuales es una unidad de ejecución única. Las CPU con múltiples núcleos a veces se denominan "sockets", depende del proveedor. El resultado es un nodo con varias CPU, cada una con múltiples núcleos. La nomenclatura se confunde a veces. ¿Preguntarse por qué?

Tarea

Una sección lógicamente discreta del trabajo computacional. Una tarea es típicamente un programa o conjunto de instrucciones similar a un programa que es ejecutado por un procesador. Un programa paralelo consiste en múltiples tareas que se ejecutan en múltiples procesadores. Tubería Dividir una tarea en pasos realizados por diferentes unidades de procesador, con entradas que se transmiten a través de, como una línea de ensamblaje; Un tipo de computación paralela. Memoria compartida Desde un punto de vista estrictamente de hardware, describe una arquitectura de computadora donde todos los procesadores tienen acceso directo (generalmente basado en bus) a la memoria física común. En un sentido de programación, describe un modelo en el que todas las tareas paralelas tienen la misma "imagen" de memoria y pueden abordar y acceder directamente a las mismas ubicaciones de memoria lógica independientemente de dónde exista realmente la memoria física. Multiprocesador simétrico (SMP) Arquitectura de hardware de memoria compartida donde varios procesadores comparten un único espacio de direcciones y tienen igual acceso a todos los recursos. Memoria distribuida En hardware, se refiere al acceso a la memoria basado en la red para la memoria física que no es común. Como modelo de programación, las tareas solo pueden "ver" lógicamente la memoria de la máquina local y deben usar comunicaciones para acceder a la memoria en otras máquinas donde se ejecutan otras tareas. Comunicaciones Las tareas paralelas normalmente necesitan intercambiar datos. Hay varias formas en que esto se puede lograr, por ejemplo, a través de un bus de memoria compartida o a través de una red, sin embargo, el evento real de intercambio de datos se conoce comúnmente como comunicaciones, independientemente del método empleado. Sincronización La coordinación de tareas paralelas en tiempo real, muy a menudo asociada a las comunicaciones. A menudo se implementa mediante el establecimiento de un punto de sincronización dentro de una aplicación donde una tarea no puede continuar hasta que otra (s) tarea (s) alcance el mismo punto o el punto lógicamente equivalente. La sincronización generalmente implica esperar por al menos una tarea y, por lo tanto, puede hacer que aumente el tiempo de ejecución del reloj de pared de una aplicación paralela. Granularidad

En la computación en paralelo, la granularidad es una medida cualitativa de la relación entre computación y comunicación. o

Grueso: se realizan cantidades relativamente grandes de trabajo computacional entre eventos de comunicación

o

Fino: se realizan cantidades relativamente pequeñas de trabajo computacional entre eventos de comunicación.

Aceleración observada Aceleración observada de un código que ha sido paralelizado, definido como: reloj de pared de ejecución en serie ----------------------------------reloj de pared de ejecución paralela Uno de los indicadores más simples y más utilizados para el desempeño de un programa paralelo. Sobrecarga paralela La cantidad de tiempo requerido para coordinar tareas paralelas, en lugar de hacer un trabajo útil. La sobrecarga paralela puede incluir factores tales como: o

Tiempo de inicio de la tarea

o

Sincronizaciones

o

Transmisión de datos

o

Gastos generales de software impuestos por lenguajes paralelos, bibliotecas, sistema operativo, etc.

o

Hora de finalización de la tarea

Masivamente paralelo Se refiere al hardware que comprende un sistema paralelo dado, que tiene muchos elementos de procesamiento. El significado de "muchos" sigue aumentando, pero en la actualidad, las computadoras paralelas más grandes están compuestas por elementos de procesamiento que suman cientos de miles a millones. Avergonzadamente paralelo Resolviendo muchas tareas similares, pero independientes simultáneamente; Poco o ninguna necesidad de coordinación entre las tareas. Escalabilidad

Se refiere a la capacidad de un sistema paralelo (hardware y / o software) para demostrar un aumento proporcional en la aceleración paralela con la adición de más recursos. Los factores que contribuyen a la escalabilidad incluyen: o

Hardware: en particular, ancho de banda de memoria-CPU y propiedades de comunicación de red

o

Algoritmo de aplicación

o

Gastos generales paralelos relacionados

o

Características de su aplicación específica.

6. Referencias “Introducción a la computación paralela”, Blaise Barney, Laboratorio Nacional Lawrence Livermore "Introducción a la computación paralela". Ananth Grama, Anshul Gupta, George Karypis, Vipin Kumar. "Resumen de las supercomputadoras recientes". AJ van der Steen, Jack Dongarra. https://computing.llnl.gov/tutorials/parallel_comp/?fbclid=IwAR0ASc6jLwAXCt_eOhMU5fjry5mKn44BOTwUKOydA34jD-YiO-e4s1pwEE#Neumann https://es.wikipedia.org/wiki/Computaci%C3%B3n_paralela#Paralelismo_de_grano_fino,_grano_g rueso_y_paralelismo_vergonzoso