Научная статья на тему 'Оценки времени в модели параллельного выполнения программ'

Оценки времени в модели параллельного выполнения программ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
94
40
i Надоели баннеры? Вы всегда можете отключить рекламу.
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Оценки времени в модели параллельного выполнения программ»

Для сравнения применялся BKZ-алгоритм приведения базиса целочисленных решеток, размерность которых n=50, ..., 100, с шагом 10, длина представления координатного компонента в десятичных знаках была равна 15, Р=32, Д равна четырехкратной точности числа с плавающей запятой (34 десятичных знака). Результаты сравнения приведены на рисунке. С ростом размерности базиса целочисленной решетки растет эффективность комплекса LRT. При размерности n=100 LRT эффективнее fpLLL и NTL на 17,2 % и 24,3 % соответственно.

Комплекс LRT является эффективным средством в классе последовательных реализаций для решения означенных выше задач. Он обеспечивает высокую числовую устойчивость результатов и возможность работы с целочисленными решетками больших размерностей. Следующим шагом в развитии программного комплекса LRT станет применение в нем параллельных алгоритмов орто-гонализации на основе OpenCL, NVIDIA CUDA, AMD Core Math Library и Intel Math Kernel Library.

Литература

1. Conway J.H., Sloane N.J.A. Sphere Packings, Lattices and Groups. Springer. 3rd edition, 1999, 703 p.

2. Dwork C. Lattices and their Application to cryptography [Lecture Notes] Stanford University. 1998, 116 p.

3. Grotschel M., Lovasz L., Schrijver A. Geometric Algorithms and Combinatorial Optimization. Springer-Verlag, 1993, 564 p.

4. Mobasher A. Applications of Lattice Codes in Communication Systems. Canadian theses. University of Waterloo. Dept. of Electrical and Computer Engineering, 2008, 147 p.

5. Bernstein D.J., Buchmann J., Dahmen E. (eds.). Post Quantum Cryptography. Springer, 2009, pp. 147-191.

6. Press W.H., Teukolsky S.A., Vetterling W.T. Numerical Recipes: The Art of Scientific Computing. New York: Cambridge University Press. 2007. 1262 p.

7. Lenstra A.K., Lenstra H.W., Lovasz L . Factoring polynomials with rational coefficients. Math. Ann., 1982. Vol. 261, no. 4, pp. 515-534.

8. Schnorr C.P., Euchner M. Lattice basis reduction: Improved practical algorithms and solving subset Sum Problems. Fundamentals of Computation Theory, 1991, pp. 68-85.

9. Higham N.J. Accuracy and Stability of Numerical Algorithms Society for Industrial and Applied Mathematics, 2002, 711 p.

10. Комплекс LRT. URL: http://www.lcrypto.com/lsolv/ (дата обращения: 1.06.2012).

11. Lattice challenge. URL: http://www.latticechallenge.org/ (дата обращения: 1.06.2012).

12. Goldstein D., Mayer A. On the equidistribution of Hecke points. Forum Mathematicum. 2003. Vol. 15, no. 2, pp. 165-189.

References

1. Conway J.H., Sloane N.J.A., Sphere Packings, Lattices and Groups, Springer, 1999, 703 p.

2. Dwork C., Lattices and their Application to cryptography, Stanford Univ., 1998, 116 p.

3. Grotschel M., Lovasz L., Schrijver A., Geometric Algorithms and Combinatorial Optimization, Springer-Verlag, 1993, 564 p.

4. Mobasher A., Canadian theses, Univ. of Waterloo, 2008, 147 p.

5. Bernstein D.J., Buchmann J., Dahmen E., Post Quantum Cryptography, Springer, 2009, pp. 147-191.

6. Press W.H., Teukolsky S.A., Vetterling W.T., Numerical Recipes: The Art of Scien. Comput., N.Y., Cambridge University Press, 2007, 1262 p.

7. Lenstra A.K., Lenstra H.W., Lovasz L ., Factoring polynomials with rational coefficients, Math. Ann., 1982, Vol. 261, no. 4, pp. 515-534.

