А.И.Илюшин, М.А.Оленин, С.А.Васильев - Решение проблемы параллельных вычислений на основе понятий «пространство-время» (1185570), страница 5
Текст из файла (страница 5)
A conversation with John Hennessy and David Patterson. Queue 4, 10 (Dec.2005/Jan. 2006), 14–22.[2] Krste Asanovic, Rastislav Bodik, James Demmel, Tony Keaveny, Kurt Keutzer, JohnKubiatowicz, Nelson Morgan, David Patterson, Koushik Sen, John Wawrzynek, David Wessel,Katherine Yelick, A view of the parallel computing landscape, Communications of the ACMVolume 52, Number 10 (2009), Pages 56-67[3] Илюшин А.И., Колмаков А.А., Меньшов И.С., Построение параллельнойвычислительной модели путем композиции вычислительных объектов,[4] Causality Representation and Cancellation Mechanism in Time Warp SimulationsMalolan Chetlur and Philip A.
WilseyExperimental Computing LaboratoryDept. of ECECS, PO Box 210030, Cincinnati, OH 45221-0030[5] http://math.csu.ru/~rusear/DipKurs/ParMetUmnMatr.html[6] I. Menshov, Y. Nakamura, Hybrid Explicit-Implicit, Unconditionally Stable Scheme forUnsteady Compressible Flows, AIAA Journal, Vol. 42, No. 3, pp. 551-559, 2004.[7] ost.kiam.ruПриложение 1. Результаты счета двух примеров.Расчеты производились на МВС rsc4.kiam.ru, состоящей из 64 узлов, на каждом из которыхимеется по 2 процессора.Пример 1. Умножение матриц.В примере умножения матриц перемножались матрицы одинакового размера 1024х1024,заполненные случайными числами с плавающей точкой. Матрицы делились на различноечисло частей, в соответствие с алгоритмом ленточного деления матриц [5].
Результатырасчетов представлены в таблице:Кол-во процессоров1248163264время1377,28 c689,39 c344,81 c172,62 c87,48 c50,72 с31,86 сПример 2. Расчет обтекания конуса.Эффективность100 %99 %99 %99 %98 %84 %68 %18В примере использования комплекса программ M2DGD проводилось сравнение 2-хразличных параллельных реализаций: с автоматизацией построения связей и синхронизацией(OST), и с ручным построением связей и синхронизацией (MPI).Приложение 2. Пример последовательности действий посозданию параллельной программной системы.Рассмотрим последовательность шагов, которую должен выполнить прикладнойпрограммист для создания прикладной системы, предназначенной для запуска в среде OST.Шаг 1.
В первую очередь прикладным программистом выбирается классы топологии,которые будут использоваться в системе для задания связей между параллельноэволюционирующими частями. Выбор производится либо из реализованных в системе OSTклассов наиболее часто используемых топологий, либо описывается новый пользовательскийкласс топологии.Приведем пример класса топологии в случае определения топологии с помощью функцииописания окрестности.# Класс с заданной функцией описания окрестности для топологии кольцаclass applied_ring_topology(ost.Topology.Abstract):# Конструктор класса19def __init__(self, N):self.N = N# Функция описания окрестности точки в пространствеdef neighborhood(self, p):# self - аналог this в c++# p - набор(массив) координат, рассматриваемой точки# В переменную p_left поместим набор координат соседа слеваif p[0] != 0: # Если p[0] не равен 0, то сосед на 1 меньшеp_left = [p[0] - 1]else: # иначе замыкание через кольцоp_left = [N - 1]# В переменную p_right поместим набор координат соседа слеваif p[0] != N - 1: # Если p[0] не равен N - 1, то сосед на 1 большеp_right = [p[0] + 1]else: # иначе замыкание через кольцоp_right = [0]# Возвратим описание окрестности# Синоним "left" соотвествует соседу слева# Синоним "right" соотвествует соседу справаreturn { "left": p_left,"right": p_right}Шаг 2.
Следующий шаг при создании прикладной программы – это описание классовприкладных объектов, которые будут использоваться при создании частей распределеннойприкладной системы. Стоит напомнить, что в описании такого класса используется понятиеокрестности, задаваемое конкретным классом топологии.# Общая структура класса прикладного объектаclass applied_object(ost.Object.Abstract):# Класс прикладного объекта# Класс содержит в себе функции, составляющие интерфейс объектаdef fun_1(self, ...):# Содержимое функции# ...def fun_N(self, ...):# Содержимое функции# Функция, задающая интерфейс описываемого объекта с его окружением# в виде списка формальных соседей.# При вызове создает синонимы и интерфейсы для каждого соседаdef init_topology(self):# Задаем интерфейс и синоним для формального 1-го соседаself.init_neighbor(i1, Class_interface_i1, "synonym_i1")# Задаем интерфейс и синоним для формального 2-го соседа20self.init_neighbor(i2, Class_interface_i2, "synonym_i2")...# Задаем интерфейс и синоним для формального К-го соседаself.init_neighbor(iK, Class_interface_iK, "synonym_iK")# А так же функцию, которая запускает вычисления# Функция проводящая вычисленияdef run(self):# self - аналог this в c++# Обычно в run используется цикл по итерациям алгоритмаfor iteration in xrange(0, M):# Для обращения к соседям можно использовать список(массив)# self.topology.neighbors# Обращение к i-ому соседу по fun_j-ой функцииself.topology.neighbors[i].link.fun_j()# При наличии синонимов использование проще# Обращение к соседу слева по fun_j-ой функцииself.left.fun_j()# Для синхронизации используются продвижения по времени# В переменной self.time хранится текущее время объекта# Для продвижение на шаг time_step делается запрос к монитору OST# возврат из которого произойдет только после продвиженияself.setXYZT(self.time + time_step)# Объекты могут менять свое положение в пространстве# Получение актуального массива координат текущего объектаcoord = self.topology.get_coordinates()# Монитор OST изменяет координаты# только вместе с продвижением по времениself.setXYZT(self.time + time_step, coord)# После окончания вычислений завершаем вычисленияself.setFinish()Шаг 3.
Последний шаг при создании прикладной системы – это создание программыинициализации. В данной программе создается файл объектов, в который прикладнойпрограммист помещает все необходимое для функционирования модели в параллельнойсреде. В программе поочередно создаются прикладные объекты на основе классов,описанных в шаге 2, которые связываются в единую модель с помощью классов топологийиз шага 1. Помимо множества прикладных объектов, в файл объектов при необходимостипомещаются файлы с исходными кодами, библиотеками и начальными данными.21#Пример программы инициализации# Начинаем инициализацию модели# Создаем объект инициализации.# Сохранять будем в файл modelname.modobj_init = ost.Core.Init("modelname.mod")# Зададим класс глобальной топологии# В данном случае кольцо с 10 элементамиobj_init.topology = applied_ring_topology (N = 10)# Дальше проводится цикл, в котором создаются объекты модели# В данном примере создаются 10 объектов, для кольцаfor index in xrange(0,10):# Создание объекта типа applied_objectapp_object = obj_init.create_object( applied_object )# Далее объект заполняется необходимыми данными# При необходимости можно задать локальную топологию окрестности объекта# В данном примере мы описываем окрестность, состоящую из элементов P1,…,Pkapp_object.topology = ost.topology.Neighborhood([P1,…,Pk])# Помещаем объект в точку пространства объектов# Точка имеет координату indexobj_init.topology.set(app_object, index)# Добавление файла с программным кодом объекта# С помощью аналогичных конструкций можно добавить и другие данныеobj_init.addSorceFile("applied_objects.py")# Сохранение модели в файлеobj_init.save()Итого.
После запуска программы инициализации создается файл объектов, который можетбыть помещен в среду OST для параллельного выполнения на МВС..