Введение

Вычислительная техника, используемая для достижения параллелизма.

В вычислительной технике термин "одна программа – множество данных" (SPMD) используется для обозначения вычислительных моделей, позволяющих использовать параллелизм, при котором несколько процессоров совместно выполняют программу для более быстрого получения результатов. Термин SPMD был введен в 1983 году и использовался для обозначения двух различных вычислительных моделей:

Мишелем Огуином (Университет Ниццы Софии Антиполис) и Франсуа Ларби (Thomson/Sintra) как подход, сочетающий "fork and join" и параллельную передачу данных, где параллельные задачи ("одна программа") разделяются и одновременно выполняются синхронно на нескольких SIMD-процессорах с разными входными данными, и

Фредерикой Даремой (IBM), где "все процессоры начинают выполнять одну и ту же программу, но посредством директив синхронизации самостоятельно планируют выполнение различных инструкций и обработку различных данных", что обеспечивает MIMD-параллелизацию заданной программы и является более общим подходом, чем параллелизм данных, и более эффективным, чем "fork and join" для параллельного выполнения на многопроцессорных системах общего назначения. SPMD (IBM) – наиболее распространенный стиль параллельного программирования и может рассматриваться как подкатегория MIMD, поскольку он относится к MIMD-исполнению заданной ("одной") программы. Он также является основой для исследовательских концепций, таких как активные сообщения и распределенная общая память.

SPMD против SIMD

При параллельном исполнении SPMD несколько автономных процессоров одновременно выполняют одну и ту же программу в независимых точках, а не синхронно, как это требуется в SIMD или SIMT при обработке различных данных. С помощью SPMD задачи могут выполняться на универсальных процессорах. В SIMD одна и та же операция (инструкция) применяется к множеству данных для обработки потоков данных (векторная обработка является разновидностью SIMD, где данные организованы в виде векторов). Другой класс процессоров – графические процессоры (GPU) – включает в себя параллельную обработку множества потоков SIMD. Важно отметить, что SPMD и SIMD не являются взаимоисключающими; параллельное исполнение SPMD может включать в себя SIMD, векторную обработку или подпроцессы с использованием GPU. SPMD использовался для параллельного программирования как систем с передачей сообщений, так и систем с общей памятью.

Распределенная память

В распределенных компьютерных архитектурах с разделяемой памятью реализации SPMD обычно используют программирование с передачей сообщений. Компьютер с разделяемой памятью состоит из набора взаимосвязанных независимых компьютеров, называемых узлами. Для параллельного выполнения каждый узел запускает собственную программу и взаимодействует с другими узлами посредством отправки и получения сообщений, используя для этого подпрограммы отправки/приема. Другие директивы параллелизации, такие как синхронизация барьером, также могут быть реализованы с помощью сообщений. Сообщения могут передаваться различными механизмами связи, такими как TCP/IP через Ethernet или специализированные высокоскоростные соединения, такие как Myrinet и Supercomputer Interconnect. В средах с разделяемой памятью последовательные участки программы могут быть реализованы путем идентичного вычисления последовательного участка на всех узлах, а не вычисления результата на одном узле и его отправки другим, если это повышает производительность за счет снижения накладных расходов на связь. В настоящее время программист изолирован от деталей передачи сообщений благодаря стандартным интерфейсам, таким как PVM и MPI. Разделяемая память – это стиль программирования, используемый на параллельных суперкомпьютерах, начиная от самодельных кластеров Beowulf и заканчивая крупнейшими кластерами Teragrid, а также на современных суперкомпьютерах на основе GPU.

Общая память

На машине с общей памятью (компьютер с несколькими взаимосвязанными процессорами, обращающимися к одному и тому же пространству памяти), обмен данными может быть реализован в контексте физически общей памяти или логически общей (но физически распределенной) памяти; помимо общей памяти, процессоры в компьютерной системе могут также включать локальную (или приватную) память. Для любого из этих контекстов синхронизация может быть обеспечена аппаратными примитивами (такими как "сравнить и заменить" или "вычесть и прибавить"). Для машин, не имеющих такой аппаратной поддержки, могут использоваться блокировки, а данные могут "обмениваться" между процессорами (или, в более общем смысле, процессами или потоками) путем помещения совместно используемых данных в область общей памяти. Когда аппаратное обеспечение не поддерживает общую память, упаковка данных в виде "сообщения" часто является наиболее эффективным способом программирования (логически) компьютеров с общей памятью с большим количеством процессоров, где физическая память локальна для процессоров и доступ к памяти другого процессора занимает больше времени. SPMD на машине с общей памятью может быть реализован с использованием стандартных процессов (тяжеловесных) или потоков (легковесных). Многопроцессорная архитектура с общей памятью (как симметричная многопроцессорная обработка, SMP, так и неравномерный доступ к памяти, NUMA) предоставляет программисту единое адресное пространство памяти и возможность параллелизации выполнения. В модели SPMD (IBM) взаимодействующие процессоры (или процессы) следуют различным путям в программе, используя параллельные директивы (директивы параллелизации и синхронизации, которые могут использовать операции "сравнить и заменить" и "вычесть и прибавить" над переменными синхронизации в общей памяти), и выполняют операции над данными в общей памяти ("общие данные"); процессоры (или процессы) также могут иметь доступ и выполнять операции над данными в своей локальной памяти ("приватные данные"). В отличие от подходов "fork" и "join", программа начинает выполняться на одном процессоре, а выполнение разделяется в параллельной области, которая запускается при встрече параллельных директив; в параллельной области процессоры выполняют параллельную задачу над различными данными. Типичным примером является параллельный цикл DO, в котором разные процессоры работают с отдельными частями массивов, участвующих в цикле. В конце цикла выполнение синхронизируется (с использованием мягких или жестких барьеров – "все процессы, участвующие в параллельных вычислениях, создаются в начале выполнения и остаются в существовании до конца", "(процессоры/процессы) выполняют различные инструкции и оперируют различными данными", "объем работы, который должен выполнить каждый процесс, распределяется динамически", то есть процессы "самостоятельно планируют выполнение различных инструкций и оперируют различными данными", таким образом, самостоятельно назначают себя для сотрудничества в выполнении последовательных и параллельных задач (а также репликации задач) в программе). Термин "процесс" использовался как обобщение термина "процессор" в том смысле, что на одном процессоре может выполняться несколько процессов (например, для использования большей степени параллелизма для повышения эффективности и балансировки нагрузки). Модель SPMD (IBM) была предложена Darema как подход, отличный и более эффективный, чем "fork" и "join", который использовали все остальные в сообществе в то время; она также более общая, чем просто "параллельная" вычислительная модель данных, и может включать в себя "fork&join" (как реализацию подкатегории). Изначальным контекстом SPMD (IBM) был компьютер RP3 (прототип параллельного процессора IBM Research с 512 процессорами), который поддерживал вычисления общего назначения как с распределенной, так и с (логически) общей памятью. Эффективность SPMD (IBM) была продемонстрирована для широкого класса приложений, став первым коммерческим продуктом для параллельного программирования, и нашла отражение в MPI (с 1991 года и далее), OpenMP (с 1997 года и далее) и других средах, которые приняли и ссылаются на вычислительную модель SPMD (IBM). К концу 1980-х годов существовало множество распределенных компьютеров с проприетарными библиотеками передачи сообщений. Первым стандартом SPMD был PVM. В настоящее время де-факто стандартом является MPI. Параллельные директивы Cray были прямым предшественником OpenMP.