Está en la página 1de 29

Multiple Instruction, Multiple Data (MIMD):

hay múltiples unidades de procesamiento, en la cual cada una tiene tanto


instrucciones como información separada. Cada elemento ejecuta una instrucción
distinta en un elemento de información distinto. Los elementos de proceso trabajan
asíncronamente. Los clusters son ejemplo son ejemplos del modelo MIMD.

Tipos de paralelismo

Paralelismo a nivel de bit:

Se habla de paralelismo al nivel de bit, cuando se aumenta el tamaño de la palabra


del procesador (tamaño de la cadena de bits a procesar). Este aumento reduce el
número de instrucciones que tiene que ejecutar el procesador en variables cuyos
tamaños sean mayores a la longitud de la cadena.

Ejemplo: En un procesador de 8-bits sumar dos números de 16bits tomaría dos


instrucciones. En un procesador de 16-bits esa operación requiere solo una
instrucción.

28
Nota: este método está “estancado” desde el establecimiento de las arquitecturas
de 32 y 64 bits.

Paralelismo a nivel de instrucción

Este tipo de paralelismo consiste en cambiar el orden de las intrucciones de un


programa y juntarlas en grupos para posteriormente ser ejecutados en paralelo sin
alterar el resultado final del programa.

Pipelining

El pipelining proviene de la idea de que en una tubería no es necesario esperar a


que todo el agua dentro salga, para que pueda entrar más. Los procesadores
modernos tienen un 'pipeline' que separa las instrucciones en varias etapas, donde
cada etapa corresponde a una acción diferente que necesita la salida de la
anterior.

Ejemplo: Un pipeline de 5 etapas: fetch (buscar la instrucción), decode


(decodificarla), execute (ejecutarla), write (escribir en memoria el resultado de la
operación).

29
En el gráfico anterior se observa el procesamiento de dos instrucciones sin pipeline,
tomando un tiempo de 8 ciclos, y con pipeline reduciendo este tiempo a solo 5 ciclos.

Paralelismo a nivel de datos

Cada procesador realiza la misma tarea sobre un subconjunto independiente de


datos.
Ej: Dos granjeros se dividen el área de césped a podar.

El caso clásico de paralelismo de datos, es el cálculo de pi por partes usando el


método de monte carlo:

Ejemplo hecho en python

Paralelismo a nivel de tareas

Cada hilo realiza una tarea distinta e independiente de las demás.


Ej: Un granjero poda el césped, el otro cosecha.

30
Patrones de diseño paralelo

Los patrones se han establecido como buenas practicas a la hora de realizar


ingeniería de software.

Los patrones de control en el caso de la programación paralela son maneras de


combinar la distribución de los procesos y el acceso a los datos para la solucion de
un problema.

Fork-Join

En este patrón de diseño se generan dos ejecuciones concurrentes, que empieza


inmediatamente después de que el fork es llamado en código, después, se usa join
para combinar estas dos ejecuciones concurrentes en una. Cada join puede unirse
entonces a su fork correspondiente y lo hace antes de las otras terminen. El lenguaje
de programación Java usa este patrón para permitir la programación en paralelo.

31
Map

Map es un patrón que replica una función sobre todos los elementos de un conjunto
de entrada. La función que está siendo replicada se llama función elemental, dada
que la misma se aplica a una coleccion real de datos.

Stencil

Stencil es un generalización del patron de Map, en el cual una función elemental


tiene acceso no solo a un elemento del conjunto de entrada sino también a un
conjunto de "vecinos"

Como la estructura de datos no es infinita se deben tener en cuenta el manejo de


excepciones para los bordes de la misma.

32
Reducción

Una reducción combina cada elemento de una colección en uno solo utilizado una
función asociativa conocida como función combinatoria. Como es asociativa las
tareas se pueden distribuir de muchas maneras y si la función resultara ser también
conmutativa el número de posibilidides aumentaría aún más.

Scan

Scan realiza las reducciones de cada elemento perteneciente a una estructura. En


otras palabras cada elemento de salida es la reduccion de un elemento de entrada.
A traves de una función sucesora se avanza de un estado al otro haciendo folds en
el proceso asociativo.

