MIMD

=2.MIMD Múltiples Secuencias de Instrucción y Múltiples Secuencias de datos= toc



Es una técnica empleada para alcanzar el paralelismo, las maquinas que usan la arquitectura MIMD tienen un cierto número de procesadores que funcionan asincrónicamente y son independientes unos de otros. En cualquier momento pueden estar ejecutando diferentes instrucciones en diferentes partes de datos. Esta categoría la podemos subdividir en multiprocesadores que serian maquinas con memoria compartida y multicomputadoras es decir maquinas que transfieren mensajes.

=2.1 Multiprocesadores=

Los multiprocesadores se subdividen en tres clases y se distinguen por la forma en la que se implementa la memoria compartida, pueden ser acceso uniforme a memoria UMA(Uniform Memory Access), acceso no uniforme a la memoria NUMA(NonUniform Memory Access) y sólo acceso a memoria cache COMA(Cache Only Memory Access). Los multiprocesadores tienen la ventaja de que los programas creados accedan a cualquier localidad de memoria sin importar la topología interna por lo tanto un programa puede funcionar en cualquiera de sus tipos, en cambio no tiene mucha escalabilidad ya que no pueden crearse en grandes tamaños y sus costos son elevados.

2.1.1 Acceso Uniforme a memoria(UMA).
Las máquinas de esta categoría tienen la propiedad de que cada CPU tiene el mismo tiempo de acceso a todos los módulos de memoria, esto quiere decir que todas las palabras se pueden leer con la misma rapidez pero como esto es muy difícil de lograr técnicamente, los accesos más rápidos se atrasan para que tarden lo mismo que los accesos más lentos, esto permite que el comportamiento sea predecible para ayudar a escribir el código eficiente.

**2.1.1.1 Arquitecturas SMP basadas en el Bus UMA**
Las maquinas que sencillas tienen un solo bus que va desde el cpu hasta la memoria, pero en la arquitectura SMP hay 2 o más procesadores intentando acceder a la memoria, estos mandan señales para detectar si el bus está siendo usado por otro procesador. La característica principal de esta arquitectura es que todos los procesadores son jerárquicamente iguales y pueden ejecutar tareas indistintamente, además de esto comparten todos los recursos del sistema como memoria principal, almacenamiento secundario y entrada/salida.

Debido a que el bus se puede encontrar ocupado existen diferentes tipos de estas implementaciones por ejemplo en la imagen de abajo vemos como en el tipo 1 seria tolerable que dos o tres procesadores se comuniquen de esta manera pero con mas procesadores por ejemplo 32 procesadores conectados de esta manera provocaría que el sistema este limitado por el ancho de banda del bus, en el tipo 2 muchas de las consultas se pueden atender en la cache por lo tanto provoca menos tráfico en el bus y en el tipo 3 existe una memoria privada en esta se colocaría instrucciones o datos que ocuparía cada procesador y en la memoria compartida se colocarían variables compartidas este tipo requiere la colaboración constante del compilador.



**2.1.1.2 Multiprocesadores UMA conmutados**
Debido a la limitación que presenta el bus en la conexión de múltiples procesadores, para rebasar ese problema existe un tipo de interconexión distinto como el conmutador de barras cruzadas.



Este tipo de interconexión una malla en la que las líneas horizontales están conectadas a procesadores y las líneas verticales están conectadas a memoria, en cada intersección hay un punto de cruce que es un conmutador el cual se puede abrir o cerrar eléctricamente, esto permite que varias consultas se hagan a memoria sin que estas se interrumpan, el numero de combinaciones posibles es muy grande pero la desventaja de la conmutación de barras es que el número de puntos de cruce aumenta en proporción a n al cuadrado es decir si por ejemplo conectaáramos 1000 CPU con 1000 unidades de memoria tendríamos un millón de puntos de cruce.

