Следующая проблема программирования относится к более сложной форме
параллельной обработки. Целью была реализация интегрирования методом "разделяй и
властвуй" с использованием алгоритма, называемого адаптивной квадратурой. В
алгоритме предполагается, что затраты на вызов функции крайне высоки. Поэтому
желательно во время выполнения программы решать, в каких точках интервала лучше
выполнять вычисление функции. Согласно стратегии "разделяй и властвуй", делается
попытка разбить задачу по независимым интервалам, и, оценивая с помощью
некоторого теста качество аппроксимации на каждом интервале, принимать
независимые решения о необходимости его дальнейшего разбиения. В результате
некоторые подынтервалы потребуют незначительной обработки, а другие будут
разбиваться на все более мелкие подынтервалы.
Одна из целей нашего анализа заключалась в том, чтобы убедиться, что в
программе не порождается слишком много ветвей параллельных вычислений. В
неуправляемой ситуации такая программа легко порождает тупиковую ситуацию
(различные части программы требуют для своего продолжения продвижения других
частей программы, однако взаимность таких потребностей не позволяет процессу
сдвинуться с места). Например, можно пожелать сохранения списка всех интервалов,
нуждающихся в дальнейшей обработке. Что произойдет, если список заполнен, а все
активные процессы требуют дальнейшего помещения интервалов в список? Хочется
иметь абсолютную гарантию защиты программы от любых возможных блокировок. Эта
цель была достигнута благодаря разработке двух версий программы, реализующей
алгоритм адаптивной квадратуры.
Первой (и основной) была параллельная программа. В ней порождались
дополнительные процессы по мере появления дополнительной работы. Но при
исчерпании любых машинных ресурсов (как, например, памяти, выделенной для
списка) происходил переход ко второй версии алгоритма. Эта версия обеспечивала
эффективное выполнение алгоритма, если не возникала новая работа, однако
алгоритм выполнялся последовательно. Периодически происходила проверка
возможности порождения новой работы, и если таковая обнаруживалась, то
происходил возврат к параллельной версии.