Расширения последовательных языков до параллельных бесперспективны, считает создатель CAPER Сергей Вартанов

Сергей Рубенович Вартанов – специалист по параллельным вычислениям, языкам программирования, системам управления, обработке изображений и распознаванию образов. Кандидат физико-математических наук (1988). Создатель языка программирования CAPER для параллельных вычислений.

Какие сейчас основные решения по распараллеливанию вычислений?

Основные решения по распараллеливанию вычислений, представленные на рынке, можно разделять на многопроцессорные (многоядерные, матричные GPU, т.е. с высокой электронной интеграцией), и многомашинные (кластеры, где архитектурными “законодателями мод” являются компании Cray и IBM), объединяющие в себе однородные и/или разнородные вычислительные установки средствами внешних к вычислителям коммуникаций. Например, один из вариантов, созданных Cray, объединял множество собственных векторно-конвейерных машин на базе J-90, многопроцессорные Opteron AMD для скалярных вычислений и кластеры матричных процессоров от nVidia, тем самым обеспечивая большинство распространенных видов вычислений.

Программное обеспечение для параллельных вычислений, которое развивается с начала 90-х, в основном опирается на расширение известных языков программирования C/C++, Java и других. Существуют решения, основанные на свойстве параллельного развертывания рекурсивных операторов, параллельные интерпретации языка LISP и LISP-подобных языков. Языки CUDA, F# и некоторые другие ориентированы на описание и подготовку матричных преобразований на GPU. Используются специализированные библиотеки программ, позволяющие распараллеливание вычислений в среде кластеров (в частности, на базе MPI), OpenCL для программирования GPU и подобные. Наконец, наиболее распространенное средство распараллеливания для многопроцессорных/многоядерных вычислителей – средства многозадачности операционных систем, относящиеся к так называемым “тяжеловесным” параллельным процессам.

В чём заключается разработанный Вами подход к распараллеливанию вычислений?

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

В 1992 году я поставил задачу создания языка программирования, полностью ориентированного на возможности выразительного описания параллельно исполняемых программ для всех классов вычислений по Флинну (Flynn). Мной была решена задача разработки средств программирования большого множества однородных или разнородных параллельных процессов, выполняющих преобразования над общими или разделенными данными и обрабатывающих асинхронно возникающие события. При этом задавались следующие цели:

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

Первые две версии языка были сделаны для MS DOS. И если сама DOS позволяла запускать два псевдопараллельных процесса, то я имел возможности на 386-ом процессоре запускать по нескольку тысяч процессов с приемлемым временем исполнения. В 1995 появилось и первое коммерческое приложение, которое занималось анализом и рубрицированием информации. В конце 90-х была создана 3-я версия языка под Windows, позже – под UNIX и другие платформы. Название CAPER отражает некоторые сущности языка: возможность динамической компиляции и параллельность асинхронной обработки событий.

Чего удалось достичь на основе Ваших разработок и где они были применены?

CAPER не уступает по быстродействию SystemC (язык проектирования и верификации моделей системного уровня, реализованный в виде C++ библиотеки), применяемого в чип-дизайне, в том числе в имитации работы множества взаимодействующих конструктивных элементов (процессоры, память и др). Более того, в отличие от SystemС в параллельном режиме Caper быстрее, а количество параллельных процессов ограничено только размерами оперативной памяти. Caper на 25-30% быстрее Java для последовательных вычислений и качественно быстрее при работе множества параллельных процессов (разработчики Java так и не разобрались с легковесными процессами, хотя планировали это сделать еще в первой половине 90-х).

Сегодня разработана 5-я версия, имеющая одной из особенностей распределенную по ядрам процессора виртуальную машину. Это позволило существенно увеличить производительность вычислений. Например, можно одновременно запускать свыше миллиона параллельных процессов, имитирующих клеточные автоматы без использования средств многозадачности операционных систем.

В активе применения языка решение таких задач, как:

  • выделение и кодификация порядка полутора тысяч элементов радужной оболочки глаза для проекта Synapse Communications Inc. (Япония);
  • сопоставление и сравнение изображений для проектов поиска и распознавания “нужных вещей” на изображениях  NurVentures, Inc. (США);
  • создание быстрого параллельного алгоритма кластеризации изображений для Memcosoft, Inc. (США-Армения), в том числе, в графическом редакторе на языке Caper;
  • параллельная обработка данных медицинской рентгенографии  для Course-AS (Россия);
  • разработка графической оболочки описания схем параллельных вычислений для матричных процессоров (GPU) с возможностями имитации одновременной работы с множеством  устройств со стороны различных потоков задач (CRDF Award, №ARM1-9023-YE-10);
  • имитационное моделирование “близоруких” систем (клеточные автоматы, нейронные сети) и др.

По моему глубокому убеждению, расширения последовательных языков до параллельных бесперспективны. В первую очередь потому, что не учитывают содержательного требования от философии параллелизма – структурной выразительности текстов программ, ориентированных на параллельное выполнение.

Параллельные вычисления – тема гигантская, с очень емкой проблематикой в каждом из направлений. Тема для нескольких поколений математиков, разработчиков и программистов. Отдельный мир. Если учесть, что отношусь к скептикам (с обоснованием!) в части возможностей создания полноценных квантовых вычислителей, то, полагаю, ближайшие десятилетия специалисты проведут именно в этом мире, и ни в каком другом.

С чего начинались Ваши исследования по параллельным вычислениям?

Это началось, практически, сразу после окончания университета, когда возглавил группу по созданию системы управления распределенными вычислительными комплексами обработки космической информации. В 1982-ом году. А также с теории систем параллельных подстановок, созданных в Новосибирске, и являющимися некоторым расширением клеточных автоматов фон Неймана. Первая любовь. Как известно, на всю жизнь.

Тогда же занялся вопросами автоматического распараллеливания программ. И тогда же довольно быстро убедился, что автоматическое распараллеливание малоэффективно в общем случае. Начиная с уже простейших классов программ, в которых присутствуют операторы ветвления вычислений (не их частные случаи), предсказать возможное максимальное распараллеливание программ алгоритмически невозможно. Более того, не существует универсальных однозначно эффективных стратегий автоматического распределения вычислений по вычислителям (например, в случаях превышения количества одновременно выполнимых инструкций, процедур, потоков программ над количеством физических устройств). Характерным примером неудач в этом направлении является известный проект HPF.

В целом, алгоритмизация и программирование параллельных вычислений требует не только значительных знаний проблематики параллелизма, но и значительной искушенности и изобретательности. Это – к ответу на вопрос о том, являются ли алгоритмизация и программирование искусством или инженерией. Отсюда же и вывод, ставший для меня стимулом для всех последующих работ: императивное программирование, т.е. программирование с прямым указанием инструкций и процедур программ, которые должны выполняться параллельно.

Интервью: Иван Степанян

Read more: Современная наука с Иваном Степаняном ...