Результаты экспериментов




Транслятор

Транслятор с языка программирования Аспект имеет классическую архитектуру и состоит из лексического анализа, синтаксического анализа контекстного анализа, генератора внутреннего представления и генератора кода. Реализация первых четырех модулей стандартна и далее не рассматривается.

На вход транслятору подается один или несколько файлов, в каждом из которых может быть одна или несколько А -программ, а также специальный конфигурационный файл, в котором для каждого массового А -блока указан требуемый размер А -фрагмента по каждой размерности. На выходе транслятор генерирует фрагментированную программу на языке C++, состоящую из одного главного файла (main.cpp) и нескольких заголовочных файлов – по одному на каждую найденную А -программу.

Каждая А -программа представляется в виде класса, наследуемого от виртуального класса AProgram. А -программы могут быть вложенными (операция А -блока может реализовываться другой А -программой), и наличие единого предка позволяет унифицировать управление деревом А -программ.

Локальные информационные переменные представляются закрытыми (private) переменными класса, а входные/выходные информационные переменные – закрытыми ссылками. Все управляющие переменные также являются закрытыми. Для доступа к информационным переменным автоматически генерируются inline-функции доступа, которые помимо возврата данных могут производить проверку корректности обращения (например, проверку на выход за границы индекса).

Для каждой триггер-функции генерируется открытая (public) функция типа bool, а для каждой операции и управляющего оператора – соответствующие открытые процедуры.

Исполнительная подсистема

Исполнительная подсистема состоит из трех слоев: слоя абстрагирования от ОС, слоя функциональных модулей и слоя А -фрагментов.

Слой абстрагирования от ОС включается в себя все подпрограммы, в которых используются API операционной системы (создание/уничтожение/синхронизация потоков, функции определения доступных ресурсов, функции для работы со временем и т.д.). Это позволяет переносить исполнительную подсистему из одной ОС в другую заменой лишь одного, выделенного слоя.

Менеджер процессоров управляет распределением работы между процессорами (ядрами). При старте программы создается по одному потоку на каждый процессор (ядро). Каждый поток обращается за очередной порцией работы в общую очередь, которая реализована в виде монитора Хоара. Программа завершается, когда очередь становится пустой.

Менеджер памяти управляет распределением памяти в системе. С точки зрения фрагментированной модели вычислений его основной задаче является представление всех данных во фрагментированном виде, т.е. если массовый А -блок разбивается на n А -фрагментов по k экземпляров в каждом, то данные, обрабатываемые этим А -блоком, также хранятся во фрагментированном виде (n фрагментов по k элементов в каждом). Это позволяется при необходимости легко переносить один или несколько А -фрагментов с одного узла на другой (например, для динамической балансировки загрузки).

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

Результаты экспериментов

К настоящему моменту разработка системы программирования Аспект завершена не полностью и эксперименты по решению практических задач не проводились. Поэтому рассмотрим результаты тестирования ядра самой системы Аспект на примере модельной задачи непроцедурного умножения матриц (текст программы на языке Аспект приведен в разделе 3.2).

Для тестирования использовалась следующая конфигурация: Athlon 64 X2 3600+ (2*256 L2), 1024 DDR2 RAM, Windows Vista Ultimate. Результаты тестирования для матриц размером 400 на 400 элементов приведены на рис. 4 (отметка Б/А показывает скорость аналогичной программы, разработанной вручную).

Из диаграммы видно, что ускорение достигает значения 1.93 (при размере А -фрагмента 50 экземпляров). Это объясняется тем, что хотя каждое ядро имеет отдельный кэш второго уровня, доступ к оперативной памяти производится через общий контроллер. Таким образом, эффективное использование кэш-памяти для многоядерных процессоров имеет первостепенное значение.

Скачок при размере А -фрагментов в 400 экземпляров происходит потому, что его размер совпадает с исходным размером матриц, т.е. вся матрица представляет собой один А -фрагмент. В этой ситуации для второго ядра просто нет работы.

Следует обратить внимание, что ось А -фрагментов не линейна. Например, при размере
А -фрагментов в 100 экземпляров всего получается 80 А -фрагментов (4*4*4 + 4*4), а при размере в 50 экземпляров – уже 576 А -фрагментов. Таким образом, при существенном увеличении числа фрагментов скорость счета не возрастает (она даже несколько снижается под влиянием кэш-памяти), что свидетельствует об эффективности работы ядра системы.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-10-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: