В вычислениях, SPMD (одна программа, несколько данных ) - это метод, используемый для достижения параллелизма ; это подкатегория MIMD. Задачи разделяются и выполняются одновременно на нескольких процессорах с разными входными данными, чтобы быстрее получать результаты. SPMD - это наиболее распространенный стиль параллельного программирования. Это также предварительное условие для таких исследовательских концепций, как активные сообщения и распределенная разделяемая память.
В SPMD несколько автономных процессоров одновременно выполняют одну и ту же программу в независимых точках, а не в шаге блокировки, который SIMD накладывает на разные данные. С помощью SPMD задачи могут выполняться на ЦП общего назначения; SIMD требует векторных процессоров для управления потоками данных. Обратите внимание, что эти два понятия не исключают друг друга.
SPMD обычно относится к передаче сообщений программированию на распределенной памяти компьютерных архитектурах. Компьютер с распределенной памятью состоит из набора независимых компьютеров, называемых узлами. Каждый узел запускает свою собственную программу и связывается с другими узлами, отправляя и получая сообщения, вызывая для этой цели процедуры отправки / получения. Barrier синхронизация также может быть реализована с помощью сообщений. Сообщения могут быть отправлены с помощью ряда механизмов связи, таких как TCP / IP через Ethernet, или специализированных высокоскоростных межсоединений, таких как Myrinet и Supercomputer Interconnect.. Последовательные разделы программы реализуются путем идентичных вычислений на всех узлах, а не путем вычисления результата на одном узле и его отправки другим.
В настоящее время программист изолирован от деталей передачи сообщений через стандартные интерфейсы, такие как PVM и MPI.
Распределенная память - это стиль программирования, используемый на параллельных суперкомпьютерах. от доморощенных кластеров Беовульфа до самых больших кластеров на Teragrid.
На машине с общей памятью (компьютер с несколькими CPU, которые обращаются к одному и тому же пространству памяти), сообщения можно отправлять, помещая их содержимое в общую область памяти. Часто это наиболее эффективный способ программирования компьютеров с общей памятью с большим количеством процессоров, особенно на машинах NUMA, где память является локальной для процессоров, а доступ к памяти другого процессора занимает больше времени. SPMD на машине с общей памятью обычно реализуется стандартными (тяжелыми) процессами.
В отличие от SPMD, разделяемая память многопроцессорностью (обе симметричная многопроцессорность, SMP и неоднородный доступ к памяти, NUMA) предоставляет программисту общее пространство памяти и возможность распараллеливать выполнение, заставляя программу выполнять разные пути на разных процессорах. Программа начинает выполнение на одном процессоре, и выполнение разделяется на параллельную область, которая запускается при обнаружении. В параллельной области процессоры выполняют одну программу с разными данными. Типичным примером является параллельный цикл DO, в котором разные процессоры работают с отдельными частями массивов, задействованных в цикле. В конце цикла выполнение синхронизируется, только один процессор продолжает работу, а остальные ждут. Текущий стандартный интерфейс для многопроцессорной обработки с общей памятью - OpenMP. Обычно это реализуется облегченными процессами, называемыми потоками.
Современные компьютеры позволяют использовать множество параллельных режимов одновременно для максимального комбинированного эффекта. Программа с распределенной памятью, использующая MPI, может работать на совокупности узлов. Каждый узел может быть компьютером с общей памятью и выполняться параллельно на нескольких ЦП с использованием OpenMP. В каждом ЦП векторные инструкции SIMD (обычно генерируются компилятором автоматически) и выполнение команд суперскаляр (обычно прозрачно обрабатывается самим ЦП), такие как конвейерная обработка и использование нескольких параллельных функциональные блоки, используются для максимальной скорости одного процессора.
SPMD был впервые предложен в 1983 году Мишелем Огеном (Университет Ниццы-София-Антиполис) и Франсуа Ларби (Thomson / Sintra) в параллельном компьютере OPSILA, а затем в 1984 году Фредерика Дарема в IBM для высокопараллельных машин, таких как RP3 (прототип IBM Research Parallel Processor Prototype), в неопубликованной памятке IBM. К концу 1980-х было много распределенных компьютеров с проприетарными библиотеками передачи сообщений. Первым стандартом SPMD был PVM. Текущим стандартом де-факто является MPI.
Параллельные директивы Cray были прямым предшественником OpenMP.