# SPMD

En computación, SPMD (single program, multiple data o un programa, múltiples datos) es una técnica empleada para lograr paralelismo; considerado una subcategoría de MIMD. Las tareas son separadas y ejecutadas simultáneamente en múltiples procesadores con diferentes entradas para obtener los resultados con mayor rapidez. SPMD es el estilo más común de programación paralela. Es también un prerrequisito para las definiciones investigativas tales como mensajes activos y memoria compartida distribuida.
Taxonomía de Flynn :
| | Una Instrucción | Múltiples Instrucciones |
| Un Dato | SISD | MISD |
| Múltiples Datos | SIMD | MIMD |

## SPMD vs SIMD

En SPMD, múltiples procesadores autónomos ejecutan simultáneamente el mismo programa en puntos independientes, contrario al lockstep que SIMD impone sobre los diferentes datos. Con SPMD, las tareas pueden ser ejecutadas sobre CPU de propósito general. SIMD requiere un vector de procesadores para manipular el flujo de datos. Note que las dos técnicas no son mutuamente exclusivas.

## Memoria Distribuida

SPMD usualmente se refiere a la programación de traspaso de mensajes sobre arquitecturas de computadoras con memoria distribuidas. Una computadora con memoria distribuida consta de una colección de ordenadores independientes llamados nodos. Cada nodo inicia su propio programa y se comunica con los otros nodos, enviando y recibiendo mensajes, utilizando las rutinas enviar/recibir, destinadas a este propósito. También, la sincronización barrera debe ser implementada usando mensajes. Los mensajes pueden ser enviados por un número de mecanismos de comunicación, tales como TCP/IP sobre Ethernet, o específicamente una interconexión de alta velocidad como Myrinet y Supercomputer Interconnect. Las secciones secuenciales de un programa son implementadas por un cálculo idéntico en todos los nodos, contrario a computar un resultado sobre un nodo específico y enviarlo a los restantes. Hoy en día, el programador es aislado de los detalles del traspaso de mensajes a partir del uso de interfaces estándar, como son PVM y MPI. La memoria distribuida es el estilo de programación utilizado en supercomputadoras paralelas de investigación propia en Beowulf clusters destinado a los grupos más grandes de la Teragrid.

## Memoria Compartida

En una máquina con memoria compartida (una computadora con muchos CPU que acceden al mismo espacio de memoria), los mensajes pueden ser enviados depositando sus contenidos sobre un área de memoria compartida. Esta es a menudo la forma más eficiente para programar la memoria compartida en una computadora con un gran número de procesadores, especialmente sobre la máquina NUMA, donde la memoria es local para los procesadores y el acceso a la memoria de otro procesador es costoso. SPMD sobre una máquina de memoria compartida es usualmente implementado por procesos estándares (altas prestaciones). A diferencia de SPMD, el multiprocesamiento de memoria compartida, llamado también multiprocesamiento simétrico o SMP, provee al programador un espacio de memoria compartida común y la posibilidad de paralelizar la ejecución de un programa, permitiéndole tomar diferentes caminos en distintos procesadores. El programa inicia ejecutando sobre un procesador y se divide al llegar a una región paralela, la cual comienza cuando las directivas paralelas son encontradas. En una región paralela, los procesadores ejecutan un único programa sobre diferentes datos. Un ejemplo típico es el ciclo DO paralelo, donde diferentes procesadores trabajan sobre distintas partes del array involucrado en el ciclo. Al finalizar el ciclo, la ejecución es sincronizada, solamente un único procesador continúa, y los otros esperan. La actual interfaz para multiprocesamiento de memoria compartida es OpenMP, usualmente implementada por procesos ligeros, llamados hebras.

## Combinación de los niveles de paralelismo

Las computadoras actuales permiten la explotación de varios modos paralelos al mismo tiempo para lograr un máximo efecto combinado. Un programa de memoria distribuida usando MPI se puede ejecutar sobre un conjunto de nodos. Cada nodo debe ser un ordenador de memoria compartida que ejecuta en paralelo sobre múltiples CPU usando OpenMP. Dentro de cada CPU, las instrucciones vectoriales SIMD (normalmente generadas automáticamente por el compilador) y la ejecución de instrucciones superescalar (por lo general de forma transparente manejado por el propio CPU), tales como el pipelining y el uso de múltiples unidades funcionales paralelas, se utilizan para lograr la velocidad máxima del único CPU.

## Historia

SPMD fue propuesto por primera vez en 1983 por Michel Auguin (Universidad de Niza Sophia- Antipolis) y François Larbey (Thomson / Sintra) en el computador paralelo OPSILA y el siguiente en 1984 por Frederica Darema de IBM para máquinas altamente paralelas, como la RP3 (la investigación del prototipo del procesador paralelo de IBM), en una nota inédita de IBM. Para finales de 1980, había muchos equipos distribuidos con bibliotecas propias para el traspaso de mensajes. El primer estándar de SPMD fue PVM. El actual estándar es MPI. Las directivas paralelas Cray fueron un antecedente directo de OpenMP.