Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БЖД / Дипломный проект Калинин Е.А. 10.05.11 (финал).doc
Скачиваний:
78
Добавлен:
19.03.2015
Размер:
2.33 Mб
Скачать

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

Библиотека в программировании(отангл.library) — сборник подпрограммилиобъектов, используемых для разработкипрограммного обеспечения(ПО).

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

Динамические библиотеки. Часть основной программы, которая загружается в ОС по запросу работающей программы в ходе её выполнения (Run-time), т.е. динамически (Dynamic Link Library,DLLв Windows). Один и тот же набор функций (подпрограмм) может быть использован сразу в нескольких работающих программах, из-за чего они имеют ещё одно название —библиотеки общего пользования (Shared Library). Если динамическая библиотека загружена в адресное пространство самой ОС (System Library), то единственная копия может быть использована множеством работающих с нею программ, что положительно сказывается на степени использовании ресурса ОЗУ. Динамические библиотеки могут содержать в себе как критические для работы программы части, так и дополнительные функции. Дополнительным плюсом такого подхода является то, что динамическая библиотека может быть использована в качествеплагина(Plug-ins), расширяющего функциональность программы. Минусом является то, что в случае, если модуль, который содержит в себе критическую часть, отсутствует, программа не сможет продолжить работу.

Динамические библиотеки хранятся обычно в определенном месте и имеют стандартное расширение. Например, файлы .library в логическом томеLibs: в AmigaOS; вMicrosoft WindowsиOS/2файлы библиотек общего пользования имеют расширение.dll; вUNIX‐подобных ОС — обычно .so; вMac OS—.dylib.

При написании программы программисту достаточно указать транслятору(компиляторуилиинтерпретатору) языка программирования, что следует подключить нужную библиотеку и использоватьфункциюиз неё. Ни исходный текст, ни исполняемый код функции в состав программы на данном этапе не входит.

Статические библиотеки. Могут быть в виде исходного текста, подключаемого программистом к своей программе на этапе написания (например, для языка Fortranсуществует огромное количество библиотек для решения разных задач именно в исходных текстах), либо в виде объектных файлов, присоединяемых (линкуемых) к исполняемой программе на этапе компиляции (в Microsoft Windows такие файлы имеют расширение.lib, в UNIX‐подобных ОС — обычно .a). В результате программа включает в себя все необходимые функции, что делает её автономной, но увеличивает размер. Без статических библиотек объектных модулей (файлов) невозможно использование большинства современных компилирующих языков и систем программирования: Fortran,Pascal,C,C++и других.

1.3.7 Библиотеки программирования вMpi,cudAиshmem.

Модель передачи сообщений MPI, рассмотрим немного позже и т.к. я использую OS Linux для разработки тестового программного обеспечения под языком shmem, подробно библиотеки MPI рассматривать не будем.

Хотелось бы отметить появившуюся в 2007 году архитектуру CUDA. (В 2011 году актуальной версией CUDA приходится версия 2.1)

Это программно-аппаратная архитектура, позволяющая производить вычисления с использованием графических процессоровNVIDIA, поддерживающих технологиюGPGPU(произвольных вычислений на видеокартах). Архитектура CUDA впервые появились на рынке с выходомчипа NVIDIA восьмого поколения— G80 и присутствует во всех последующих сериях графических чипов, которые используются в семействах ускорителейGeForce,QuadroиTesla.

CUDA SDK позволяет программистам реализовывать на специальном упрощённом диалекте языка программирования Сиалгоритмы, выполнимые на графических процессорах NVIDIA, и включать специальные функции в текст программы на Cи. CUDA даёт разработчику возможность по своему усмотрению организовывать доступ к набору инструкций графического ускорителя и управлять его памятью, организовывать на нём сложныепараллельные вычисления.

Первоначальная версия CUDA SDKбыла представлена15 февраля2007 года. В основе CUDA API лежит язык Си с некоторыми ограничениями. Для успешной трансляции кода на этом языке, в состав CUDA SDK входит собственный Си-компилятор командной строкиnvcc компании Nvidia. Компилятор nvcc создан на основе открытого компилятора Open64и предназначен для трансляции host-кода (главного, управляющего кода) и device-кода (аппаратного кода) (файлов с расширением .cu) в объектные файлы, пригодные в процессе сборки конечной программы или библиотеки в любой среде программирования, например вNetBeans.