8. Schnorr C.P., Euchner M., Lattice basis reduction: Improved practical algorithms and solving subset Sum Problems. Fundamentals of Computation Theory, 1991, pp. 68-85.

9. Higham N.J., Accuracy and Stability of Numerical Algorithms Society for Industrial and Applied Math., 2002, 711 p.

10. Software package LRT, Available at: http://www.lcrypto. com/lsolv (accessed 1 June 2012).

11. Lattice challenge, Available at: http://www.latticecha-llenge.org/ (accessed 1 June 2012).

12. Goldstein D., Mayer A., On the equidistribution of Hecke points. Forum Math., 2003, Vol. 15, no. 2, pp. 165-189.

УДК 004.42

ОЦЕНКИ ВРЕМЕНИ В МОДЕЛИ ПАРАЛЛЕЛЬНОГО ВЫПОЛНЕНИЯ ПРОГРАММ

В.А. Биллиг, к.т.н., профессор, с.н.с. (Тверской государственный технический университет, наб. Аф. Никитина, 22, г. Тверь, 170026, Россия, [email protected])

Одним из магистральных направлений развития информационных технологий является параллельное программирование. Модели параллельных вычислений и связанные с ними характеристики важны для построения программных систем. Они позволяют понять, какого ускорения можно достичь, используя параллелизм в программах.

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

Целью настоящей работы является получение оценок времени выполнения программы одним процессором (T1), конечным числом процессоров (Тр) и для идеализированного случая - неограниченным числом процессоров (7œ). Такие оценки ранее получены в предположении, что все модули программы выполняются за одно и то же время. Рассматривается получение этих характеристик для более интересного случая, когда время выполнения модулей программы различно. Показано, что время выполнения программы для случая р процессоров удовлетворяет соотно-

T1 T1 шению — < Тр <--+ T .

Р Р

Ключевые слова: параллельные вычисления, вычислительная система с общей памятью, граф зависимостей, оценки времени выполнения.

MODEL OF CONCURRENT EXECUTION OF PROGRAM. ESTIMARES OF EXECUTION TIME Billig V.A., Ph.D., Professor, Senior Researcher (Tver State Technical University, 22, Quay Nikitin, Tver, 170026, Russia, [email protected])

Аbstract. Concurrent programming has become one of the main directions of the information technologies development. Concurrent execution models and characteristics connected with them are important for the development of program systems. Such models allow to understand which acceleration may be obtained using concurrency in our program.

A model of concurrent execution in computer system with common memory is considered. The running program is regarded as a set of modules connected by data. This link is reflected by graph of dependencies.

The goal of the present paper is establishing the estimates of execution time program by one processor - T1, finite number of processors - Tp and unlimited number of processors - T„ . Such estimates are known for the case when execution times of all modules in our program are equal. We will establish the estimates for the case more interesting for practice when execution times of all modules are different. In the paper we show the execution time for the case of p processors to satisfy

T1 T1 the following relations: — < Тр <--+ Tœ .

РР

Keywords: concurrent execution, parallel execution, system with common memory, graph of dependencies, estimates of execution time.

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

Для поддержки параллельных вычислений сделано достаточно много - начиная от архитектуры вычислительных систем, операционных систем, языков программирования до разработки специальных параллельных алгоритмов. Тем не менее программисту, решающему сложную задачу, построить и отладить эффективную параллельную программу все еще довольно трудно. В докладе [1] отмечалось, что к началу активного внедрения вычислительных систем параллельной архитектуры в практику решения больших прикладных задач не был построен нужный теоретический фундамент и не был развит математический аппарат исследований.

Цель данной работы - рассмотрение одной из моделей параллельного вычисления. Для нее не-

обходимо получить оценки времени выполнения программы одним процессором - 71, конечным числом процессоров - Тр и для идеализированного случая неограниченным числом процессоров -Т<».