33
ParBegin - ParEnd

Parbegin y Parend originalmente propuesto por Dijsktra es un patrón para lenguajes


estructurados en bloque como Pascal y permiten una especificación explicita del
paralelismo, todo lo que esté contenido entre ambos será ejecutado en hilos
separados en tanto se necesite y se genera un grafo de precedencia como el que se
ve en la imagen, donde se muestra simplemente el orden de las instrucciones a
ejecutar.

Maestro / Esclavo

Es usada cuando se tienen dos o más procesos que necesitan ejecutarse


simultanea y continuamente pero a diferentes velocidades. Si estos procesos corren
en un único ciclo, pueden suceder problemas de temporización graves. Estos
problemas de temporización ocurren cuando una parte del ciclo tarda más en
ejecutarse de lo esperado. Si esto sucede, la sección restante del ciclo se atrasa. El
patrón Maestro/Esclavo consiste en múltiples ciclos en paralelo. Un ciclo actúa como
el maestro y los otros como esclavos. El ciclo maestro controla a todos los demás.

34
SPMD - SIMD

Esto viene de la taxonomia Flynn SPMD (Single Program, Multiple Data), múltiples
procesadores autónomos ejecutan simultáneamente el mismo programa en puntos
independientes, SIMD (Single instructon, multiple data) está basado en organizar los
datos relevantes al problema en estructuras de datos iterativas como arreglos y en
definir la computación en términos de una secuencia de actualizaciones paralelas en
paralelo con estas estructuras de datos.

Creación de hilos y procesos

Los hilos se distinguen de los tradicionales procesos en que los procesos son
generalmente independientes, llevan bastante información de estados, e interactúan
sólo a través de mecanismos de comunicación dados por el sistema. Por otra parte,
muchos hilos generalmente comparten otros recursos directamente. En muchos de
los sistemas operativos que proveen facilidades para los hilos, es más rápido
cambiar de un hilo a otro dentro del mismo proceso, que cambiar de un proceso a
otro.

Arquitecturas de memoria de computación paralela

Memoria compartida

 Los procesos comparten un espacio de memoria común


 Escriben y leen de manera asíncrona
 No es necesario especificar cómo se comunican los datos entre las tareas
 Se usan semáforos o locks para controlar el acceso a la memoria compartida

35
Uniform Memory Access (UMA):

 Lo más comúnmente representado hoy por las máquinas Symmetric


Multiprocessor (SMP)
 Procesadores idénticos
 Igual acceso y tiempos de acceso a la memoria
 Si un procesador actualiza una ubicación en memoria compartida, todos los
demás procesadores saben sobre la actualización, esto es llamado
coherencia del caché

Non-Uniform Memory Access (NUMA)

 Hecho 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 igual tiempo de acceso a toda la memoria
 El acceso a la memoria es más lento
 Si se mantiene la coherencia del caché.

36
Memoria distribuida

Esta arquitectura se basa en múltiples procesadores con su propia memoria física


privada, las tareas pueden operar solo con información local y se necesita de la
comunicación para obtener información remota, a través también de procesadores
remotos Hay cuatro implementaciones que pueden servir como ejemplo conocidas
para esta arquitectura tales como: múltiples sistemas operativos, Middlewares,
clusters y grids. Las razones por las que se prefiere esta arquitectura en ciertos
escenarios es porque en principio se pueden añadir tantas unidades de
procesamiento como la red pueda soportar, pero las limitaciones recaen
directamente en ella.

 También llamado modelo de paso de mensajes


 requieren una red de comunicación para conectar la memoria entre
procesadores
 Las tareas intercambian datos por medio del paso y recepción de mensajes
 Los procesadores tienen su propia memoria local. Las direcciones de
memoria en un procesador no se asignan a otro procesador, por lo que no
hay concepto de espacio de direcciones global en todos los procesadores.
 Debido a que cada procesador tiene su propia memoria local, funciona
