Талтыкина (1235576), страница 6
Текст из файла (страница 6)
Это программа сравнивает численное решение с известным аналитическим решениемзадачи и выводит погрешность. Если аналитическое решение неизвестно, точисленное решение задачи сравнивается с решением задачи на самой густойсетке.Кроме того существует программа расчёта погрешности плотности интегрального уравнения. При неизвестной плотности она также сравнивает её сплотностью на самой густой сетке.3.2Параллельная версияАлгоритм численного решения краевых задач и задачи дифракции реализован в виде программных комплексов для многопроцессорных вычислительных систем. Распараллеливанию подвергались наиболее трудоёмкие модули– мозаично-скелетонный метод и матрично-векторное умножение в GMRES.В [18] даны рекомендации по реализации версии метода для платформ с распределённой памятью.
В данной работе параллельная версия создана для систем с общей памятью при помощи технологии OpenMP 3.0. Выбор систем сразделяемой памятью обусловлен необходимостью общего доступа потоков кбольшому объёму данных. Такими данными является набор блоков, где каждый блок является структурой, содержащей несколько массивов. Передачатакого объёма данных между потоками при распределённой памяти занялабы слишком много времени. Преимуществом технологии OpenMP являетсяи простота в использовании.
Для распараллеливания программы достаточнодобавить клаузы OpenMP, и код будет исполняться в параллельном режиме. Количество потоков задаётся либо в самой программе, либо с помощьювнешней функции. При задании одного потока программа исполняется в последовательном режиме.Последовательные части программы исполняет мастер-поток, и привстречи параллельных секций он «пробуждает» дополнительные потоки, которые выполняют указанную секцию. В современной реализации OpenMP37«пробуждение» потоков происходит максимально быстро.Первые два этапа мозаично-скелетонного метода, построение дерева кластеров и списка блоков, выполняются последовательно. Два этих модуля исполняются быстро по сравнению со временем работы остальной программы.Параллельная секция начинается на третьем этапе при аппроксимации блоков матрицы.
Для создания такой секции используется OpenMP процедура$OMP PARALLEL. При этом каждый поток получает некоторое количествоблоков и обрабатывает их. В зависимости от того к какой зоне принадлежитблок, поток либо ищет малоранговое приближение, либо рассчитывает блокполностью. Разделение блоков по потокам организовано динамически, то естьв начальный момент времени потоки получают по одному блоку. Когда поток закончил работу с текущим блоком, он забирает из стека следующийблок. Проведённые эксперименты показали, что в таком случае потоки обрабатывают приблизительно одинаковое количество блоков и заканчиваютсвою работу почти одновременно.В OpenMP переменные в параллельных областях программы разделяютсяна два основных класса: private и shared.
При использовании для переменнойкласса private каждый поток имеет копию этой переменной в свой памяти. Если используется класс firstprivate, переменная инициализируются значениеморигинальной переменной; в случае назначения класса lastprivate последнийпоток по окончанию параллельной секции обновляет значение оригинальнойпеременной. Переменные типа shared доступны всем потокам, при работе сними могут понадобиться критические секции или атомарные операции.
Этиинструменты нужны, чтобы предотвратить одновременную запись в общиепеременные.В данном случае общими переменными являются список блоковvector_block, точки сетки xt, значения интегралов dinteg и значения направляющих косинусов cosnor. К классу fisrtprivate относятся текущий блок tmp,строки u и столбцы v матрицы или подматрица matr, вспомогательные массивы tmp_vector и u_1 и вспомогательные переменные eps1, s2 и com. Длясуммирования мозаичного ранга используется класс переменных reduction.При этом у каждого потока хранится локальная переменная mosaic_rank, ипо окончанию параллельной секции оригинальная переменная приравнивает38ся к сумме локальных переменных. При записи обработанного блока используется критическая секция.Матрично-векторное умножение в GMRES также сделано в параллельном режиме.
При этом каждый поток получает свой набор блоков, которыеон умножает на вектор. Как уже говорилось ранее, если блок относится к«ближней» зоне поток использует функции библиотеке Intel MKL, иначе используется функция block_vector. Блоки также распределяются по потокамдинамически. Для задач дифракции для перемножения четырёх матриц навектор существует четыре параллельные секции. Это сделано для того, чтобыне происходила одновременная запись в общие переменные.Тестирование параллельных версий проходило на кластере ВЦ ДВО РАН,правильность работы параллельного варианта определялась сравнением погрешностей решения задач с последовательным вариантом программы.3.3Компиляция программного обеспеченияДля компиляции программ используется скрипт Makefile, которые запускается подпрограммой make.
Итогом работы программы make является исполняемый файл density. В скрипте Makefile описаны опции компилятора,подключаемые модули и библиотеки. Рассмотрим скрипт запуска программы численного решения задачи дифракцииподробнее.FC_VERSION := 1 1 . 1PROJECT_DIR := /home/ t a l t y k i n a / h e l m h o l t zTOOLS_DIR := /home/ t a l t y k i n aFC_DIR := / opt / i n t e l / Compiler /${FC_VERSION}/072/MKL_DIR := / opt / i n t e l /mkl / 1 0 . 0 .
3 . 0 2 0 /FC := ${FC_DIR}/ b in / i n t e l 6 4 / i f o r tRM := rm − r fMOD_INCLUDE := −module ${PROJECT_DIR}/ modulesPROJ_INCLUDE := −I $ {PROJECT_DIR}/ s r c / i n c l u d eMKL_INCLUDE:= −I $ {MKL_DIR}/ i n c l u d eMKLPATH := −L${MKL_DIR}/ l i b / em64tMKL_LIB := ${MKLPATH}/ l i b m k l _ s o l v e r _ i l p 6 4 _ s e q u e n t i a l . a${MKLPATH}/ l i b m k l _ i n t e l _ i l p 6 4 . a39${MKLPATH}/ l i b m k l _ s e q u e n t i a l . a ${MKLPATH}/ l i b m k l _ c o r e . a${MKLPATH}/ l i b m k l _ b l a c s _ i n t e l m p i _ i l p 6 4 .
a −Wl,−−end−groupFFLAGS += −openmpFFLAGS += −O2FFLAGS += −r e a l −s i z e 64FFLAGS += −t r a c e b a c kFFLAGS += −check boundsPROJECT = d e n s i t yOBJS += . / g l o b a l s . oOBJS += . / c o n s t a n t s . oOBJS += . / u t i l s . oOBJS += . / i o . oOBJS += . / e r r o r . oOBJS += . / e l l . oOBJS += . / p o i n t . oOBJS += . / nvecc . oOBJS += . / f h l o c . oOBJS += . / f i n f i . oOBJS += . / v e c t o r . oOBJS += . / data . oOBJS += . / c r o s s . oOBJS += .
/ gmres . oOBJS += . / i n t e g . oOBJS += . / k e r n e l . oOBJS += . / r i g h t . oOBJS += . / d e v i s i o n . oOBJS += . / cube_tree . oOBJS += . / b l o c k . oOBJS += . / main . oa l l : ${PROJECT}${PROJECT} : ${OBJS}@echo ’ B u i l d i n g t a r g e t : $@ ’${FC} ${FFLAGS} −o "${PROJECT }" $ (OBJS) ${MKL_LIB}#${FC} ${FFLAGS} −o "${PROJECT}" $ (OBJS) ${MKL_LIB}@echo ’ F i n i s h e d b u i l d i n g t a r g e t : $@ ’40@echo ’ ’%.o : %. f 9 0@echo ’ B u i l d i n g f i l e : $<’${FC} ${FFLAGS} ${MKL_INCLUDE} ${PROJ_INCLUDE}−c −o "$@" "$<"@echo ’ F i n i s h e d b u i l d i n g : $ <’@echo ’ ’clean :−$ (RM) $ (OBJS) ${PROJECT} * .
mod−@echo ’ ’.PHONY: a l l c l e a n dependents.SECONDARY:Переменные с суффиксом DIR определяют директории, в которых находятся подключаемые библиотеки и сам компилятор. Файлы библиотек располагаются в переменных с суффиксом INCLUDE. Переменные FFLAGS содержат флаги компилятора.Данная программа использует следующие флаги: -openmp подключаетстандарт OpenMP; -O2 указывает, что компилятор оптимизирует программу;-real-size 64 определяет, что вещественные и комплексные переменные будутдлиной в 16 байт; -traceback выводит подробную информацию об ошибках;-check bounds проводит динамическую проверку выхода индекса за границымассива.Переменная с именем PROJECT определяет название исполняемого файла.
Подключаемые модули задаются переменными OBJS. Модуль globals.f90содержит объявление переменных, общих для всех модулей. Также там задаются такие параметры задач, как форма и размер включения, тип источника, параметры среды и включения. В модуле constants.f90 сохранены частоиспользуемые константы, например,14 .В модуль utils.f90 входят подпро-граммы перевода чисел в строковые величины и обратно. Процедуры длязаписи и чтения из файла таких данных как плотности, решения, точки сетки, интегралы, косинусы описаны в модуле io.f90.
Программы расчета погрешностей в соответствующих пространствах приведены в модуле errors.f90.41Модули point.f90 и ell.f90 раскидывают точки по поверхности включения. Направляющие косинусы рассчитываются в подпрограмме nvecc.f90. Программа fhloc.f90 необходима для введения локальной параметризации поверхностивключения. Модуль finfi.f90 содержит программу для вычисления функций,образующих разбиение единицы на поверхности включения, и их производных.