Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Динамическое распределение.docx
Скачиваний:
20
Добавлен:
01.03.2025
Размер:
25 Кб
Скачать
☆

Классические задачи динамического программирования

  • Задача о наибольшей общей подпоследовательности: даны две последовательности, требуется найти самую длинную общую подпоследовательность.

  • Задача поиска наибольшей увеличивающейся подпоследовательности: дана последовательность, требуется найти самую длинную возрастающую подпоследовательность.

  • Задача о редакционном расстоянии (расстояние Левенштейна): даны две строки, требуется найти минимальное количество стираний, замен и добавлений символов, преобразующих одну строку в другую.

  • Задача о вычислении чисел Фибоначчи

  • Задача о порядке перемножения матриц: даны матрицы , ..., , требуется минимизировать количество скалярных операций для их перемножения.

  • Задача о выборе траектории

  • Задача последовательного принятия решения

  • Задача об использовании рабочей силы

  • Задача управления запасами

  • Задача о ранце: из неограниченного множества предметов со свойствами «стоимость» и «вес» требуется отобрать некое число предметов таким образом, чтобы получить максимальную суммарную стоимость при ограниченном суммарном весе.

  • Алгоритм Флойда-Уоршелла: найти кратчайшие расстояния между всеми вершинами взвешенного ориентированного графа.

  • Алгоритм Беллмана — Форда: найти кратчайший путь во взвешенном графе между двумя заданными вершинами.

  • Максимальное независимое множество вершин в дереве: дано дерево, найти максимальное множество вершин, никакие две из которых не связаны ребром.

Параллельное программирование

Параллельное программирование является трудным, хотя многие технологи предсказывают, что ответом на завершение действия закона Мура явится возрастающее использование параллельных архитектур: многоядерных процессоров, или мультипроцессоров на кристалле (chip multiprocessor, CMP). Если стремиться к непрерывному наращиванию производительности, необходимо обеспечить возможность использования этого параллелизма в программах.

Одним из возможных технических решений является автоматическое распараллеливание последовательных программ. Однако многие исследователи сходятся в том, что методы автоматического распараллеливания исчерпали свои возможности и пригодны для использования только незначительных аппаратных параллельных средств. Следовательно, более параллельными должны стать сами программы.

Решению проблемы может помочь более ясное понимание того, почему параллельное программирование является трудным. Физический мир является в высшей степени параллельным, и наша способность к выживанию зависит от способности воспринимать одновременно происходящее физические явления. Однако эта способность не распространяется на параллельные программы, поскольку абстракции, на которых основывается параллельное программирование, даже отдаленно не напоминают параллельность физического мира. Мы настолько завязли в этих вычислительных абстракциях, что забыли о том, что они не является непреложными. Трудности параллельного программирования являются следствием использования этих абстракций, и если мы от них освободимся, проблема станет разрешимой.

Параллельное программирование

Параллельным программированием будем называть процесс написания программы для многопроцессорной системы. Разумеется, параллельное программирование имеет ряд особенностей по сравнению с традиционным последовательным программированием. Кроме того, в зависимости от типа многопроцессорной системы применяются различные средства программирования:

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

Системы с неоднородным доступом (NUMA) – набор блоков, содержащих несколько процессоров и общую для них память. При этом допускается обращение любого процессора к удаленной памяти, т.е. памяти другого блока, но обращение происходит медленнее, чем обращение к локальной памяти. При программировании применяется, например, система Shmem.

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

Смешанные системы – набор SMP-узлов, соединенных коммутационной средой. Применяется комбинация моделей передачи сообщений и общей памяти. Часто также используется чистая модель передачи сообщений, тогда каждый процессор в SMP-узле трактуется как независимый узел со своей локальной памятью.

К сожалению, специалист в предметной области, способный разработать алгоритм и запрограммировать его на каком-либо языке программирования (например, Си или Фортране), далеко не всегда знаком с приемами написания параллельных программ и зачастую не может самостоятельно привести свою программу к виду, выполнимому на многопроцессорной машине. Поэтому распараллеливанием таких программ занимаются отдельные люди – специалисты по написанию параллельных программ. Это приводит к увеличению необходимого числа программистов, работающих над программой и потере времени на хотя бы минимальное знакомство специалиста с предметной областью.

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