Статья опубликована в рамках: XXVI Международной научно-практической конференции «Естественные и математические науки в современном мире» (Россия, г. Новосибирск, 12 января 2015 г.)
Наука: Информационные технологии
Секция: Математическое моделирование, численные методы и комплексы программ
Скачать книгу(-и): Сборник статей конференции
- Условия публикаций
- Все статьи конференции
дипломов
Статья опубликована в рамках:
Выходные данные сборника:
ОПТИМИЗАЦИЯ ИСХОДНОГО КОДА ПРОГРАММ, РЕАЛИЗУЮЩИХ МОДЕЛИ ФИЗИЧЕСКИХ ПРОЦЕССОВ В СЛОЖНЫХ ОБЪЕКТАХ
Дадоян Карине Араиковна
студент 2 курса, инженерного факультета, Северо-Кавказский федеральный университет, филиал, РФ, г. Пятигорск
E -mail:
Джамалов Адиль Чубанович
студент 3 курса, инженерного факультета, Северо-Кавказский федеральный университет, филиал, РФ, г. Пятигорск
Пирмагомедов Олег Владимирович
студент 3 курса, инженерного факультета, Северо-Кавказский федеральный университет, филиал, РФ, г. Пятигорск
Тимченко Ольга Викторовна
канд. экон. наук, кафедры физико-математических наук Северо-Кавказский федеральный университет, филиал, РФ, г. Пятигорск
Optimization of the source code that implements the models of physical processes in a complex object
Dadoyan Karine
2nd year student , Faculty of Engineering, North-Caucasus Federal University, branch, Russia, Pyatigorsk
Jamalov Adil
3-year student , Faculty of Engineering, North-Caucasus Federal University, branch, Russia, Pyatigorsk
Pirmagomedov Oleg
3-year student , Faculty of Engineering, North-Caucasus Federal University, branch, Russia, Pyatigorsk
Timchenko Olga
research manager, PhD. ehkon. Sciences, Department of Physics-Mathematical Sciences North-Caucasus Federal University, branch, Russia, Pyatigorsk
АННОТАЦИЯ
В данной статье рассмотрены методы оценки производительности программного кода, предложен способ его оптимизации. Это позволяет увеличить скорость вычислений, что очень актуально для моделирования сложных физических и технических процессов и систем.
ABSTRACT
This article describes the methods for evaluating the performance of code, provides a method for optimization. This can speed up the calculations, which is very important for modeling complex physical and technical processes and systems.
Ключевые слова: Компьютерное моделирование; оптимизация кода программы; граничные условия; математическая модель; многопоточное приложение.
Keywords . Computer simulation; code optimization program; boundary conditions; mathematical model; multi-threaded application.
В ходе решения задач моделирования сложных физических и технических процессов специалисты сталкиваются с проблемами ограниченности ресурсов ЭВМ. Программы, реализующие сложные модели, требуют значительных затрат компьютерного времени для вычислений, иногда мощности компьютеров не хватает для их реализации и приходится прибегать к упрощению моделей, что, безусловно, негативно сказывается на результатах, снижая точность расчетов. Для решения этой проблемы можно оптимизировать структуру программы с целью повышения скорости вычислений.
Для оптимизации приложения можно выделить два основных направления: оптимизация алгоритма вычислений и снижение расходов процессорного времени на выполнение побочных задач.
Перед началом оптимизации кода, в первую очередь следует найти узкие места в программе, расходующее наибольшее количество вычислительных ресурсов (процессорного времени, оперативной памяти). Для нахождения таких узких мест применяются специализированные программы — профайлеры. К сожалению, в среде разработки Delphi нет встроенного приложения для этой задачи, поэтому мы используем бесплатную программу Sampling Profiler для нахождения проблемных мест в коде и функцию GetTickCount для вычисления скорости работы кода.
Функция GetTickCount возвращает количество миллисекунд с момента загрузки Windows. Погрешность измерения составляет 1 %. Для получения достоверных данных мы используем среднее значение из выборки в 30 результатов [1].
Пример тестового кода приведен на рисунке 1.
Рисунок 1. Код для оценки скорости работы программы
Пример выполнения этой программы приведен на рисунке 2.
Рисунок 2. Результат выполнения тестового кода
Программа выводит верный результат и может использоваться для оценки скорости работы реального приложения.
В настройках линковщика среды Delphi следует включить добавление отладочной информации TD32, она необходима профайлеру для корректной работы (рисунок 3).
Рисунок 3. Настройка линковщика в среде Delphi
В качестве примера оптимизации кода мы разберем простую программу для моделирования тепловых процессов протекающих в какой-либо среде. Часть кода приведена ниже.
for time := 1 to 5000 do begin
for i:=2 to 21 do
for j := 2 to 51 do
for k := 14 downto 2 do
dT1[i,j,k]:=a4*dtau*(((T1[i-1,j,k] -2*t1[i,j,k]+t1[i+1,j,k])/sqr(dX))+((T1[i,j-1,k]-2*t1[i,j,k]+ t1[i,j+1,k])/sqr(dY))+((t1[i,j,k+1]-2*t1[i,j,k]+t1[i,j,k-1])/sqr(dZ)));
Series1.AddXY((time) div 4,T1[11,5,5]);
Memo1.Lines.Add(FloatToStr(t1[11,5,5]));
Application.ProcessMessages;
end;
Настроим параметры профайлера для оценки скорости работы программы. Эти настройки приведены на рисунке 4.
Рисунок 4. Настройки главного окна профайлера
Запустим программу в профайлере. На рисунке 5 показан результат оценки скорости работы отдельных модулей программы.
Рисунок 5. Результаты работы профайлера
Время на одну итерацию составило 11 мс. Общее время выполнения программы 55 секунд.
Как видно из отчета, на вычисления расходуется лишь 12,67 % времени, все остальное уходит на вывод данных в memo и chart.
Как это можно исправить? [2].
В первую очередь можно отключить вызов функции Application.ProcessMessages, позволяющей наблюдать за построением графика в реальном времени. В результате, график будет виден только после завершения вычислений. Это не всегда удобно, но в случае с программами, выполняющими моделирование, такой шаг зачастую оправдан. В результате использования такого простого приема, время выполнения одной итерации снизилось до 2 миллисекунд, что дает нам прирост производительности в 5,5 раз.
Для отделения вычислительной части программы от её интерфейса существуют можно использовать многопоточные вычисления.
Поскольку метод конечных разностей, используемый в нашей программе, на каждой новой итерации использует ранее вычисленное состояние объекта, мы не можем использовать более одного потока для вычислений.
Для вынесения вычислительно модуля в отдельный поток, мы используем стандартный объект Delphi Thread Object. В процедуру Execute нового потока мы переносим код нашей вычислительной процедуры, за исключением тех команд которые отвечают за взаимодействие с пользовательским интерфейсом. К сожалению, из контекста потока невозможно непосредственно взаимодействовать с VCL формами , поэтому обновление данных формы осуществляется через встроенную процедуру Synchronize параметром которой мы указываем процедуру выводящую результаты вычислений в компоненты Tmemo и TChart главного окна программы. Результат выполнения программы, реализующей вычисления в потоках, приведен на рисунке 6 [3].
Рисунок 6. Результат выполнения программы
Скорость вычислений составила от 1 до 2 миллисекунд на одну итерацию, в зависимости от общей загруженности ядер процессора и приоритета создаваемого потока. Наилучшая производительность наблюдалась при создании потока с приоритетом Tphighest(Высокий).
Плюсы использования потоков в приложениях:
· Интерфейс программы не зависит от вычислений. Не происходит «зависания» программы.
· Легко реализуется возможность остановки вычислений.
· Высокая производительность.
· Легко регулировать приоритет потока.
Минусы применения потоков:
· Сложность разработки и отладки программного кода [4].
· Сложность взаимодействия потоков программы при доступе к общим ресурсам (например к открытым файлам, ячейкам памяти и др.).
Таким образом, внеся некоторые изменения в структуру программы, мы получаем экономию времени выполнения приложения в 11 раз по сравнению с первоначальным вариантом. При этом алгоритм вычислений не изменяется. Это позволяет обрабатывать большие объемы данных с сохранением точности моделирования. В дальнейшем для оптимизации программ такого рода можно попытаться оптимизировать алгоритм вычислений с учетом архитектуры процессора. Это позволит в ещё большей степени увеличить производительность программы [5].
Список литературы:
1.Взаимодействующие последовательные процессы / И. Хоар / М: Мир 1989 г.
2.Котов В.Е. Алгебра регулярных сетей Петри. // Кибернетика, — 1980, — № 5, — с. 10—18.
3.Котов В.Е. Сети Петри. -М.: Наука, 1984. — 160 с.
4.Параллельные вычислительные системы / Б.А. Головкин / М: Наука 1980 г.
5.Распределённые и управляющие вычислительные системы / М: Наука 1987.
дипломов
Оставить комментарий