independientemente. Los cambios que hace en su memoria local no tienen
ningún efecto en la memoria de otros procesadores. Por lo tanto, el concepto
de coherencia de caché no se aplica.
 Cuando un procesador necesita acceso a los datos de otro procesador, suele
ser la tarea del programador definir explícitamente cómo y cuándo se
comunican los datos. La sincronización entre tareas también es
responsabilidad del programador.

Ejemplos de memoria distribuida

 Clusters: Colección de computadores que se encuentran interconectados


mediante redes de alta velocidad (Ethernet, SCI, Myrinet, Infiniband) Existe
una categorización hecha por la organización TOP500 que lleva cuenta de los
clusteres más poderosos de la tierra con capacidad de procesamiento del

37
órden de gigaflops. Estos generalmente están basados en una arquitectura
MIMD.
 Grids: Computadores de múltiples dominios administrativos conectados para
solucionar una tarea determinada.

Hibrido memoria distribuida - comopartida

 Es la combinación entre memoria compartida y memoria distribuida, con sus


ventajas en común.
 Su principal ventaja es su escalabilidad.
 Su principal desventaja es que la complejidad de programación aumenta.

38
Hilos

 Un proceso pesado puede convertirse en varios procesos livianos ejecutados


de manera concurrente.
 Se pueden describir como una subrutina dentro del programa principal.
 Se comunican entre ellos a través de la memoria global.

Datos en paralelo

 También conocido como PGAS (Partitioned Global Address Space)


 Una serie de tareas trabajan de manera colectiva en la misma estructura de
datos
 Las tareas realizan la misma operación, pero cada una en su partición pero
cada tarea trabaja en una partición diferente de ésta

39
Sincronización

 Administrar la secuencia de trabajo y las tareas que lo realizan es una


consideración crítica del diseño para la mayoría de los programas
paralelos.
 Puede ser un factor significativo en el desempeño del programa, pues un
diseño de sincronización adecuado reduce el tiempo overhead.
 A menudo requiere "serialización" de segmentos del programa.

Sincronización Mínima:

1. Identificar suficiente concurrencia en la descomposición del problema.


2. Decidir cómo manejarla: distribución estática o dinámica.
3. Determinar el grado de granularidad y cómo explotar la concurrencia.
4. Reducir serialización y costes de sincronización.

40
Paralelismo y la concurrencia

1. Identificar suficiente concurrencia

Paralelismo por Tareas:

 Grandes tareas (procedimientos) pueden realizarse en paralelo


 No suele haber muchas tareas, no aumenta con el tamaño del problema
 Dificultad para aplicar balanceo de carga

Paralelismo por Datos:

 Más escalable, proporcional al tamaño del problema


 Es factible aplicar balanceo de carga

2. Manejando concurrencia

Técnicas estáticas:

 Asignación basada en la entrada


 Bajo overhead
 Siempre que sea posible, es preferible

Técnicas dinámicas:

 Adapta el balanceo en tiempo de ejecución


 Aumenta la comunicación y el overhead

3. Determinación de la granularidad

Grano grueso: pocas oportunidades de balanceo de carga. Grano fino: mayor


overhead, mayor comunicación, más sincronización.

41
4. Reducir la serialización

Sincronización de eventos:

 Global versus punto a punto


 Sincronización a bajo nivel produce mayor cantidad de sincronizaciones

Exclusión mutua:

 Regiones críticas pequeñas


 Dispersar las regiones críticas en el tiempo

Tipos de sincronización

Barrier

 Todas las tareas están involucradas


 Cada tarea realiza su trabajo hasta que alcanza la barrera. Después, se
detiene o "bloquea".
 Cuando la última tarea llega a la barrera, todas las tareas se sincronizan.

Lo que sucede a partir de aquí varía. Algunas veces, una sección del código debe
ser ejecutada en serie. En otros casos, las tareas se liberan automáticamente para
continuar su trabajo.

42
Lock - bloqueo / semaphore - semáforo

 Puede involucrar cualquier número de tareas


 Se utiliza para serializar el acceso a datos globales o a una sección de código.
Sólo una tarea a la vez se puede ejecutar.
 La primera tarea en llegar al lock "lo bloquea". Esta tarea puede acceder de