Рассмотрим программу Р, состоящую из п модулей: Р={МЬ Ыъ ..., М„>.

Предположим, что программа Р выполняется на компьютере с некоторым числом процессоров, работающих на общей памяти. Выходные данные, полученные в результате работы модуля М„ могут быть входными для модуля Mj. Так естественным образом возникает зависимость между модулями, определяющая возможный порядок их выполнения.

Разобьем множество модулей на k уровней. К уровню I отнесем модули, для начала работы которых требуется завершение работы модулей, из которых хотя бы один принадлежит уровню /-1. Модуль уровня I с номером k будем обозначать как Мк'.

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

Свяжем с программой Р ориентированный граф зависимостей модулей. Граф не содержит циклов и отражает разбиение модулей на уровни. Модули являются вершинами графа, а дуги отра-

жают зависимости между модулями. Дуга ведет от модуля Мк к модулю М/, если для начала выполнения модуля Мк требуется завершение работы модуля М/. В узлах графа содержится информация об ожидаемом времени выполнения модуля, где время измеряется в некоторых условных единицах. На рисунке 1 показан пример графа зависимостей.

( 5 з ) ( 7 2 )

4 ) ( 6 ) ( 3

Рис. 1

Введем обозначения: Т - время, требуемое для выполнения программы Р одним процессором, Тр - р процессорами, Тю - неограниченным числом процессоров. В последнем случае достаточно п процессоров (по числу модулей нашей программы).

Предполагается, что все эти характеристики рассчитываются при соблюдении двух условий:

- выполняются зависимости между модулями, заданные графом зависимостей;

- характеристики вычислены для оптимального расписания работы процессоров.

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

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

Для случая р процессоров можно распределить модули по процессорам, задав для каждого процессора Р, множество модулей, выполняемых этим процессором: D(PI)={MI,Ь М,,2, ..., М>}-

Распределение модулей по процессорам совместно с графом зависимостей однозначно определяет расписание работ и время выполнения программы при данном расписании. Предполагается, что каждый процессор выполняет модули из распределения D(Pi). После завершения очередного модуля он сразу же переходит к выполнению следующего, если для этого модуля выполнены все зависимости, заданные графом зависимостей. В противном случае процессор ждет окончания работы требуемых модулей. Время завершения последнего модуля в распределении D(Pi) задает

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

т =тп Т.

Задача составления оптимального расписания относится к сложным [2]. На практике для программ большого размера не удается явно вычислить значение Тр. По этой причине несомненный интерес представляет получение оценок для Тр.

Для введенных характеристик выполняется естественное соотношение

т < т < Т.

да р 1

(1)

Представляет интерес получение более точных оценок для Тр.

Рассмотрим вначале упрощенную ситуацию, предположив, что время выполнения всех модулей одинаково и равно Д Видим, что

Тх=пП. (2)

Действительно, один процессор должен выполнить все модули программы, проходя, например, последовательно один уровень за другим. Нетрудно посчитать и время Тю:

Тда к* t.

(3)

Действительно, пусть на первом уровне имеется П1 модулей. У них есть все необходимые данные, и они могут выполняться параллельно. Поскольку число процессоров неограниченно, то, запустив каждый модуль на одном из п имеющихся процессоров, за время t завершим выполнение модулей первого уровня. Пусть за время i*t завершено выполнение всех модулей всех уровней от первого до /'-го. Тогда возможно параллельное выполнение модулей следующего /+1-го уровня, число которых равно п,+ь Процессоров в данном случае хватает, поэтому на завершение всех модулей уровня потребуется t времени, и общее время выполнения равно (/+1)*^ что по индукции доказывает справедливость формулы (3).

Для времени Тр получим оценки сверху и снизу. Понятно, что р процессоров могут выполнить

П1*,

вычисление п, модулей уровня / за время — * t,

Р

где \х] обозначает минимальное целое, большее или равное х. Два процессора смогут выполнить пять модулей уровня 1 за время 3*t. Отсюда следует, что общее время работы Тр задается форму-

лой

Т = I

