В вычислительной технике термин «одна программа, несколько данных » ( SPMD ) используется для обозначения вычислительных моделей, использующих параллелизм , при котором несколько процессоров взаимодействуют при выполнении программы для более быстрого получения результатов.
Термин SPMD был введен в 1983 году и использовался для обозначения двух различных вычислительных моделей:
(IBM) SPMD является наиболее распространенным стилем параллельного программирования и может считаться подкатегорией MIMD, поскольку он относится к выполнению MIMD заданной («отдельной») программы. [7] Это также является предпосылкой для исследовательских концепций, таких как активные сообщения и распределенная общая память .
При параллельном выполнении SPMD несколько автономных процессоров одновременно выполняют одну и ту же программу в независимых точках, а не в режиме lockstep , который SIMD или SIMT налагают на разные данные. С SPMD задачи могут выполняться на универсальных ЦП . В SIMD одна и та же операция (инструкция) применяется к нескольким данным для управления потоками данных (версия SIMD — это векторная обработка , где данные организованы как векторы). Другой класс процессоров, графические процессоры, охватывает обработку нескольких потоков SIMD. Обратите внимание, что SPMD и SIMD не являются взаимоисключающими; параллельное выполнение SPMD может включать SIMD, или векторную, или подобработку GPU. SPMD использовался для параллельного программирования как архитектур передачи сообщений, так и машин с общей памятью.
В архитектурах компьютеров с распределенной памятью реализации SPMD обычно используют программирование передачи сообщений . Компьютер с распределенной памятью состоит из набора взаимосвязанных независимых компьютеров, называемых узлами. Для параллельного выполнения каждый узел запускает свою собственную программу и взаимодействует с другими узлами, отправляя и получая сообщения, вызывая для этой цели процедуры отправки/приема. Другие директивы распараллеливания , такие как барьерная синхронизация , также могут быть реализованы с помощью сообщений. Сообщения могут быть отправлены с помощью ряда механизмов связи, таких как TCP/IP через Ethernet , или специализированных высокоскоростных соединений, таких как Myrinet и Supercomputer Interconnect. Для сред с распределенной памятью последовательные разделы программы могут быть реализованы путем одинакового вычисления последовательного раздела на всех узлах, а не вычисления результата на одном узле и отправки его другим, если это повышает производительность за счет снижения накладных расходов на связь.
В настоящее время программист изолирован от деталей передачи сообщений посредством стандартных интерфейсов, таких как PVM и MPI .
Распределенная память — это стиль программирования, используемый на параллельных суперкомпьютерах, от домашних кластеров Beowulf до крупнейших кластеров Teragrid , а также на современных суперкомпьютерах на базе графических процессоров .
На машине с общей памятью (компьютере с несколькими взаимосвязанными ЦП , которые обращаются к одному и тому же пространству памяти) совместное использование может быть реализовано в контексте либо физически общей памяти, либо логически общей (но физически распределенной) памяти; в дополнение к общей памяти ЦП в компьютерной системе могут также включать локальную (или частную) память. Для любого из этих контекстов синхронизация может быть включена с помощью аппаратно-разрешенных примитивов (таких как compare-and-swap или fetch-and-add ). Для машин, не имеющих такой аппаратной поддержки, можно использовать блокировки, и данные могут «обмениваться» между процессорами (или, в более общем смысле, процессами или потоками ) путем размещения разделяемых данных в области общей памяти. Когда оборудование не поддерживает общую память, упаковка данных в виде «сообщения» часто является наиболее эффективным способом программирования (логически) компьютеров с общей памятью с большим количеством процессоров, где физическая память является локальной для процессоров, а доступ к памяти другого процессора занимает больше времени. SPMD на машине с общей памятью может быть реализован стандартными процессами (тяжеловесными) или потоками (легковесными).
Многопроцессорная обработка с общей памятью (как симметричная многопроцессорная обработка , SMP, так и неравномерный доступ к памяти , NUMA) предоставляет программисту общее пространство памяти и возможность распараллеливания выполнения. С моделью (IBM) SPMD взаимодействующие процессоры (или процессы) выбирают разные пути через программу, используя параллельные директивы ( директивы распараллеливания и синхронизации , которые могут использовать операции сравнения и обмена и выборки и добавления для переменных синхронизации общей памяти), и выполняют операции с данными в общей памяти («общие данные»); процессоры (или процессы) также могут иметь доступ и выполнять операции с данными в своей локальной памяти («частные данные»). В отличие от подходов fork-and-join программа начинает выполняться на одном процессоре, и выполнение разделяется в параллельной области, которая запускается при обнаружении параллельных директив; в параллельной области процессоры выполняют параллельную задачу с разными данными. Типичным примером является параллельный цикл DO, где разные процессоры работают с отдельными частями массивов, участвующих в цикле. В конце цикла выполнение синхронизируется (с помощью мягких или жестких барьеров [6] ), и процессоры (процессы) переходят к следующему доступному разделу программы для выполнения. SPMD (IBM) был реализован в текущем стандартном интерфейсе для многопроцессорной обработки общей памяти, OpenMP , который использует многопоточность, обычно реализуемую легковесными процессами, называемыми потоками .
Современные компьютеры позволяют использовать множество параллельных режимов одновременно для максимального совокупного эффекта. Программа с распределенной памятью, использующая MPI, может работать на наборе узлов. Каждый узел может быть компьютером с общей памятью и выполняться параллельно на нескольких ЦП с использованием OpenMP. В каждом ЦП векторные инструкции SIMD (обычно генерируемые автоматически компилятором) и суперскалярное выполнение инструкций (обычно обрабатываемое прозрачно самим ЦП), такие как конвейеризация и использование нескольких параллельных функциональных блоков, используются для максимальной скорости одного ЦП.
Аббревиатура SPMD (Single-Program Multiple-Data) использовалась для описания двух различных вычислительных моделей для использования параллельных вычислений, и это связано с тем, что оба термина являются естественными расширениями таксономии Флинна. [7] Две соответствующие группы исследователей не знали об использовании друг другом термина SPMD для независимого описания различных моделей параллельного программирования.
Термин SPMD был впервые предложен в 1983 году Мишелем Огеном (Университет Ниццы София-Антиполис) и Франсуа Ларбеем (Thomson/Sintra) в контексте параллельного компьютера OPSILA и в контексте подхода к модели параллельных вычислений fork-and-join и данных. [1] Этот компьютер состоял из главного процессора (контроллерного процессора) и процессоров SIMD (или режима векторного процессора, предложенного Флинном). В модели SPMD Огена одна и та же (параллельная) задача (« одна и та же программа ») выполняется на разных (SIMD) процессорах (« работающих в режиме блокировки шага » [1], действуя на часть («срез») вектора данных. В частности, в их статье 1985 года [2] (и аналогично в [3] [1] ) утверждается: « мы рассматриваем режим работы SPMD (одна программа, несколько данных). Этот режим позволяет одновременно выполнять одну и ту же задачу (по одной на процессор), но предотвращает обмен данными между процессорами. Обмен данными выполняется только в режиме SIMD посредством векторных назначений. Мы предполагаем, что синхронизации суммируются с переключениями (sic) между режимами работы SIMD и SPMD (sic) с использованием глобальных примитивов fork-join »).
Начиная примерно с того же периода времени (в конце 1983 - начале 1984 года), термин SPMD был предложен Фредерикой Даремой (в то время работавшей в IBM и входившей в группу RP3) для определения другой вычислительной модели SPMD, которую она предложила [6] [5] [4] как модели программирования, которая в последующие годы применялась к широкому спектру высокопроизводительных компьютеров общего назначения (включая RP3 - 512-процессорный IBM Research Parallel Processor Prototype) и привела к появлению современных стандартов параллельных вычислений. Модель программирования SPMD (IBM) предполагает наличие множества процессоров, которые работают совместно, выполняя одну и ту же программу, но могут проходить ее по разным путям на основе директив распараллеливания, встроенных в программу; и, в частности, как указано в [6] [5] [4] [9] [10] « все процессы, участвующие в параллельном вычислении, создаются в начале выполнения и остаются в существовании до конца », (процессоры/процессы) « выполняют разные инструкции и действуют на разные данные », « работа , которая должна быть выполнена каждым процессом, распределяется динамически », то есть процессы « самостоятельно планируют себя для выполнения разных инструкций и действия на разные данные », таким образом, сами назначают себя для сотрудничества при выполнении последовательных и параллельных задач (а также реплицируют задачи) в программе. Понятие « процесс» использовалось как обобщение термина «процессор» в том смысле, что несколько процессов могут выполняться на процессоре (например, чтобы использовать большую степень параллелизма для большей эффективности и балансировки нагрузки). Модель (IBM) SPMD была предложена Даремой как подход, отличающийся и более эффективный, чем подход fork-and-join, который использовался всеми остальными в сообществе в то время; она также более общая, чем просто «параллельная по данным» вычислительная модель и может охватывать fork&join (как подкатегорию реализации). Первоначальным контекстом (IBM) SPMD был компьютер RP3 (512-процессорный IBM Research Parallel Processor Prototype), который поддерживал вычисления общего назначения, как с распределенной, так и (логически) общей памятью. [9] Модель (IBM) SPMD была реализована Даремой и коллегами из IBM в EPEX (Environment for Parallel Execution), одной из первых прототипных сред программирования. [6] [5] [4] [9] [10] [11] Эффективность (IBM) SPMD была продемонстрирована для широкого класса приложений, [9] [4] и в 1988 году была реализована в IBM FORTRAN, [12]первый вендор-продукт в области параллельного программирования; а также в MPI (с 1991 г.), OpenMP (с 1997 г.) и других средах, которые приняли и цитируют вычислительную модель SPMD (IBM).
К концу 1980-х годов появилось много распределенных компьютеров с собственными библиотеками передачи сообщений. Первым стандартом SPMD был PVM . Текущим фактическим стандартом является MPI .
Параллельные директивы Cray были прямыми предшественниками OpenMP .
{{cite journal}}
: CS1 maint: несколько имен: список авторов ( ссылка ){{cite journal}}
: CS1 maint: несколько имен: список авторов ( ссылка )