Введение
Увлекающийся практикой без науки - словно кормчий, ступающий на корабль без руля и компаса: он никогда не знает, куда приплывет. Леонардо да Винчи
При освоении вычислительной техники параллельной архитектуры нередко возникают различные вопросы, связанные с повышением эффективности процессов решения задач. Вопросы, на которые найти ответы почти всегда не просто. Особенно часто они касаются того, почему на, казалось бы, мощной вычислительной системе какая-то конкретная задача решается довольно медленно, и что надо сделать, чтобы эта задача решалась максимально быстро? И можно ли вообще быстро решить данную задачу? И если нельзя, то почему? Практика, даже очень обширная, не дает ответы на такие вопросы, а ограничивается лишь весьма расплывчатыми рекомендациями. Поиск причин возникновения трудностей при решении задач на вычислительной технике параллельной архитектуры неизбежно приводит к выводу, что как истоки этих причин, так и пути их преодоления надо искать в математических знаниях об алгоритмах.
Говоря о математических знаниях, подчеркнем особо, что речь идет не о том, как получить математически правильный результат. Эта цель, традиционная для всей математики, остается актуальной и для параллельных вычислений. Сейчас идет речь о построении эффективных процессов нахождения решений, когда ресурсы конкретных систем на конкретных задачах используются для достижения максимально возможного ускорения. Получить достаточно хорошее ускорение исключительно важно, так как вычислительные системы параллельной архитектуры и создаются только для того, чтобы очень быстро решать большие задачи.
Но при чем здесь математические знания? Ведь максимально быстрое решение пользовательских задач декларируется как главная цель конструкторов вычислительных систем. На нее же направлены усилия системных программистов, разработчиков языков программирования и компиляторов. Но декларация цели - это всего лишь объявление потенциальных возможностей. А вот насколько удается достичь декларируемых возможностей на конкретных задачах - это показывает практика. Пока декларация и реальность в области использования современной вычислительной техники различаются существенно.
Скорость решения задач зависит как от вычислительной техники, так и от используемых алгоритмов. Это очевидно. Есть еще одна, менее заметная зависимость, которая также влияет на скорость, причем тем существеннее, чем сложнее техника - это степень согласованности структуры алгоритмов с ее архитектурой. Для любого последовательного и близкого к нему по архитектуре компьютера согласованность с алгоритмами отходит на второй план, поскольку на скорость решения задач решающим образом влияет только общее число выполняемых операций. Однако для всех конкретных параллельных вычислительных систем именно степень согласованности структуры алгоритмов с архитектурой систем играет самую важную роль в достижении наивысших скоростей.
Заметим, что как самостоятельный раздел структура алгоритмов развивается уже около трех десятилетий. Первоначально касающиеся ее сведения появлялись, главным образом, в процессе поиска ответов на конкретные вопросы из области параллельных вычислений. Однако по мере накопления возникающих знаний становилось ясно, что имеется огромный пробел в понимании того, как же на самом деле устроены используемые нами алгоритмы. В первую очередь на уровне информационных связей между отдельными операциями. В процессе проведения исследований появилось немало новых математических объектов, таких как параллельная форма, граф алгоритма, развертка и т.п. Может создаться впечатление, что эти объекты имеют узкое применение, не выходящее за рамки параллельных вычислений. Но оказалось, что они самым прямым образом связаны со многими математическими задачами, не имеющими никакого отношения к параллельным вычислениям. К ним можно отнести, например, быстрое вычисление градиента и производной, быстрое восстановление линейного функционала, исследование влияния ошибок округления, восстановление формульных выражений из реализующих их программ и многое другое.
В настоящее время различные разделы математики, так или иначе относящиеся к вычислениям, слабо связаны между собой. Вполне возможно, что новый ее раздел, зародившийся в силу необходимости решать и исследовать многочисленные проблемы параллельных вычислений и получивший название информационная структура алгоритмов и программ, станет естественным связующим звеном.
Вот почему появилась идея подготовить небольшой цикл лекций, посвященный новым математическим знаниям по структурам алгоритмов. Формально этот цикл связан только с параллельными вычислениями. Но излагаемые в нем сведения могут оказаться полезными и в других областях математики.
В.В.Воеводин