н.

(4)

Поскольку \х]>х, то

к ,„ < к

Тр > £П *, =1* £ =И = Т . (5)

¡=1 Р Р ¡=1 Р Р Формула (5) дает нижнюю оценку времени выполнения работы р процессорами:

Тр>Т^. (6)

п

¡=1

Если на каждом уровне число модулей и, кратно р, то оценка достижима. В лучшем случае р процессоров могут сократить время выполнения программы в р раз в сравнении со временем, требуемым для выполнения этой работы одним процессором.

Вычислим теперь оценку сверху. Поскольку [х]<х+1, то

Т * X

п+1

г

к

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

к

* г =— * У р ^

п * г

ХП I

г =— +

¿=1 ¿=1 р

+к * г =Т+т

Объединив (6) и (7), получим

Т1 Т1

— <Т„<—+т .

(7)

(8)

Р Р

Оценки (8) для случая, когда время выполнения всех модулей одинаково, известны [3].

Рассмотрим теперь, что происходит, когда модули программы для своего выполнения требуют разного времени. Пусть М' - множество модулей уровня /:

(9)

м= {м;, м2,..., м'к,}.

Для каждого из этих модулей известно время выполнения - tij.

И в этом случае нетрудно рассчитать Т1 - время, требуемое на выполнение всей работы одним процессором:

к к ¿=1 ]= 1

(10)

Далее выясним, как рассчитать время Тю при неограниченном числе процессоров. Введем для каждого модуля время окончания его работы / и рассчитаем его по следующей формуле:

4 =',,> + Сх . (11)

Здесь - время окончания работы того модуля уровня /-1, который необходим для работы модуля М/ и из всех необходимых модулей завершает свою работу последним.

Тогда время Тю можно рассчитать следующим образом:

Т„ = тах{к} .

(12)

Из формулы (12) становится ясно, что время завершения последнего модуля уровня k и является временем Тю при оптимальном расписании работ. Справедлива следующая теорема.

Теорема. Время Тю задается в графе зависимостей максимально нагруженным путем.

Прежде всего докажем, что при неограниченном числе процессоров оптимальное расписание каждого процессора содержит не более одного модуля на любом из уровней. Доказательство дается индукцией по числу уровней. Для уровня 1 утверждение справедливо, поскольку на нем число процессоров совпадает с числом модулей этого

уровня для оптимального расписания. Пусть утверждение справедливо на уровне Покажем, что оно остается справедливым и для модулей следующего уровня '+1. Действительно, рассмотрим процессор Рг, выполняющий /-й модуль уровня '-М/. Когда этот процессор завершит работу, может оказаться, что появятся готовые к выполнению т модулей уровня '+1, ожидавших завершения работы М/. Только один из этих модулей включается в оптимальное расписание процессора Рг, а остальные будут включены в расписание свободных процессоров, участвующих в работе. Если таковых не окажется, всегда можно добавить новые процессоры, так что все модули, ожидавшие завершения работы модуля М/, начнут выполняться одновременно. Отсюда по индукции следует справедливость утверждения для всех уровней, а также то, что Тю не может быть больше времени, задаваемого критическим путем.

Покажем теперь, что оптимальное расписание может быть составлено таким образом, чтобы критический путь был назначен одному процессору. Пусть процессор Р^ - тот процессор, которому назначен М,1 первого уровня, лежащий на критическом пути. Спускаясь по уровням, этому процессору будем назначать модуль, лежащий на критическом пути. Построенное таким образом расписание сохраняет свойство оптимальности, поскольку процессор Р^ не простаивает и никакой другой процессор не может начать выполнение модулей, лежащих на критическом пути, раньше процессора Р^. Обратим внимание, что критический путь, вообще говоря, может быть не единственным.

На этом доказательство утверждения закончено.

Сложнее получить формулу для вычисления Тр. Проблема составления оптимального расписания в этих условиях относится к ЛР-полным проблемам, что означает отсутствие алгоритма полиномиальной сложности, и для решения задачи необходимы переборные алгоритмы.