forma segura (en serie) a los datos protegidos o al código.
 Otras tareas pueden intentar adquirir el lock pero deben esperar hasta que la
tarea que posee el bloqueo lo libere.

Operaciones de comunicación sincrónica

 Incluye sólo aquellas tareas que ejecutan una operación de comunicación


 Cuando una tarea realiza una operación de comunicación, se requiere alguna
forma de coordinación con las otras tareas que participan en la comunicación.
 Antes de que una tarea pueda realizar una operación de envío, primero debe
recibir un aviso del receptor sobre si está disponible para enviar.

Se utilizan las funciones send y recieve para coordinar las acciones.

43
Balanceador de carga

Se refiere a la práctica de distribuir cantidades aproximadamente iguales de trabajo


entre las tareas, de modo que todas las tareas se mantengan ocupadas todo el
tiempo. Se puede considerar una minimización del tiempo de inactividad de la tarea.

 Asignar el trabajo que recibe cada tarea equitativamente


 Puede ser un factor significativo en el desempeño del programa
 A menudo requiere "serialización" de segmentos del programa.

Asignación de trabajo dinámico

Ciertas clases de problemas producen desequilibrios de carga incluso si los datos


están distribuidos uniformemente entre las tareas

 Cuando la cantidad de trabajo que realiza cada tarea es variable o no se


puede predecir, puede ser útil usar un planificador - task pool approach.
Cuando cada tarea termina su trabajo, espera en una cola para obtener una
nueva pieza de trabajo.
 Puede ser necesario diseñar un algoritmo que detecte y maneje
desequilibrios de carga como ocurren dinámicamente dentro del código.

44
Paralelismo automático versus Paralelismo manual

Paralelismo automático

 El compilador analiza el codigo fuente e identifica oportunidades de


paralelismo
 Los ciclos son los objetivos mas frecuentes para una paralelizacion
automatica
 El analisis incluye identificar inhibidores al paralelismo y posiblemente un
costo en, si el paralelismo puede o no mejorar el rendimiento
 un ejemplo de este tipo puede ser OpenMP

Paralelismo manual

 Usando las directivas del compilador el programador explicitamente le dice al


compilador como quiere paralelizar el codigo
 Se puede usar o complementar en algun grado con paralelizacion automatica.

Medidas de Rendimiento Aplicada a la Computación Paralela

Tiempo de respuesta

Es el tiempo que tarda en ejecución un determinado programa, programa A.

45
MIPS - MFLOPS

MIPS - Millones de operaciones por segundo. MFLOPS - Millones de operaciones de


punto flotante por segundo.

Eficiencia

La eficiencia del programa se mide en el costo de ejecucion.

SpeedUp

El SpeedUp resresenta la ganacia que se obtiene en la version paralela del


programa respecto a la version secuencial del mimo.

46
Ley de Amdahl

El incremento de velocidad de un programa utilizando múltiples procesadores en


computación paralela está limitada por la fracción secuencial del programa. Sea f el
porcentaje paralelizado del programa expresado en decimal, la ley de Amdahl dice
que llega un punto en el cual sin importar que el numero de procesadores sea muy
alto , el speedup se va a comportar de manera lineal ; esto de acuerdo al porcentaje
que este paralelizado el codigo. El speedup de un programa con un fragmento
paralelizado se calcula con :

Lenguajes que integran el paradigma del Paralelismo

Actualmente, existe una variedad de lenguajes de programación con un enfoque


multiparadigma, los cuales permiten tener flexibilidad a la hora de querer lograr un
objetivo en cuanto a un determinado tipo de programación. Igualmente, los
lenguajes suelen complementar dicho comportamiento con librerías, APIs o
frameworks (ya sean comunitarios o privativos), los cuales le permiten al
programador el disponer de herramientas de trabajo.

47
El paradigma paralelo es implementado, en la mayoría de los lenguajes más
conocidos actualmente, a través de dichas herramientas o componentes. En la
imagen, se hace un recuento de herramientas específicas de algunos de esos
lenguajes, mencionando que no son las únicas que existen.

