TECHNICAL SCIENCES
Гасанов З.З.
ФГБОУ ВО «Дагестанский государственный технический университет»,
аспирант
ПРОБЛЕМЫ АВТОМАТИЧЕСКОГО РАСПАРАЛЛЕЛИВАНИЯ КОМПЬЮТЕРНЫХ
ПРОГРАММ
PROBLEMS OF AUTOMATIC SOFTWARE PARALLELIZATION
Gasanov Z.Z.
FSBEE HE Daghestan State Technical University,
postgraduate student
АННОТАЦИЯ
Рассмотрены основные сложности, возникающие при разработке средств автоматизации распараллеливания компьютерных программ. Особое внимание уделено циклам как структурам, на которые наиболее часто направлено распараллеливание. Приведены примеры различных архитектур параллельных вычислительных систем. Выполнено сравнение императивных и функциональных языков программирования с точки зрения легкости распараллеливания программ.
ABSTRACT
The main difficulties encountered in the development of automation software parallelization tools are discussed. Special attention is paid to the cycles as structures, to which parallelization is commonly directed. Examples of different parallel computing system architectures are given. The comparison of imperative and functional programming languages in terms of ease of paralleling programs is done.
Ключевые слова: параллельные вычисления, автоматизация, чрезвычайно параллельная задача, симметричное мультипроцессирование, неравномерный доступ к памяти, побочные эффекты, функциональное программирование.
Keywords: parallel computing, automation, embarrassingly parallel problem, symmetric multiprocessing, non-uniform memory access, side effects, functional programming.
Распространение параллельных вычислительных систем требует изменения подхода к написанию программ. Традиционные последовательные программы неэффективно задействуют предоставляемые современными машинами вычислительные ресурсы, поэтому необходимо использовать методики параллельного программирования. Новое программное обеспечение можно сразу писать с расчетом на выполнение на параллельных вычислительных системах, однако что делать с имеющимся по? Ручное переписывание программ, особенно больших объемов, сопряжено с немалыми материальными и временными затратами, а также подвержено возникновению ошибок. В частности, для избавления от этого и следует применять методы автоматического распараллеливания.
Процесс автоматического распараллеливания компьютерных программ включает в себя анализ зависимостей различных участков кода. Однако это сопряжено с рядом трудностей.
1. Неизвестное или сложно вычисляемое значение количества итераций цикла. Цикл — одна из основных конструкций, на которую нацелено распараллеливание, поскольку обычно большую часть времени занимают различные вычисления в циклах. В случае параметризованных циклов с заранее детерминированным количеством итераций таких проблем не возникает, однако в случае циклов, условие выхода из которых вычисляется уже после
входа в цикл, сложно бывает разбить вычисления на несколько параллельных потоков.
2. Наличие вызовов функций, рекурсивных вызовов, а также косвенной адресации и указателей. Как уже было отмечено, при распараллеливании необходимо выполнять анализ зависимостей. Они могут быть двух видов: зависимости по данным и управляющие зависимости. Указанные конструкции сильно усложняют структуру кода. Это же относится и к уже названным циклам: итерации в них не должны содержать зависимостей по данным. Кроме анализа зависимостей, также проводят анализ алиасов и указателей.
3. Координация доступа к глобальным ресурсам. Если разные потоки пользуются некоторыми разделяемыми ресурсами, то необходимо синхронизировать доступ к ним. В общем случае при написании параллельных программ это не составляет большого труда, однако при автоматизированном распараллеливании возникает большое количество проблем.
4. Сохранение синтаксической и семантической корректности программы при применении преобразований [5]. После выполнения преобразований над высокоуровневым представлением программы оно должно всё так же быть синтаксически и семантически корректно, как и первоначальное представление. То есть нельзя вводить новые конструкции, которые не смогут быть распознаны
транслятором на этапах синтаксического и семантического анализа.
Если все итерации цикла при любом вызове могут быть выполнены одновременно (параллельно), его называют doall-циклом. Исходный код ниже представляет собой doall-цикл, поскольку он может быть распараллелен ввиду отсутствия в нем зависимостей между итерациями и результирующее значение массива z будет правильным вне зависимости от порядка выполнения итераций:
For (int i = 0; i < n; i++) {
z[i] = x[i] + y[i];
}
Задачу в системах параллельных вычислений, для разделения на несколько потоков которой не требуется выполнять сложные преобразования, называют чрезвычайно параллельной
(embarrassingly parallel problem). Из определения следует, что doall-циклы обладают свойством чрезвычайной параллельности, поскольку результаты выполнения итераций не зависят друг от друга, что позволяет с легкостью выполнить распараллеливание.
Примерами чрезвычайно параллельных задач являются платформы организации добровольных распределенных вычислений типа boinc, в которых нагрузка по вычислениям распределяется между компьютерами зарегистрированных участников. Более простым примером чрезвычайной параллельности является рендеринг видео с трассировкой лучей, когда каждый кадр видео может быть визуализирован независимо, при этом каждый пиксель каждого кадра также может быть визуализирован независимо.
Представленный ниже цикл не может быть автоматически распараллелен, поскольку значение
Symmetric Multiprocessing (SMP): Любой процессор может обратиться к любой области памяти с одинаковой скоростью
128GB RAM
Разбивая процесс вычислений на несколько параллельных потоков, важно правильно балансировать нагрузку между потоками, что также не всегда удается сделать удачно. Если для выполнения некоторого этапа вычислений требуется дождаться окончания выполнения вычислений на всех потоках, то даже один затянувшийся поток может сильно снизить эффективность распараллеливания,
_65
z[i] зависит от результата выполнения предыдущей итерации, z[i - 1]:
For (int i = 1; i < n; i++) {
z[i] = z[i - 1] * 2;
}
Таким образом, этот цикл уже не является doall. Однако это не означает, что он не может быть распараллелен. Выполним ряд преобразований и запишем новый цикл, результаты выполнения которого полностью идентичны результатам предыдущего цикла:
For (int i = 1; i < n; i++) {
z[i] = z[1] * math.pow(2, i - 1);
}
Мы преобразовали цикл с зависимостями в doall-цикл, но анализ и выполнение таких преобразований автоматически — очень сложная задача, с которой современные распараллеливающие компиляторы пока не справляются.
Помимо указанных сложностей, также следует учитывать время межпроцессного взаимодействия. Если потоки выполняются разными процессорами, то важно обращать внимание на стоимость перемещения данных между процессорами. Это особенно касается систем numa (non-uniform memory access — неравномерный доступ к памяти). Их отличие от систем архитектуры smp (symmetric multiprocessing — симметричное мультипроцесси-рование) заключается в том, процессоры, связанные с разными модулями памяти, могут работать с памятью параллельно, повышая тем самым скорость обработки данных. Однако при этом повышается время передачи данных между процессорами. Примерные схемы расположения процессоров и модулей памяти в архитектурах smp и numa [1] приведены на рисунке 1.
Non-Uniform Memory Access (NUMA): Доступ к. локальной памяти процессора осуществляется быстрее, чем к удаленной.
поскольку все остальные потоки будут вынуждены простаивать в ожидании его завершения.
Еще один момент, на который следует обратить внимание, — это количество создаваемых потоков выполнения. Известно, что на создание, удаление и переключение между потоками затрачивается некоторое время. Поэтому при
NUMA Node 1
Рисунок 1 — диаграммы архитектур smp и numa
автоматическом распараллеливании важно учитывать время на обслуживание потоковой инфраструктуры. Одно из решений состоит в использовании шаблона проектирования, который называется пулом потоков.
В общем случае при работе пула потоков рассматриваются следующие сущности: рабочий поток, пул потоков, задание и очередь заданий [3]. Задания представляют собой куски программного кода, которые предназначены для параллельного выполнения. Пул содержит некоторый набор потоков, количество которых обычно определяется при
создании пула. Эти потоки работают только в пределах данного пула и при его уничтожении также уничтожаются. Создание пула инициализирует набор рабочих потоков. Для выполнения задания оно добавляется в очередь. Если в пуле имеется свободный поток, он извлекает задание из очереди и приступает к его выполнению. В противном случае задания в очереди будут ожидать освобождения хотя бы одного из потоков в пуле. Работа пула потоков представлена на рисунке 2.
Завершенные задания
(«(«««(«)<—О <—
Рисунок 2 — пул потоков
Таким образом, использование пула потоков позволяет удобно управлять потоками и повторно использовать потоки для выполнения других заданий, что приводит к экономии ресурсов. Особенно это заметно при наличии большого количества небольших по времени выполнения заданий. Многие современные языки программирования включают средства для работы с пулами потоков. Так, например, стандартная библиотека языка java содержит в пакете java.utü.concurrent классы для работы с различными типами пулов потоков.
Существует понятие чистой функции. Они применимо к функциям, являющимся детерминированными, а также не обладающим побочными эффектами. Для того, чтобы функция считалась детерминированной, необходимо, чтобы она всегда для одинакового набора передаваемых в нее аргументов возвращала один и тот же результат.
К побочным эффектам функции относят выполнение операций ввода-вывода, модификацию глобальных данных и передаваемых в функцию аргументов, а также ряд других действий. Таким образом, функция без побочных эффектов может рассматриваться как «замкнутая система», не имеющая связи с внешней средой, не изменяющая глобальное состояние программы и системы в целом.
Многие перечисленные выше проблемы относятся к функциям с побочными эффектами. Как известно, существуют парадигмы императивного и декларативного программирования. В первом случае программа рассматривается как вычислительный процесс, представленный в виде последовательности инструкций, которые изменяют состояние программы. Во втором случае программа
задает описание того, что необходимо получить, а не то, каким образом это происходит. Как видно из описания, функциям на императивных языках (в них функции рассматриваются как подпрограммы, то есть набор инструкций) свойственны побочные эффекты. Императивными являются большинство популярных сегодня языков программирования: java, c, c++ и другие.
С другой стороны, функции в рамках функционального подхода, являющегося одной из разновидностей декларативного подхода, являются по определению чистыми. Здесь функции рассматриваются с математической точки зрения. Следовательно, из-за отсутствия побочных эффектов всегда имеется возможность параллельно вычислять различные параметры, поскольку порядок вычисления в данном случае не оказывает никакого влияния на результат выполнения потоков [4].
Таким образом, с точки зрения побочных эффектов легче распараллеливаются программы, разрабатываемые на функциональных языках программирования. Наиболее популярными на данном этапе такими языками являются erlang, haskell (компилятор ghc выполняет автоматическое распараллеливание в системах с многоядерными процесо-рами), lisp, clojure, f# и ряд других. Также следует отметить, что в настоящее время наблюдается процесс внедрения в императивные языки элементов функционального стиля программирования. В качестве примера использования функционального языка в высоконагруженном распределенном приложении можно привести приложение whatsapp, серверы сообщений которого написаны на erlang и обслуживают миллионы пользователей.
Функциональные языки всё еще уступают в популярности императивным, однако постепенно увеличивают свое распространение. В таблице приведены некоторые данные из рейтинга популярности языков программирования йоЬе (на момент
написания статьи) [2]. Рейтинг рассчитывается, исходя из количества поисковых запросов, содержащих названия языков программирования, и количества возвращаемых результатов.
Таблица
Рейтинг tiobe
Позиция Язык программирования Рейтинг (доля)
32. Lisp 0,673%
38. Haskell 0,434%
40. Erlang 0,409%
Несмотря на достаточно серьезное развитие технологий программирования, в настоящее время полностью автоматическое распараллеливание программ затруднено. В этой области ведутся исследования, предлагаются различные подходы к его упрощению. Например, один из подходов подразумевает добавление разработчиками специальных «подсказок» в программы, чтобы помочь компиляторам распараллелить куски кода (hpf для систем с распределенной памятью и openmp или openhmpp для систем с разделяемой памятью). Другой подход — использование спекулятивной мно-гопоточности. Однако здесь необходима специальная поддержка со стороны аппаратной части.
Список литературы
1. Big changes for big virtual machines in vmware vsphere 5 / [электронный ресурс]. — режим до-
ступа: https://www.brentozar.com/ar-
chive/2013/01/big-changes-for-big-virtual-machines-in-vmware-vsphere-5/ (дата обращения: 15.03.2016).
2. Tiobe index / [электронный ресурс]. — режим доступа: http://www.tiobe.com/tiobe_index (дата обращения: 18.03.2016).
3. Простой пул потоков / [электронный ресурс]. — режим доступа: http://www.osp.ru/pcworld/2008/! 1/5685083/ (дата обращения: 16.03.2016).
4. Функциональное программирование / [электронный ресурс]. — режим доступа: https://ru.wikipedia.org/wiki/функциональное_про-граммирование (дата обращения: 13.03.2016).
5. Штейнберг б.я. Автоматизация разработки программ для параллельных вычислительных систем с распределенной памятью / [электронный ресурс]. — режим доступа: http://test.inf.sfedu.ru/files/parallel_shteinberg.pdf (дата обращения: 12.03.2016).
Дерябин П.П.
ФГБОУ ВО «Сибирский государственный автомобильно-дорожный университет» (СибАДИ)
доцент, кандидат технических наук
СВОЙСТВА ЯЧЕИСТОГО БЕТОНА, ПОЛУЧЕННОГО ИНТЕГРИРОВАННОЙ СИСТЕМОЙ СОЗДАНИЯ ПОРИСТОЙ СТРУКТУРЫ КОМПОЗИТА
PROPERTIES OF CELLULAR CONCRETE OBTAINED INTEGRATED CREATION SYSTEM THE
POROUS STRUCTURE OF THE COMPOSITE
Deryabin P.P.
Siberian state automobile and highway University associate Professor, candidate of technical Sciences
АННОТАЦИЯ
Приводятся свойства ячеистого бетона, полученного интегрированным способом создания высокопористой структуры, а также характеристика пористой структуры и распределение пор в композите по сравнению с химическим способом порообразования.
ABSTRACT
Properties of cellular concrete obtained by the integrated method of creating highly porous structures, and characteristics of the porous structure and pore distribution in the composite in comparison with the chemical method of pore formation.
Ключевые слова: ячеистый бетон, пенобетон, газобетон, пористая структура, поры, пеногазобетон, газообразователь, пена.
Keywords: cellular concrete, foam concrete, aerated concrete, porous structure, pores, parogazovyh concrete, the blowing agent, foam.
Изделия из ячеистых бетонов, получаемые с использованием традиционных технологий, обла-
дают рядом недостатков. Многими исследователями установлено, что при равноценных исходных составах смеси определяющими технологическими