Покажем справедливость ранее полученных оценок (8) для Тр в случае, когда время выполнения модулей различно и в графе зависимостей для каждого модуля задано время его работы:

Т1 Т1

— <т„<—+Т .

(13)

РР

Дадим вначале графическую интерпретацию. Задание нижней и верхней оценок для Тр означает, что эта функция ограничена двумя гиперболами. Функция убывающая. В начальной точке при р=1, по определению, Тр(1)=Т1, так что функция находится в заданном коридоре. Это же справедливо и для конечных точек, для всех р, больших некоторого значения р , при котором Тр=Тю. Остается показать, что утверждение верно и для остальных значений 1<р<р*. Рисунок 2 иллюстрирует поведение Тр.

¿=1

Для примера рассмотрим двухуровневую систему модулей, граф зависимостей которых показан на рисунке 1.

Нетрудно посчитать, что в этом случае Т1=30, Тю=13.

При наличии двух процессоров для этого конкретного примера несложно задать оптимальное расписание. Для первого процессора последовательность выполняемых им модулей может быть следующей: Р^М/, М2\ М12, М32}, а для второго процессора - Р2={М3\ М41, М22}.

Время работы как первого, так и второго процессоров равно 15. Следовательно, Т2 равно 15. Критический путь входит в расписание второго процессора. Подключение второго процессора в этой задаче позволяет вдвое уменьшить время выполнения по сравнению с использованием только одного процессора. Подключение третьего процессора позволит свести время выполнения до минимально возможного результата - Тю, это не так эффективно, поскольку время сократится незначительно. Добавление других процессоров не имеет смысла, так как время решения задачи не сокращается.

Опишем получение оценок.

Оценка снизу

Лемма 1. Для Тр справедлива оценка

Т

Т > Т Р~ Р .

(14)

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

Т = (р >:

(15)

а максимальное время, затраченное одним из процессоров на выполнение своей работы, составит Тр = тах Т(р). (16)

Т

Справедливость нижней оценки Т > — следу-

Р

ет из общих свойств суммы компонентов. Максимальный компонент всегда больше среднего арифметического значения суммы или равен ему.

Если некоторые процессоры могут простаивать, то время Тр может только увеличиваться, что гарантирует выполнение условия (16).

Лемма доказана.

Равенство достигается в единственном случае, когда все компоненты суммы имеют одно и то же значение. Содержательно это означает, что все процессоры начинают и заканчивают свою работу одновременно. В этом случае общее время выполнения работы сокращается в р раз.

Оценка сверху

Пусть работу выполняют р процессоров. Составление расписания означает, что граф зависимостей разбивается на р непересекающихся подграфов. Все модули каждого из подграфов выполняются одним процессором. Подграф с максимальным временем выполнения для данного разбиения будем называть максимально нагруженным подграфом. Оптимальное расписание предполагает такое разбиение, при котором максимально нагруженный подграф выполняется за минимально возможное время. Ранее мы доказали, что оптимальное расписание может быть составлено таким образом, чтобы критический путь выполнял один процессор. Отсюда следует, что критический путь полностью принадлежит одному из подграфов. Итак, предположим, что граф зависимостей G разбит на непересекающиеся подграфы

О = 0 О .

(17)

Не снижая общности, будем полагать, что максимально нагруженным подграфом является G1. Лемма 2. Для Тр справедлива оценка

Т

Т < -1 + Т .

р да

Р

(18)

Доказательство от противного. Покажем, что в этом случае разбиение не является оптимальным и может быть улучшено, что приведет к уменьшению времени Тр.

Итак, предположим, что

Е Т (^)

Т = Т(в1 ) > -+ Тм .

р

Отсюда следует: р *Т (G1) > £ Т(GÍ) + р * Т

(19)

£ т(С, )

^ Т (^) > ¿=2 ■■р

со

(20)

р-1 р -1

1=1

¡=1

¿=1

Пусть Go - минимально нагруженный подграф, тогда время его выполнения не больше среднего времени выполнения, так что имеем

T (G ) > T (G0 )T p-1

(21)

Подграфу G0 передадим часть работ подграфа Gb уменьшив суммарное время работы. Действительно, подграф Gi - это максимальный подграф, не содержащий критического пути, поэтому его можно представить в виде

G1 = Path J G1. (22)

Здесь Path - это часть пути или некоторый путь, начинающийся на первом уровне, который заведомо меньше критического пути. При передаче его подграфу G0 время выполнения этого подграфа остается меньше времени выполнения подграфа Gi. Общее время выполнения работ при этом уменьшится. Следовательно, выявляется противоречие с утверждением об оптимальности расписания, что доказывает справедливость соотношения

T = т (g ) <

St (G )

т

-+ T <т+T .

OD OD

p

(23)

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Лемма 2 доказана.

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

Эта разница максимальна для крайнего случая, когда все модули могут выполняться независимо и в графе зависимостей все они находятся на одном первом уровне. Критический путь в этом случае состоит из одного модуля, требующего максимального времени своего выполнения. Так что, Т1 - это время выполнения всех модулей, а Тю - вре-

мя выполнения одного модуля. Привлечение p процессоров может дать существенный эффект, уменьшая время выполнения практически до среднего времени выполнения одного модуля Tj/p.

Эта разница минимальна для другого крайнего случая - строго последовательной программы, когда N модулей программы расположены на N уровнях и критический путь задает выполнение всех модулей. В этом случае T и Tœ совпадают и, как следствие, Tp равно T при любом числе процессоров, поэтому привлекать дополнительные процессоры в этом случае бессмысленно.

Для строго последовательной программы, когда i-й модуль зависит от модуля i-1, все три характеристики будут совпадать. Для строго последовательной программы дополнительные процессоры не позволяют уменьшить время выполнения программы в сравнении со временем выполнения этой же программы одним процессором. Так, например, задача о Ханойской башне на суперкомпьютере с сотнями тысяч процессоров будет решаться столь же долго, как и на компьютере с одним процессором. Это вытекает из сути задачи -перенос следующего кольца требует завершения переноса предыдущего кольца, параллельно эту работу выполнять нельзя.

Литература

1. Воеводин В.В. Математические проблемы параллельных вычислений // Методы и средства обработки информации: тр. 2-й Всеросс. науч. конф. М.: Изд-во МГУ, 2005.

2. Cormen T.H., Leiserson Ch.E., Rivest R.L., Stein C. Introduction to Algorithms, 2009, Mit Press.

3. Гергель В.П. Теория и практика параллельных вычислений. М.: Бином, 2007.

References

1. Voevodin V.V., 2nd al-Russia Conf.: Metody i sredstva obrabotki informatsii, 2012.

2. Cormen T.H., Leiserson Ch.E., Rivest R.L., Stein C., Introduction to Algorithms, Mit Press, 2009.

3. Gergel V.P., Theory and Practice od Concurrent Executions, Moscow, Binom, 2007.

УДК 004.031.42

МЕТОДЫ И ИНСТРУМЕНТЫ РЕАЛИЗАЦИИ ПРЕДМЕТНО-ОРИЕНТИРОВАННЫХ компонентов ОБУЧАЮЩИХ СИСТЕМ

(Работа выполнена при поддержке РФФИ, грант № 11-07-00551)

А.В. Редькина, к.т.н., доцент; А.В. Редькин, к.т.н., доцент (Сибирский федеральный университет, просп. Свободный, 79, г. Красноярск, 660041, Россия, [email protected]); Л.Е. Карпов, д.т.н., с.н.с. (Институт системного программирования РАН, ул. А. Солженицына, 25, г. Москва, 109004, Россия, [email protected]); Д.А. Аношин, магистр (Сибирский федеральный университет, просп. Свободный, 79, г. Красноярск, 660041, Россия, [email protected])

i Надоели баннеры? Вы всегда можете отключить рекламу.