En informática , "un solo programa, múltiples datos " ( SPMD ) es un término que se ha utilizado para referirse a modelos computacionales para explotar el paralelismo mediante el cual múltiples procesadores cooperan en la ejecución de un programa para obtener resultados más rápidos.
El término SPMD se introdujo en 1983 y se utilizó para designar dos modelos computacionales diferentes:
El SPMD (IBM) es el estilo más común de programación paralela y puede considerarse una subcategoría de MIMD en cuanto a que se refiere a la ejecución MIMD de un programa determinado (“único”). [7] También es un prerrequisito para conceptos de investigación como mensajes activos y memoria compartida distribuida .
En la ejecución paralela de SPMD, varios procesadores autónomos ejecutan simultáneamente el mismo programa en puntos independientes, en lugar de hacerlo al mismo ritmo que SIMD o SIMT imponen sobre diferentes datos. Con SPMD, las tareas se pueden ejecutar en CPU de propósito general . En SIMD, la misma operación (instrucción) se aplica a múltiples datos para manipular flujos de datos (una versión de SIMD es el procesamiento vectorial donde los datos se organizan como vectores). Otra clase de procesadores, las GPU, abarcan el procesamiento de múltiples flujos SIMD. Tenga en cuenta que SPMD y SIMD no son mutuamente excluyentes; la ejecución paralela de SPMD puede incluir subprocesamiento SIMD, vectorial o de GPU. SPMD se ha utilizado para la programación paralela de arquitecturas de máquinas de memoria compartida y de paso de mensajes.
En las arquitecturas de computadoras con memoria distribuida , las implementaciones de SPMD generalmente emplean programación de paso de mensajes . Una computadora con memoria distribuida consiste en una colección de computadoras independientes interconectadas, llamadas nodos. Para la ejecución paralela, cada nodo inicia su propio programa y se comunica con otros nodos enviando y recibiendo mensajes, llamando a rutinas de envío/recepción para ese propósito. Otras directivas de paralelización, como la sincronización de barrera , también se pueden implementar mediante mensajes. Los mensajes se pueden enviar mediante varios mecanismos de comunicación, como TCP/IP sobre Ethernet , o interconexiones especializadas de alta velocidad como Myrinet y Supercomputer Interconnect. Para entornos de memoria distribuida, las secciones seriales del programa se pueden implementar mediante el cálculo idéntico de la sección serial en todos los nodos en lugar de calcular el resultado en un nodo y enviarlo a los demás, si eso mejora el rendimiento al reducir la sobrecarga de comunicación.
Hoy en día, el programador está aislado de los detalles del paso de mensajes mediante interfaces estándar, como PVM y MPI .
La memoria distribuida es el estilo de programación utilizado en supercomputadoras paralelas, desde los clústeres Beowulf de cosecha propia hasta los clústeres más grandes de Teragrid , así como las supercomputadoras actuales basadas en GPU .
En una máquina de memoria compartida (una computadora con varias CPU interconectadas que acceden al mismo espacio de memoria), la compartición se puede implementar en el contexto de memoria compartida físicamente o de memoria compartida lógicamente (pero físicamente distribuida); además de la memoria compartida, las CPU en el sistema informático también pueden incluir memoria local (o privada). Para cualquiera de estos contextos, la sincronización se puede habilitar con primitivas habilitadas por hardware (como compare-and-swap o fetch-and-add ). Para las máquinas que no tienen dicho soporte de hardware, se pueden usar bloqueos y los datos se pueden "intercambiar" entre procesadores (o, de manera más general, procesos o subprocesos ) depositando los datos compartibles en un área de memoria compartida. Cuando el hardware no admite memoria compartida, empaquetar los datos como un "mensaje" es a menudo la forma más eficiente de programar (lógicamente) computadoras con memoria compartida con una gran cantidad de procesadores, donde la memoria física es local para los procesadores y el acceso a la memoria de otro procesador toma más tiempo. SPMD en una máquina de memoria compartida se puede implementar mediante procesos estándar (peso pesado) o subprocesos (peso ligero).
El multiprocesamiento de memoria compartida (tanto el multiprocesamiento simétrico , SMP, como el acceso a memoria no uniforme , NUMA) ofrece al programador un espacio de memoria común y la posibilidad de paralelizar la ejecución. Con el modelo SPMD (IBM) los procesadores (o procesos) cooperantes toman diferentes caminos a través del programa, utilizando directivas paralelas ( directivas de paralelización y sincronización , que pueden utilizar operaciones de comparación e intercambio y de obtención y adición en variables de sincronización de memoria compartida), y realizan operaciones en datos en la memoria compartida ("datos compartidos"); los procesadores (o procesos) también pueden tener acceso y realizar operaciones en datos en su memoria local ("datos privados"). En cambio, con los enfoques de bifurcación y unión, el programa comienza a ejecutarse en un procesador y la ejecución se divide en una región paralela, que se inicia cuando se encuentran directivas paralelas; en una región paralela, los procesadores ejecutan una tarea paralela en diferentes datos. Un ejemplo típico es el bucle DO paralelo, donde diferentes procesadores trabajan en partes separadas de las matrices involucradas en el bucle. Al final del bucle, la ejecución se sincroniza (con barreras blandas o duras [6] ) y los procesadores (procesos) continúan hasta la siguiente sección disponible del programa para ejecutarse. El SPMD (IBM) se ha implementado en la interfaz estándar actual para multiprocesamiento de memoria compartida, OpenMP , que utiliza subprocesos múltiples, generalmente implementados por procesos livianos, llamados subprocesos .
Los ordenadores actuales permiten explotar muchos modos paralelos al mismo tiempo para obtener el máximo efecto combinado. Un programa de memoria distribuida que utilice MPI puede ejecutarse en una colección de nodos. Cada nodo puede ser un ordenador de memoria compartida y ejecutarse en paralelo en varias CPU mediante OpenMP. Dentro de cada CPU, se utilizan instrucciones vectoriales SIMD (normalmente generadas automáticamente por el compilador) y ejecución de instrucciones superescalares (normalmente gestionadas de forma transparente por la propia CPU), como la segmentación y el uso de múltiples unidades funcionales paralelas, para lograr la máxima velocidad de una sola CPU.
El acrónimo SPMD, que significa “un solo programa, múltiples datos”, se ha utilizado para describir dos modelos computacionales diferentes para explotar la computación paralela, y esto se debe a que ambos términos son extensiones naturales de la taxonomía de Flynn. [7] Los dos grupos respectivos de investigadores desconocían que cada uno usara el término SPMD para describir de forma independiente diferentes modelos de programación paralela.
El término SPMD fue propuesto por primera vez en 1983 por Michel Auguin (Universidad de Niza Sophia-Antipolis) y François Larbey (Thomson/Sintra) en el contexto de la computadora paralela OPSILA y en el contexto de un enfoque de modelo computacional paralelo de datos y bifurcación y unión. [1] Esta computadora constaba de un maestro (procesador controlador) y procesadores SIMD (o modo de procesador vectorial como lo propuso Flynn). En el modelo SPMD de Auguin, la misma tarea (paralela) (“ mismo programa ”) se ejecuta en diferentes procesadores (SIMD) (“ operando en modo lock-step ” [1] actuando sobre una parte (“slice”) del vector de datos. Específicamente, en su artículo de 1985 [2] (y de manera similar en [3] [1] ) se afirma: “ consideramos el modo operativo SPMD (Programa único, Datos múltiples). Este modo permite la ejecución simultánea de la misma tarea (una por procesador) pero evita el intercambio de datos entre procesadores. Los intercambios de datos solo se realizan en modo SIMD por medio de asignaciones de vectores. Suponemos que las sincronizaciones se resumen en conmutaciones (sic) entre los modos operativos SIMD y SPMD (sic) utilizando primitivas globales de bifurcación-unión ”).
A partir de la misma época (a finales de 1983 - principios de 1984), el término SPMD fue propuesto por Frederica Darema (en IBM en ese momento, y parte del grupo RP3) para definir un modelo computacional SPMD diferente que ella propuso, [6] [5] [4] como un modelo de programación que en los años intermedios se ha aplicado a una amplia gama de computadoras de alto rendimiento de propósito general (incluyendo RP3 - el Prototipo de Procesador Paralelo de Investigación IBM de 512 procesadores) y ha llevado a los estándares actuales de computación paralela. El modelo de programación SPMD (IBM) supone una multiplicidad de procesadores que operan cooperativamente, todos ejecutando el mismo programa pero pueden tomar diferentes caminos a través del programa en función de directivas de paralelización integradas en el programa; y específicamente como se indica en [6] [5] [4] [9] [10] “ todos los procesos que participan en el cálculo paralelo se crean al comienzo de la ejecución y permanecen en existencia hasta el final ”, (los procesadores/procesos) “ ejecutan diferentes instrucciones y actúan sobre diferentes datos ”, “ el trabajo (trabajo) a realizar por cada proceso se asigna dinámicamente ”, es decir, los procesos “ se autoprograman para ejecutar diferentes instrucciones y actuar sobre diferentes datos ”, por lo tanto se autoasignan para cooperar en la ejecución de tareas seriales y paralelas (así como tareas replicadas) en el programa. La noción de proceso se utilizó como una generalización del término procesador en el sentido de que múltiples procesos pueden ejecutarse en un procesador (por ejemplo, para explotar mayores grados de paralelismo para mayor eficiencia y equilibrio de carga). El modelo (IBM) SPMD fue propuesto por Darema como un enfoque diferente y más eficiente que el fork-and-join que todos los demás en la comunidad perseguían en ese momento; También es más general que un modelo computacional de “datos paralelos” y puede abarcar fork&join (como una implementación de subcategoría). El contexto original del (IBM) SPMD fue la computadora RP3 (el IBM Research Parallel Processor Prototype de 512 procesadores), que admitía computación de propósito general, con memoria distribuida y compartida (lógicamente). [9] El modelo (IBM) SPMD fue implementado por Darema y colegas de IBM en EPEX (Environment for Parallel Execution), uno de los primeros entornos de programación de prototipos. [6] [5] [4] [9] [10] [11] La efectividad del (IBM) SPMD se demostró para una amplia clase de aplicaciones, [9] [4] y en 1988 se implementó en IBM FORTRAN, [12]el primer producto-proveedor en programación paralela; y en MPI (1991 y siguientes), OpenMP (1997 y siguientes) y otros entornos que han adoptado y citan el Modelo Computacional SPMD (IBM).
A finales de los años 1980, había muchas computadoras distribuidas con bibliotecas de paso de mensajes propietarias. El primer estándar SPMD fue PVM . El estándar de facto actual es MPI .
Las directivas paralelas Cray fueron un predecesor directo de OpenMP .
{{cite journal}}
: CS1 maint: varios nombres: lista de autores ( enlace ){{cite journal}}
: CS1 maint: varios nombres: lista de autores ( enlace )