Параллельное Динамическое Программирование

есть ли хорошие документы, обсуждающие, как взять динамическую программу и распараллелить ее?

2 ответов


IIRC, то, что вы обычно делаете с динамическим программированием, - это рекурсивно разделить проблему на подзадачи и собрать оптимальные решения из оптимальных подзадач. Что делает его эффективным, так это то, что все оптимальные подрешетки встроены в кэш, поэтому их не нужно пересчитывать.

Если проблему можно разделить несколькими способами, вы можете развить решатель для каждого подрешения. Если каждая (под) задача усредняет 1 + Эпсилон (для Эпсилона интересно больше нуля) возможно subsolutions, тогда вы получите много параллелизма таким образом. Вероятно, вам понадобятся блокировки записей кэша для защиты отдельных решений от создания более одного раза.

вам нужен язык, на котором вы можете вилять подзадачи дешевле, чем работа по их решению, и который рад иметь много разветвленных задач сразу. Типичные параллельные предложения на большинстве языков делают это плохо; вы не можете иметь много разветвленных задач в системах, которые используют " модель большого стека" (см. как stackless языке?).

мы реализовали наше параллельное программирование langauge, PARLANSE, чтобы получить язык, который имел правильные свойства.


недавно мы опубликовали статью, показывающую, как распараллелить любой d.p. на многоядерном компьютере с общей памятью с помощью общей хэш-таблицы без блокировки:

Stivala, A. и Stuckey, P. J. И Garcia de la Banda, M. И Hermenegildo, M. И Wirth, A. 2010 "бесконтактное параллельное динамическое программирование" J. параллельный дистрибутив. Компьют. 70: 839-848 doi: 10.1016 / j.jpdc.2010.01.004

http://dx.doi.org/10.1016/j.jpdc.2010.01.004

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

с точки зрения реализации мы просто использовали C и pthreads в системах типа UNIX, все, что вам нужно, это иметь общую память и CompareAndSwap (CAS) для блокировки синхронизация между потоками.

поскольку эта статья была опубликована в журнале Elsevier, вам нужно будет получить доступ к вышеуказанному через университетскую библиотеку или аналогичную с подпиской на нее. Однако вы можете получить предварительную копию через веб-страницу профессора Стаки.