65
2.2 Реализация выполнения комплекса работ при использовании
фиксированного количества параллельных ресурсов
Прежде чем переходить к описанию предлагаемых вариан-
тов реализации, следует оговорить следующий момент. В [1] бы-
ло указано, что вследствие того, что любая работа текущего яруса
находится в зависимости от хотя бы одной работы предыдущего
яруса, она не может быть начата раньше, чем завершится выпол-
нение работ предыдущего яруса.
Следует отметить, что
это не совсем верно, однако рассмот-
рение с такой точки зрения помимо своих минусов имеет и свои
плюсы. При подобной реализации нам в любой момент известно
необходимое количество параллельных ресурсов, требуемых для
выполнения работ, поскольку оно равно ширине выполняющего-
ся в текущий момент яруса.
Следует также отметить, что такой подход
может быть дос-
таточно эффективным и простым для реализации при условии,
что в пределах каждого яруса все работы приблизительно одина-
ковы по длительности.
В противном же случае, когда длительности существенно
различаются, а зависимостей между работами не очень много,
могут возникнуть существенные потери времени на ожидание
некоторой работой завершения какой-либо работы
предыдущего
яруса, от которой она не зависит.
Поскольку в реальности встречаются разные ситуации, мы
рассмотрим оба варианта. Вначале рассмотрим реализацию более
простого случая, когда все работы выполняются строго поярусно,
т.е. никакая работа следующего яруса не начинается до тех пор,
пока не закончат выполнение все работы текущего яруса.
Для простоты
и наглядности абстрагируемся от необходи-
мости передачи входных и выходных данных между работами и
сконцентрируемся на распределении их выполнения между па-
раллельными ресурсами. Будем считать, что данные передаются
через разделяемые ресурсы внутри работ.
В приложении 2 приведен код предлагаемых классов, рас-
параллеленный средствами интерфейса OpenMP. Среди них,
прежде всего, абстрактный класс работы: