SPMD

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

В программировании, SPMD (single program, multiple data - единая программа, множество данных) является методом, используемым для достижения параллелизма; это подкатегория MIMD-класса вычислительных систем в классификации Флинна.

В данной категории задачи разделены и работают одновременно на нескольких процессорах с различными входными данными с целью более быстрого получения результатов. SPMD является наиболее распространенным стилем параллельного программирования.[1] Он также является предпосылкой для исследования таких концепций, как активные сообщения и распределенная разделяемая память.

SPMD против SIMD[править | править код]

В SPMD, множество автономных процессоров одновременно выполняют одну и ту же программу из разных её мест (имеется в виду участки кода), а не в жесткой последовательности, которую SIMD накладывает для обработки различных данных. Благодаря SPMD задачи могут быть выполнены на процессорах общего назначения. SIMD требует векторных процессоров для управления потоками данных. Заметим, что эти два метода не являются взаимоисключающими.

Распределенная память[править | править код]

SPMD обычно относят к программированию через обмен сообщениями для архитектур с распределенной памятью. Распределенная память состоит из набора независимых компьютеров, называемых «узлами». Каждый узел запускает свою собственную программу и взаимодействует с другими узлами посредством отправки и получения сообщений, вызывая для этого процедуры отправки и приема. Барьерная синхронизация может быть реализована при помощи сообщений. Сообщения могут быть отправлены с помощью таких механизмов коммуникации как TCP/IP (для Ethernet) или специализированные высокоскоростные соединения, такие как Myrient и Supercomputer Interconnect. Последовательные участки (секции) программ реализуются одинаковыми вычислениями на всех узлах, а не с помощью вычисления результата на одном узле и его отправки на другие.

В настоящее время, программист изолирован от деталей передачи сообщений, осуществляемой с помощью стандартных интерфейсов, таких как PVM и MPI.

Распределенная память — это стиль программирования, использующийся на параллельных суперкомпьютерах, начиная с «домашних» кластеров Beowulf и кончая крупнейшими кластерами на TeraGrid.

Разделяемая память[править | править код]

На машине с разделяемой памятью (компьютер с несколькими процессорами, которые обращаются к единой памяти) сообщения могут быть отправлены путём временного хранения их содержимого в общей области памяти. Такой метод часто является наиболее эффективным для машин с разделяемой памятью с большим числом процессоров, особенно для машин с неравномерным доступом к памяти (NUMA), где память является локальной для процессора и доступ к памяти другого процессора занимает больше времени. SPMD с разделяемой памятью, как правило, реализуется через обычные процессы ОС.

В отличие от SPMD, многопроцессорная система с разделяемой памятью, которая также называется симметричной многопроцессорной (SMP), предоставляет возможность распараллеливания исполнения за счёт независимого пути исполнения приложения на каждом процессоре с использованием общей памяти как механизма обмена данными. Программа начинает выполняться на одном процессоре и выполнение делится на параллельные участки, которые задаются в исходном коде при помощи директив распараллеливания (например, одна из директив объявляет начало параллельного участка в коде программы). Внутри параллельного участка, процессоры выполняют одну программу, но с разными данными. Типичным примером является параллельный цикл DO, где различные процессоры обрабатывают отдельные части массива, задействованного в цикле. В конце цикла участки выполнения синхронизируются, после чего только один процессор продолжает работу, а остальные ждут. В настоящее время стандартным интерфейсом для многопроцессорной системы с разделяемой памятью является OpenMP. Он обычно реализован при помощи легковесных процессов, называемых потоками.

Комбинация уровней параллелизма[править | править код]

Современные компьютеры позволяют задействовать несколько параллельных режимов одновременно для достижения максимального общего эффекта. Программы, работающие с распределяемой памятью и использующие MPI, могут одновременно работать на наборе узлов. Каждый узел может являться компьютером с общей памятью и выполнять вычисления на нескольких процессорах параллельно с использованием OpenMP. Для достижения максимальной скорости одним процессором используются векторные команды SIMD (обычно генерируются автоматически компилятором) и суперскалярное выполнение (как правило, обрабатываются прозрачно самим процессором), такие как конвейер (pipelining) и использование нескольких параллельных функциональных блоков.

История[править | править код]

SPMD был предложен в 1984 году Фредерикой Дарема в IBM для высокопроизводительных параллельных машин, таких как RP3 (IBM Research Parallel Processor Prototype), в неопубликованном служебном письме.[2] К концу 1980-х годов было много распределенных компьютеров с закрытыми библиотеками передачи сообщений. Первым стандартом SPMD был PVM. В настоящее время стандартом де-факто является MPI. Параллельные директивы Cray были прямым предшественником OpenMP.

Примечания[править | править код]

  1. single program multiple data. Дата обращения: 23 января 2013. Архивировано из оригинала 5 февраля 2013 года.
  2. F. Darema, SPMD model: past, present and future, Recent Advances в Parallel Virtual Machine и Message Passing Interface: 8th European PVM/MPI Users' Group Meeting, Santorini/Thera, Greece, September 23-26, 2001. Lecture Notes in Computer Science 2131, p. 1, 2001.