Del mismo modo, hay otras herramientas más aplicadas a un campo específico que
se sirven del paradigma paralelo para mejorar sus servicios, como por ejemplo
CUDA, el cual es una plataforma para trabajar con algoritmos de nVidia usando GPU.
También, se puede dar el ejemplo de Apache Spark, el cual es un framework para
realizar análisis de BigData. Cada uno de ellos tiene su propias APIs para poder
configurar comportamientos paralelos en los algoritmos que se quieran desarrollar.

Lenguajes de programación

48
Ejemplo de Programación Paralela en Java

Supermercado

En este ejemplo elaborado mediante el uso de objetos en java se simula el proceso


de compra en un supermercado, para esto se tiene la clase cliente y la clase cajero
que es la que se va a paralelizar mediante la herencia de la clase Thread.

public class CajeraThread extends Thread {


private String nombre;
private Cliente cliente;
private long initialTime;
// Constructor, getter & setter

@Override
public void run() {

49
System.out.println("La cajera " + this.nombre + " COMIENZA A
PROCESAR LA COMPRA DEL CLIENTE "
+ this.cliente.getNombre() + " EN EL
TIEMPO: "
+ (System.currentTimeMillis() -
this.initialTime) / 1000
+ "seg");
for (int i = 0; i < this.cliente.getCarroCompra().length; i++) {
this.esperarXsegundos(cliente.getCarroCompra()[i]);
System.out.println("Procesado el producto " + (i + 1)
+ " del cliente " + this.cliente.getNombre() + "->Tiempo: "
+ (System.currentTimeMillis() - this.initialTime) / 1000
+ "seg");
}
System.out.println("La cajera " + this.nombre + " HA TERMINADO
DE PROCESAR "
+ this.cliente.getNombre() + "
EN EL TIEMPO: "
+ (System.currentTimeMillis() -
this.initialTime) / 1000
+ "seg");
}

private void esperarXsegundos(int segundos) {


try {
Thread.sleep(segundos * 1000);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}

public class MainThread {

50
public static void main(String[] args) {

Cliente cliente1 = new Cliente("Cliente 1", new int[] { 2, 2, 1, 5, 2,


3 });
Cliente cliente2 = new Cliente("Cliente 2", new int[] { 1, 3, 5, 1, 1 });

// Tiempo inicial de referencia


long initialTime = System.currentTimeMillis();
CajeraThread cajera1 = new CajeraThread("Cajera 1", cliente1,
initialTime);
CajeraThread cajera2 = new CajeraThread("Cajera 2", cliente2,
initialTime);

cajera1.start();
cajera2.start();
}
}

Supermercado

Se inicializan los dos hilos, luego se imprime en pantalla cada vez que se pasen los
productos en cada cajero.
Se puede observar como se realiza de forma paralela la compra en cada cajero.

Resultados obtenidos al ejecutar el programa para los casos de ejemplo descritos en


el main haciendo uso de dos hilos de trabajo.

cajera Cajera 1 COMIENZA A PROCESAR LA COMPRA DEL CLIENTE Cliente 1


EN EL TIEMPO: 0seg
La cajera Cajera 2 COMIENZA A PROCESAR LA COMPRA DEL CLIENTE Cliente 2
EN EL TIEMPO: 0seg
Procesado el producto 1 del cliente Cliente 2->Tiempo: 1seg
Procesado el producto 1 del cliente Cliente 1->Tiempo: 2seg

51
Procesado el producto 2 del cliente Cliente 2->Tiempo: 4seg
Procesado el producto 2 del cliente Cliente 1->Tiempo: 4seg
Procesado el producto 3 del cliente Cliente 1->Tiempo: 5seg
Procesado el producto 3 del cliente Cliente 2->Tiempo: 9seg
Procesado el producto 4 del cliente Cliente 2->Tiempo: 10seg
Procesado el producto 4 del cliente Cliente 1->Tiempo: 10seg
Procesado el producto 5 del cliente Cliente 2->Tiempo: 11seg
La cajera Cajera 2 HA TERMINADO DE PROCESAR Cliente 2 EN EL TIEMPO:
11seg
Procesado el producto 5 del cliente Cliente 1->Tiempo: 12seg
Procesado el producto 6 del cliente Cliente 1->Tiempo: 15seg
La cajera Cajera 1 HA TERMINADO DE PROCESAR Cliente 1 EN EL TIEMPO:
15seg

52
Algunas Terminologías de la Computación Paralela

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 utilizados asociados con la computación
paralela.

Supercomputación / Computación de alto rendimiento (HPC)

Utilizando las computadoras más grandes y rápidas del mundo para resolver
grandes problemas.

Nodo

Una "computadora en una caja" independiente. Por lo general, se compone de


múltiples CPU / procesadores / núcleos, memoria, interfaces de red, etc. Los nodos
están conectados en red para formar una supercomputadora.

CPU / Socket / Procesador / Núcleo

Esto varía, dependiendo de con quién hable. En el pasado, una CPU (Unidad
Central de Procesamiento) era un componente de ejecución singular para una
computadora. Luego, se incorporaron varias CPU en un nodo. Luego, las CPU
individuales se subdividieron en múltiples "núcleos", cada uno siendo una unidad de
ejecución única. Las CPU con varios núcleos a veces se denominan "sockets",
según el proveedor. El resultado es un nodo con varias CPU, cada una de las cuales
contiene varios núcleos. La nomenclatura se confunde a veces. ¿Preguntarse por
qué?

Tarea

Una sección lógicamente discreta de trabajo computacional. Una tarea es


típicamente un programa o un conjunto de instrucciones similar a un programa que
es ejecutado por un procesador. Un programa paralelo consta de varias tareas que
se ejecutan en varios procesadores.

53
Canalización

Dividir una tarea en pasos realizados por diferentes unidades de procesador, con
entradas que fluyen, 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 solo espacio de direcciones y tienen el mismo acceso a todos los
recursos.

Memoria distribuida

En hardware, se refiere al acceso a la memoria basada 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 utilizar las
comunicaciones para acceder a la memoria en otras máquinas donde se están
ejecutando otras tareas.

Comunicaciones

Las tareas paralelas normalmente necesitan intercambiar datos. Hay varias formas
en que esto se puede lograr, como a través de un bus de memoria compartida o en
una red, sin embargo, el evento real de intercambio de datos se conoce
comúnmente como comunicaciones, independientemente del método empleado.

54
Sincronización

La coordinación de tareas paralelas en tiempo real, muchas veces asociadas a las


comunicaciones. A menudo se implementa estableciendo un punto de
sincronización dentro de una aplicación donde una tarea puede no continuar hasta
que otra (s) tarea (s) alcance el mismo punto o un punto lógicamente equivalente.

La sincronización generalmente implica la espera de al menos una tarea y, por lo


tanto, puede aumentar el tiempo de ejecución del reloj de pared de una aplicación
paralela.

Granularidad

En la computación paralela, la granularidad es una medida cualitativa de la relación


entre computación y comunicación.

Grueso: se realizan cantidades relativamente grandes de trabajo computacional


entre eventos de comunicación

Bien: 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:

tiempo de reloj de pared de ejecución en serie


-----------------------------------
tiempo de 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 necesaria para coordinar tareas paralelas, en lugar de realizar


un trabajo útil. La sobrecarga paralela puede incluir factores como:

55
 Hora de inicio de la tarea
 Sincronizaciones
 Transmisión de datos
 Sobrecarga de software impuesta por lenguajes paralelos, bibliotecas,
sistema operativo, etc.
 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
actualmente, las computadoras paralelas más grandes están compuestas por
elementos de procesamiento que se cuentan entre cientos de miles y millones.

Vergonzosamente paralelo

Resolver muchas tareas similares pero independientes simultáneamente; poca 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:

Hardware, especialmente los anchos de banda de la CPU de memoria y las


propiedades de comunicación de red

 Algoritmo de aplicación
 Relacionado con gastos indirectos paralelos
 Características de su aplicación específica.

56

También podría gustarte