Использует grid-модель памяти, кластерное моделирование потоков и SIMDинструкции. Применим в основном для высокопроизводительных графических вычислений и разработок NVIDIA-совместимого графического API. Включена возможность подключения к приложениям, использующимOpenGLиMicrosoft Direct3D 9. Создан в версиях дляLinux, Mac OS X, Windows. Но коммуникационная среда, рассматриваемая в дипломном проекте не основана на использовании вычислений при помощи графических процессоров NVIDIA, по этому перейдем конкретно к подробному обзору языка shmem.

Программа, использующая shmem, может быть написана на Фортране или С, мы будем приводить примеры на С.

Программа на С, использующая shmem, должна включать файл заголовков shmem.h.

До обращения к любым другим функциям shmem следует вызвать функцию инициализации: shmem_init(). Аргументов у нее нет, возвращаемого значения – тоже. Для того, чтобы узнать собственный номер и общее число процессов, следует вызвать функции my_pe() и num_pes(), соответственно. Обе они не имеют аргументов и возвращают целочисленное значение.

Основой библиотеки являются функции односторонних обменов. Односторонняя запись в чужую память называется “put”, одностороннее чтение из чужой памяти – “get”.

Ориентация библиотеки на вычислители с одинаковым машинным представлением однотипных данных во всех узлах позволяет, в принципе, не учитывать в интерфейсе функций «put» и «get» типы передаваемых данных, ограничившись указанием длины передаваемой порции данных в байтах. Тем не менее, каждая из этих функций имеет в shmem несколько десятков частично перекрывающихся модификаций, причем имена этих вариантов функций строятся регулярным образом в зависимости от следующих свойств запроса:

- тип передаваемых данных,

- одно значение этого типа передается или массив,

- сплошной массив или расположенный в памяти с шагом (например, столбец двумерного массива в С или строка в Фортране).

Например, для передачи единственного значения типа «double» следует обратиться к функции:

shmem_double_p( addr, value, pe ),

а для передачи сплошного массива типа float – к функции:

shmem_float_put( addr, src, len, pe ).

Здесь value и src – передаваемое значение типа double и передаваемый массив типа float, соответственно, len – длина массива в компонентах, pe – номер процесса, в память которого осуществляется передача. Значение addr в обоих случаях – адрес в памяти процесса номер pe (указатель), по которому следует разместить передаваемое значение.

В отношении этого аргумента возникает совершенно естественный вопрос, непосредственно связанный с упоминавшейся выше проблемой глобальной адресации. В самом деле, откуда процесс – отправитель данных может получить осмысленное значение указателя в память совершенно другого процесса? Здесь нам на помощь приходит гомогенность вычислительной установки. Если все узлы одинаковы, и все исполняемые файлы одинаковы, то, по крайней мере, адреса всех переменных и массивов, объявленных статически, также одинаковы во всех процессорах (и процессах). Следовательно, указав собственный, локальный адрес переменной или массива, инициатор обмена, тем самым, указывает адрес одноименного объекта в процессе – получателе данных. На словах это можно сформулировать так: «Мою переменную А положить в переменную Б процесса В».

Ясно, что таким образом категорически нельзя обращаться к данным, размещаемым в стеке (то есть объявленным внутри функции без квалификатора «static»). Одностороннего доступа к таким данным shmem не поддерживает. Что же касается данных, размещаемых при помощи обращения к функции malloc() или ее производным, то их адресация указанным способом возможна, если написать специальный вариант функции malloc(), который будет выполняться как коллективная операция и специально обеспечивать равенство выделяемых адресов во всех процессах. В реализации shmem для Quadrics, например, такой функцией можно воспользоваться, но она не является частью shmem (предоставляется отдельно). Можно использовать и стандартный вариант malloc(), если организовать рассылку между участвующими в обмене процессами значений соответствующих адресов.

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

Основная операция синхронизации – барьер (барьерная синхронизация уже встречалась нам при рассмотрении MPI). В shmem нет понятия, аналогичного понятию коммуникатора в MPI, но есть возможность выполнить барьерную синхронизацию не всех, а лишь указанных процессов.

Соседние файлы в папке БЖД