SPMD

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

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

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

SPMD против SIMD[править | править вики-текст]

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

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

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

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

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

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

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

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

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

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

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

SPMD был предложен в 1984 году Фредериком Дарема в IBM для высокопроизводительных параллельных машин, таких как RP3 (IBM Research Parallel Processor Prototype), в неопубликованной записи IBM.[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.