ОПТИМИЗАЦИЯ ПРОГРАММЫ МОДЕЛИРОВАНИЯ РАСПРОСТРАНЕНИЯ ВОЛНЫ ЦУНАМИ А.Ф. Зайков Новосибирский государственный университет

advertisement
ОПТИМИЗАЦИЯ ПРОГРАММЫ МОДЕЛИРОВАНИЯ РАСПРОСТРАНЕНИЯ ВОЛНЫ
ЦУНАМИ
А.Ф. Зайков
Новосибирский государственный университет
E-mail: zaykov.alexander@gmail.com
Введение
С давних пор жители прибрежных территорий оказывались подвержены атакам гигантских волн – цунами.
Волны, внезапно поднимающиеся у побережья на высоту порой более 30 метров, могут наносить непоправимый
ущерб строениям, коммуникациям и, что самое главное, жизни и здоровью многих людей. Так, цунами
24 декабря 2004 года, порожденное землетрясением возле берегов острова Суматра, унесло жизни более
230 тысяч человек по всему побережью Индийского океана. За всю историю человечества цунами унесли
больше человеческих жизней, чем любое другое стихийное бедствие.
Наиболее часто цунами возникают вследствие различных природных тектонических явлений, происходящих
в океане. Цунами могут быть вызваны сильными землетрясениями и связанными с ними оползнями,
извержениями вулканов, или прочими явлениями. При этом в эпицентре возникновения цунами волна
поднимается на высоту всего несколько метров, поэтому в открытом океане волна почти незаметна, и не
представляет опасности для кораблей. Однако скорость распространения волны может достигать 700
километров в час, и через несколько часов после возникновения волна может проявить себя на другом конце
океана. При приближении к берегу скорость распространения волны уменьшается, и вследствие этого волна
может подняться над поверхностью воды на несколько десятков метров, накатывая на побережье с огромной
разрушительной силой.
Разрушительная сила цунами настолько велика, что способов предотвращения или защиты от огромных
волн просто не существует. В Японии, более всех государств подверженной риску со стороны океана,
воздвигались различные защитные сооружения вроде мощных бетонных стен, однако подобные конструкции
способны лишь уменьшить ущерб от небольших волн, против крупных цунами они бессильны. Единственным
способом минимизировать ущерб от цунами является своевременное оповещение населения о предстоящей
опасности и оперативные эвакуационные мероприятия. Подобная мера может значительно сократить число
пострадавших, а также уменьшить материальный ущерб, наносимый этим природным явлением.
Катастрофическое цунами 2004 года дало мощный толчок в развитии систем предупреждения цунами по
всему миру, потому что задача минимизации ущерба от цунами достаточно сложна и многогранна. С одной
стороны с момента возникновения цунами и до прихода волны к берегу может проходить несколько десятков
минут. За это время надо исследовать параметры землетрясения, установить регионы, которые могут попасть в
зону затопления, а также провести эвакуацию населения в безопасные районы. С другой стороны, далеко не
каждое землетрясение может породить цунами, угрожающее прибрежным территориям. Например, цунами,
зародившееся в феврале 2010 года возле берегов Чили, вызвало в Японии массовую эвакуацию населения в
связи с тем, что службы предупреждения цунами предсказали появление большой волны. Однако, когда волна
дошла до берегов Японии, высота воды поднялась не более чем на пол метра. В случае, если экстренные
службы будут поднимать тревогу после каждого землетрясения, затраты на эвакуацию населения, на остановку
производств будут превосходить все возможные убытки. Но большую опасность может вызвать тот факт, что
население, недовольное частыми и неоправданными эвакуациями, перестанет реагировать на подобные
предупреждения, что может привести к значительным человеческим жертвам в случае возникновения
действительно опасного цунами. Поэтому перед службами прогнозирования и предупреждения цунами ставится
задача получения оценки опасности, во-первых, наиболее точно, а во-вторых, за кратчайшее время.
Данная работа посвящена созданию программного средства для быстрого моделирования распространения
волн цунами на основе программы расчета цунами из пакета MOST [1], а также переносу этой программы на
многопроцессорные вычислительные системы над общей памятью с использованием механизма OpenMP.
Математическая модель
Математическая модель, заложенная в основу используемой программы, была разработана В. Титовым в
1988 году в Новосибирске [2]. В настоящее время программы, использующие эту модель, активно используются
во всем мире для анализа распространения волн цунами. Модель основывается на нелинейной системе
дифференциальных уравнений мелкой воды [3]:
Данная система преобразуется к каноническому виду, после чего применяется метод расщепления по
пространственным переменным, как показано в [2]. В результате расщепления получаем две одинаковых
независимых системы следующего вида:
Для численного решения этих систем использовалась явная разностная схема, которая имеет второй
порядок аппроксимации по пространственным переменным, и первый по времени.
Начальные условия представляют собой поле вертикальных смещений водной поверхности. На практике,
как правило, значение имеет лишь амплитуда волн, поэтому выходными параметрами алгоритма также являются
значения возвышения водной поверхности во всех узлах расчетной сетки в некоторые заданные моменты
времени.
Подготовка программы
Первоочередной задачей проектирования программного продукта стал выбор языка программирования, на
котором будет выполнен проект. Изначальные исходные коды программы из пакета MOST были написаны на
языке Fortran-77. Однако, несмотря на то, что язык Fortran является одним из самых удобных языков для
разработки программных продуктов, предназначенных для высокопроизводительных вычислений, было принято
решение перенести исходный код на язык C. Язык C также позволяет получать высокую производительность от
программных продуктов, однако не менее важным аргументом в пользу использования языка C стало то, что
одним из перспективных направлений развития данного проекта является перенос программы под
вычислительные платформы на базе NVidia CUDA и IBM Cell BE, а для этого язык C намного более удобен, чем
Fortran.
В процессе переноса основную проблему составляла задача тестирования правильности вычислений.
Наиболее простым способом тестирования отлаживаемой программы на C было сравнение выходных
результатов работы программ при запуске на входных данных, идентичных с входными данными для программы
на Fortran.
В результате данного этапа получены исходные коды программы на языке C, выдающие результаты
расчета, сопоставимые с результатами работы исходной программы на Fortran. Среднее отклонение полученных
значений от эталонных составляет менее 1%, что можно считать допустимым. В целом графики мареограмм для
программ на C и на Fortran заметно приближаются, имеют пики возрастания одинаковой высоты, и времена
появления волн отличаются незначительно.
В процессе переноса кода дополнительно производилось сравнение производительности программ. Для
компиляции программ использовался набор компиляторов GNU gcc + gfortran v4.3.3. В итоге время работы
изначальной версии программы на Fortran оказалось немного меньше по сравнению со временем работы
программы на C. Попытка использования компиляторной оптимизации привела к значительному уменьшению
времени работы программы, однако скорость работы программы на C стала меньше скорости работы программы
на Fortran совсем незначительно. Таким образом в данном случае компилятор языка C проигрывает по
производительности компилятору языка Fortran незначительно.
Ускорение программы: алгоритмические оптимизации
Как уже упоминалось, для вычислений применяется метод разделения переменных. Согласно этому методу
на каждой вычислительной итерации производится расчет распространения волны вдоль одной горизонтальной
оси, а затем вдоль другой. Перед каждым расчетом вдоль одной оси реальные значения параметров волны в
каждой точке моделируемого пространства переводятся к соответствующим римановым инвариантам, а после
расчета снова возвращаются к изначальному виду. При этом фактически используемыми значениями являются
четыре массива значений: глубина океана, толщина слоя воды и скорости вдоль двух координатных осей.
Некоторые преобразования реализации данного алгоритма позволили заметно повысить скорость работы
программы. В частности, для повышения локальности обращений к памяти после вычисления распространения
вдоль одной координатной оси было предложено транспонировать массивы скоростей, глубины, толщины слоя
воды. После выполнения вычислений вдоль второй координатной оси эти матрицы транспонируются снова. Эта
операция затрачивает дополнительную часть процессорного времени, но заметно повышает скорость
обращения к памяти. При этом итоговое сокращение времени, затрачиваемого на обращения к памяти, заметно
превышает затраты времени на проведение транспонирования, при условии что размеры данных заметно
больше, чем размер кэша процессора.
Еще одним немаловажным шагом по оптимизации алгоритма вычислений стал вынос вычислений
инвариантов за пределы вычислительного цикла. После выполнения данной оптимизации первое вычисление
инвариантов производится до начала расчета вычислительных итераций, а в самом теле основного цикла
используются только преобразования из инвариантов одного направления в инварианты другого направления.
Преобразования к исходному виду производятся только для массива толщины слоя воды перед выводом
результатов, а это требуется, как правило, не на каждом шаге.
В результате проведенных оптимизаций скорость вычислений увеличилась с 3,72 вычислительных итераций
в секунду для исходной программы на Fortran до 10,65 итераций в секунду для итоговой программы на C при
счете на сетке размером 512x512. При этом среднее отклонение результатов итоговых измерений составило
менее 5% от результатов начальной версии программы на Fortran, что в данной предметной области считается
вполне допустимым в силу специфики вычислительной задачи.
Ускорение программы: оптимизация под вычислительную архитектуру
Для получения высокой производительности зачастую оказывается полезно использовать специфику
платформы, на которой будет использоваться программа. В нашем случае программа будет преимущественно
использоваться на платформе процессоров Intel. Поэтому в процессе работы с программой было выполнено
несколько шагов по оптимизации вычислений под данную платформу.
Как было сказано выше, в процессе оптимизации алгоритма в вычислениях появились операции
транспонирования больших матриц. Естественно, функция транспонирования этих матриц занимала довольно
большую часть процессорного времени. Для того, чтобы сократить временные затраты на операцию
транспонирования, собственная функция транспонирования была заменена на аналогичную функцию из
библиотеки для высокопроизводительных вычислений Intel IPP.
Однако большую часть процессорного времени все-таки занимают основные вычисления, рассчитывающие
распространение волны. Эксперименты с подбором оптимальных опций компиляции не дали достаточно
хороших результатов по ускорению этого участка вычислений, поэтому было принято решение произвести
ручную векторизацию вычислений с использованием инструкций SSE.
В итоге использование ручной векторизации с использованием инструкций SSE показало очень хорошее
увеличение скорости вычислений, в два раза ускорив программу по сравнению с версией, над которой были
произведены все оптимизации, кроме векторизации. Итоговая производительность программы выросла почти в
четыре раза, сократив среднее время одной итерации с 3 секунд до 0,78 с при вычислении на сетке размеров
2579x2781.
Ускорение программы: адаптация под многопроцессорные архитектуры
Поскольку вычислительный алгоритм требует обмена довольно большого количества данных, схема
вычисления с использованием распределенной памяти оказалась очень неэффективной [4]. Поэтому была
применена модель программирования над системами с общей памятью с использованием OpenMP. Вычисления
производились на вычислительной системе над общей памятью SMP 4 x Intel Xeon X7350 2.93 GHz с 16
вычислительными ядрами, предоставленной Сибирским суперкомпьютерным центром СО РАН. При компиляции
использовался компилятор Intel icc v11.1. Помимо этого, измерения были проведены на сервере с процессором
Intel Core i7 950 с 4 вычислительными ядрами.
В результате распараллеливания производительность программы на процессоре Intel Xeon возросла с 1,28
итераций в секунду на одном ядре, до 5,84 итераций в секунду на 16 вычислительных ядрах, т.е. около 4,56 раз.
При использовании процессора Intel Core i7 производительность на 1 ядре составляла 4,17 итераций в секунду,
максимальная же производительность составила около 8,9 итераций в секунду на 4 ядрах.
Причина таких результатов, по-видимому, заключается в том, что рассматриваемая задача очень сильно
зависит от скорости обмена данными между процессором и памятью. Во-первых, данное объяснение хорошо
согласуется с тем, что скорость работы программы на одном ядре на процессоре Intel Xeon в 3,2 раза больше,
чем на одном ядре процессора Intel Core i7, несмотря на то, что частоты процессоров отличаются очень
незначительно. Действительно, архитектура Core i7 позволяет намного более быстрый обмен данных между
процессором и памятью из-за встроенного в процессор контроллера памяти, к тому же объем кэш-памяти уровня
L3 процессора Core i7 вдвое больше объема кэш-памяти данного процессора Intel Xeon, и составляет 8 Мб. Вовторых, вероятно, по этой причине происходит уменьшение производительности вычислений при использовании
более 8 вычислительных ядер на 16-ядерной системе, поскольку разрешение зависимостей по данным между
разными ядрами занимает больше времени.
Таким образом, одним из возможных путей к дальнейшему повышению производительности программы
может стать оптимизация обмена данных между процессором и памятью, что позволит эффективнее
использовать программу на многопроцессорных системах.
Точность вычислений
Основная версия программы моделировала результаты с одинарной точностью вычислений. Однако
получаемые результаты моделирования заметно отличались от ожидаемых. Было высказано предположение,
что данное отличие возникало вследствие нехватки точности используемого формата данных. Для проверки
предположения была создана альтернативная версия программы, использующая вычисления с двойной
точностью. Сравнение результатов, получаемых программами с одинарной и двойной точностью, показало, что с
течением времени в вычислениях с одинарной точностью накапливалось сильное расхождение результатов, по
сравнению с программой с двойной точностью.
Заметное различие происходило из того факта, что в вычислениях активно используется толщина слоя
воды, представляющая из себя сумму из реальной глубины океана в данной точке и высоты волны. Среднее
значение глубины Тихого океана – около 4 километров. При этом высота волны на достаточном удалении от
источника может составлять несколько сантиметров. Таким образом, при вычислении общей толщины слоя воды
q значение высоты волны сказывается лишь в 5-6 знаке мантиссы. Поскольку двойная точность хранения данных
позволяет использовать мантиссу длиной около 16 знаков, а одинарная – до 7 знаков, то влияние высоты волны
на всю толщину слоя воды оказывается довольно близко к пределу точности при вычислениях с одинарной
точностью, по сравнению с двойной.
Чтобы избежать потери точности, был предложен следующий метод вычислений. Величина вертикального
смещения воды в источнике умножается на некоторый коэффициент k. После получения результатов
моделирования, вертикальные смещения воды уменьшаются в k раз. Таким образом, на момент вычислений
влияние высоты волны смещается с 6 знака мантиссы, что заметно уменьшает влияние точности. Заметим, что
данный метод не приводит к значительному изменению скорости распространения волны, поскольку при
умеренном выборе коэффициента влияние на высоту столба воды остается в пределах 3-4 знака после запятой.
Более детальные правила для выбора k будут исследованы в дальнейшем. Однако уже сейчас данный метод
позволяет избавиться от заметных отклонений вычислений с двойной точностью от вычислений с одинарной.
Дальнейшие планы
На текущий момент полученная в результате работы программа уже применялась для моделирования
реальных событий на примере цунами, зародившегося возле острова Самоа в сентябре 2009 года. Сравнение
результатов моделирования с результатами, полученными в реальности, показало заметное сходство, но для
более детального анализа потребуется произвести моделирование на более подробных сетках моделирования.
Однако помимо этого существует несколько задач, решение которых может принести заметную пользу для
дальнейшего развития проекта:
• исследование различных параметров запуска программы позволит сбалансировать время вычислений и
их точность;
• дальнейшая оптимизация программы. В планах уже есть несколько допустимых оптимизаций, которые
могут заметно увеличить скорость расчета;
• написание удобного графического интерфейса облегчит обращение с программой для простых
пользователей;
• создание сетевого клиент-серверного комплекса приложений позволит использовать для моделирования
вычислительные ресурсы удаленных серверов.
Заключение
В процессе данной работы был выполнен перенос кода программы с языка Fortran на язык C с оптимизацией
под вычислительную платформу Intel. В итоге при использовании 16-ядерной системы над общей памятью SMP
4 x Intel Xeon CPU X7350, 2.93 GHz среднее время выполнения одной вычислительной итерации алгоритма
сократилось в 16 раз. Однако попытка использования для вычислений системы с процессором Intel Core i7 950,
несмотря на меньшее количество вычислительных ядер, показала лучшие значения скорости работы
программы, производя вычисления в полтора раза быстрее. Таким образом, суммарное время расчета задачи
сократилось с 8 часов до нескольких десятков минут.
Литература
1.
2.
3.
4.
NOAA Center for Tsunami Research [Электронный ресурс] = Национальный центр исследования
цунами: описание программного комплекса – Электрон. Дан. – Seattle, WA[2010] – Режим доступа:
http://nctr.pmel.noaa.gov/model.html, свободный – Загл. с экрана
Титов В.В. Метод численного расчета цунами с учетом трансформации волны на мелководье [Текст]
/ В.В. Титов; акад. Наук. СССР, Сибир. Отд., Вычисл. Центр – Новосибирск: Препринт, 1988. 25 с.
Стокер Дж. Дж. Волны на воде. [Текст] ; М.: ИЛ, 1959. 617 с.
M.Lavrentiev Jr., A.Romanenko, Speeding up of MOST program, Geophysical research abstracts, Vol. 10,
EGU2008-A-00000, 2008
Download