Эта проблема возникла в процессе преобразования программы для исследования
излучательного переноса, реализованной на суперЭВМ CRAY-1, в многозадачную
программу для ЭВМ HEP. Решаемая задача является задачей с временной
зависимостью, а вычисление для каждого временного шага имеет три
последовательные стадии.
В программе рассматривается только случай сферической симметрии, и на второй
стадии (ядро алгоритма) - пошаговая обработка серии пучков (каждый пучок
касателен к сферической оболочке).
Интегрирование по каждому пучку может производиться независимо от
интегрирования по другим пучкам, что позволяет выполнить естественное
распараллеливание задачи. Таким образом, в программе для ЭВМ HEP образуется
группа параллельных процессов, каждый из которых запускается при обнаружении
пучка, требующего вычислений, выполняет это вычисление и вновь ищет новый пучок.
Первая и третья стадии этого вычисления также имеют простые структуры,
состоящие в основном из двойных вложенных циклов DO с независимыми внешними
итерациями. Нетрудно было установить несколько мест, где требовалась
синхронизация парадельных процессов:
1. Необходимо было разделить каждую из трех последовательных стадий
синхронизационными барьерами с тем, чтобы ни один из процессов не мог
выполняться на следующей стадии до тех пор, пока не завершатся все процессы на
текущей стадии.
2. Следовало позаботиться о том, чтобы никакие два процесса не выбрали для
работы один и тот же пучок и чтобы никакой пучок не остался необработанным.
3. В процессе пошаговой обработки пучка необходимо обновлять некоторые общие
массивы и ясно, что эта модификация должна производиться в критической секции.