**2.1.2 Acceso no uniforme a memoria(NUMA).**
A diferencia de los multiprocesadores UMA que están limitados por el bus y las formas de evitar este problema son muy costosas en hardware este problema principalmente es por la necesidad de tener un acceso a memoria uniforme, en contraste los procesadores UMA precisamente pasan por alto el tiempo de acceso entonces el tiempo de acceso a módulos de memoria locales es mucho mas rápido que el acceso a módulos remotos. Los programas UMA se pueden ejecutar en las máquinas NUMA pero con diferente desempeño. Esta arquitectura tiene la siguientes características: Los dos tipos de NUMA se dan porque en el NC-NUMA no tiene caches entre el procesador y el acceso a memoria remota por ejemplo:
 * 1) Tienen un solo espacio de direcciones visible para todas las CPU
 * 2) El acceso a la memoria remota se efectúa con instrucciones LOAD y STORE
 * 3) El acceso a la memoria remota es más lento que el local.



En cambio en el CC-NUMA si existe este cache, en este tipo de Arquitectura hay que tener en cuenta la coherencia de cache ya que si se pasara por alto un procesador podría hacer una petición de un dato a cache pero este ya había cambiado en la memoria remota provocando que el cálculo sea erróneo.



Una manera de evitar este problema como vemos en la imagen de arriba es el multiprocesador basado en directorios, este tiene una base de datos que dice donde esta cada línea de cache y cuál es su estado. Cuando el procesador realiza una petición a cache se realiza una consulta al directorio para saber dónde está y si su estado ya fue cambiado.

2.1.3 Multiprocesadores de acceso sólo a memoria cache(COMA)
En estas maquinas se busca superar las graves restricciones que tienen tanto el UMA como en NUMA el primero limitado por costos y tamaño y el segundo limitado por tiempos de acceso, el COMA busca utilizar la memoria principal de cada CPU como cache, esta arquitectura no es tan ampliamente utilizada ya que también presenta graves problemas como localizar las líneas de cache.

=2.2 Multicomputadoras=

Las multicomputadoras se caracterizan porque con computadoras paralelas en las que cada CPU tiene su propia memoria privada, la cual no es accesible directamente por ninguna otra CPU. Una multicomputadora está compuesta por nodos, en cada nodo se puede colocar uno o varios CPU, RAM, almacenamiento secundario, y dispositivos de entrada/salida. Los diferentes tipos tienen en común que cuando un programa ejecuta la operación send se avisa al nodo central y este transfiere los datos.



La imagen de arriba es una ilustración genérica de una multicomputadora, basándose en este modelo existen muchos tipos pero se distinguen dos principales el MPP procesadores masivamente paralelos y el COW.

2.2.1 Procesadores masivamente paralelos
Estos son supercomputadoras que tienen un precio muy elevado las usan generalmente en investigaciones científicas e industria para cálculos muy grandes. Aunque en un principio se usaban mas para investigación científica ahora se utilizan mas comercialmente. Se dice que han desplazado en gran medida a las máquinas SIMD, las supercomputadoras vectoriales y los procesadores de arreglos.

Los MPP utilizan CPU estándar pero lo que los diferencia en gran medida es que utilizan una red de interconexión de gran desempeño que puede transferir mensajes con baja latencia y gran ancho de banda. Otra característica es su gran capacidad de E/S, como mucho de los problemas consumen muchos datos es lógico pensar que estos se encuentran almacenados en muchos discos de almacenamiento secundario, y otra característica importante es que tiene mucha escalabilidad y tolerancia a fallos si un nodo deja de funcionar el sistema puede seguir funcionando sin el.

2.2.2 Cúmulos de estaciones de trabajo(COW).
Un cúmulo de estaciones de trabajo no difiere mucho de un MPP, es un grupo de PC conectadas por una tarjeta de red comercial, la principal diferencia es que los nodos que lo componen se construyen con componentes comerciales, existen dos tipos de COW los centralizados y los descentralizados.

Los centralizados es un cúmulo de estaciones que está montado en un rack muy grande en un solo lugar, generalmente se empaquetan en forma maás compacta y por lo tanto no tienen periféricos solo tienen tarjetas de red y discos de almacenamiento. Los descentralizados están dispersas en una zona generalmente pueden ser heterogéneas y están conectadas por una conexión mas común se utilizan para realizar trabajos mientras la máquina de lo contrario estaráa sin hacer nada. Un buen ejemplo de un COW descentralizado podría ser el cúmulo de computadoras voluntarias al proyecto SETI.