Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018) — различия между версиями

Материал из 0x1.tv

 
(не показана одна промежуточная версия этого же участника)
;{{SpeakerInfo}}: {{Speaker|Вячеслав Стародумов}}
<blockquote>
Представлен обзор основных возможностей современных компиляторов (gfortran, ifort) языка Фортрана при решении вычислительных задач.
</blockquote>

{{VideoSection}}
{{vimeoembed|254114850|800|450}}
<!-- {{youtubelink|}} -->
|BE5GH2zFjDo}}{{letscomment}}
{{SlidesSection}}
[[File:Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf|left|page=-|300px]]

{{----}}

== Thesis ==
<latex>
Фортран "--- первый язык программирования высокого уровня, ориентированный на решение вычислительных задач. Современный
Фортран в первую очередь ориентирован на высокоэффективные вычисления.

Среди основных нововведений Фортрана можно выделить:

\begin{itemize}
\item поддержка длинных чисел (шестнадцатибайтные целые и вещественные тридцатидвухбайтные комплексные числа);
\item динамические массивы переменной длины;
\item все основные операции, процедуры и функции языка выполняются не только над скалярными величинами, но и над
массивами, матрицами, а также их фрагментами "--- секциями\footnote{Секция массива "--- часть массива, которая
		определяется именем массива и границами изменения индексов (например, \Sys{x(:,4), y(1:15:3)}).};
\item в современных компиляторах реализована конвейерная обработка операций и функций над массивами и секциями,
благодаря чему исполняемый код программ обработки массивов и матриц, генерируемый компиляторами Фортрана, является
самым быстрым;
\item поддержка параллельных вычислений на уровне стандарта языка: параллельные циклы, комассивы;
\item поддержка технологий параллельного программирования MPI, OpenMP;
\item внедрение технологии автораспараллеливания в компиляторе ifort.
\end{itemize}

Многие экономические, инженерные и вычислительные задачи сводятся к задачам умножения матриц и решению систем линейных
алгебраических уравнений большой размерности. Рассмотрим какие возможности предоставляют современные компиляторы для
решения этих задач.

При анализе быстродействия авторами использовались следующие компиляторы языка Фортран: 

\begin{itemize}
\item свободный компилятор gfortran (ver 7.2), поддерживающий большинство возможностей современных стандартов языка;
компилятор gfortran портирован в Windows;
\item проприетарный компилятор компании Intel "--- ifort, входящий в состав комплекса проприетарных программ Intel
Parallel Studio; компилятор доступен для бесплатного использования в некоммерческих целях преподавателями, студентами и
научными работниками;
\item компилятор pgfortran, входящий в состав PGI Edition, которые поддерживает технологию CUDA; cуществует версия
компиляторов семейства PGI "--- PGI Community Edition. 
\end{itemize}

В очень многих вычислительных задачах необходимо выполнять матричные операции. Самой затратной матричной операцией
является операция умножение матриц\footnote{Частным случаем матричного умножения являются "--- умножение матрицы на
вектор и скалярное произведение векторов.}. Авторами была проанализирована эффективность умножения матриц на
современном Фортране. В Фортране присутствует встроенная подпрограмма умножения матриц matmul, в последней версии
gfortran (gfortran-7) функция значительно оптимизирована. В таблице~\ref{aer-tbl00} приведены результаты времени выполнения программ,
реализующих классический и блочный алгоритмы умножения матриц и подпрограммы matmul.
\begin{table}
\begin{center}
\tabcolsep=0.2em\scriptsize
\caption{\scriptsize Быстродействие программ (время, с), реализующих классический и блочный алгоритмы на Фортране с использованием свободных и проприетарных компиляторов}\label{aer-tbl00}
\begin{tabular}{|l|p{0.13\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.12\textwidth}|p{0.12\textwidth}|}\hline
	&  &\multicolumn{6}{p{0.42\textwidth}|}{Классический алгоритм, порядок выполнения циклов} &\multicolumn{1}{p{0.12\textwidth}|}{Блочный алгоритм (размер блока 16)} &\multicolumn{1}{p{0.12\textwidth}|}{matmul}
\\\hhline{--------~~}
 &Время, t(c) &ijk &jik &kij &ikj &jki &kji & &\\\hline
1536 &gfortran &20.5 &23.65 &52.9 &49.9 &2.22 &3.77 &2 &0.5\\\hline
 &ifort &0.67 &0.7 &0.7 &0.67 &1.99 &0.7 &2.68 &0.69\\\hhline{~---------}
 &pgfortran &1.86 &2.05 &2.05 &1.9 &1.9 &2.08 &5.64 &0.91\\\hhline{~---------}
2048 &gfortran &91.12 &89.84 &219.5 &222.48 &5.26 &8.84 &4.75 &1.16\\\hline
 &ifort &1.52 &1.66 &1.65 &1.6 &4.68 &1.64 &6.98 &1.63\\\hhline{~---------}
 &pgfortran &4.46 &4.86 &4.91 &4.54 &4.54 &4.51 &61.78 &2.19\\\hline
\end{tabular}
\end{center}
\end{table}

При использовании проприетарных компиляторов, не важно в каком порядке записывать циклы в коде программ умножения
матриц. Компиляторы ifort, pgfortran, достаточно хорошо оптимизируют исходный код. При использовании  gfortran
программист должен аккуратно писать код, записывая циклы в оптимальном для данного языка порядке. Подпрограмма
умножения матриц, сформированная с помощью процедуры matmul и скомпилированная с помощью gfortran оказалась быстрее
любого другого кода (даже быстрее блочного алгоритма и алгоритма Штрассена). Авторы сравнивали быстродействие программ
умножения, написанных с использованием классических циклов на С и Фортране. Программы на Фортране работают на 10-12\%
быстрее. Использование matmul и свободного компилятора позволяет ускорить работу программы ещё в несколько раз. Поэтому
именно matmul и новый компилятор gfortran-7 следует использовать для решения задач, сводящихся к умножению матриц.

Одной из тестовых задач анализа быстродействия является метод Гаусса решения СЛАУ. Было проведено сравнение
быстродействие программ на С и Фортране (см табл. 2)

Таблица 2. Время счёта программ на Фортране и С(С++) решения СЛАУ методом Гаусса.

\begin{table}
\begin{center}
\tabcolsep=0.2em\scriptsize
\caption{\scriptsize Время счёта программ на Фортране и С(С++) решения СЛАУ методом Гаусса.}\label{aer-tbl01}
\begin{tabular}{|p{0.15\textwidth}|p{0.21\textwidth}|p{0.17\textwidth}|p{0.22\textwidth}|p{0.17\textwidth}|}
\hline
Размерность системы &Компилятор Фортрана &Время счёта, с &Компилятор С(С++) &Время счёта, с\\\hline
1000&gfortran &3.78 &g++ &0.89\\\hhline{~----}
 &ifort &3.9 &icpc &0.88\\\hhline{~----}
 &pgfortran &1.44 &pgc++ &0.85\\\hline
2000 &gfortran &34.37 &g++ &10.10\\\hhline{~----}
 &ifort &33.02 &icpc &10.11\\\hhline{~----}
 &pgfortran &16.13 &pgc++ &9.95\\\hline
\end{tabular}
\end{center}
\end{table}

Как видно из результатов, программы на С++ работают значительно быстрее, что является следствием большого количества
циклов в алгоритме.

При написании последовательных приложений решения задач вычислительной математики использование конвейерных операций
позволяет значительно повысить быстродействие приложений. Авторами было проведено тестирование метода Зейделя и метода
простой итерации (см. табл.~3, k "--- количество итераций, 1 "--- программа с использованием циклов, 2 "--- программа с
использованием конвейерных операций).
\begin{table}
\begin{center}
\tabcolsep=0.2em\scriptsize
\caption{\scriptsize Время счёта программ решения СЛАУ итерационными методами.}\label{aer-tbl02}
\begin{tabular}{|p{0.15\textwidth}|p{0.15\textwidth}|p{0.06\textwidth}|p{0.06\textwidth}|p{0.06\textwidth}|p{0.1\textwidth}|p{0.1\textwidth}|p{0.1\textwidth}|}
\hline
	Размерность системы  &Компилятор &\multicolumn{3}{c|}{Метод Зейделя} &\multicolumn{3}{c|}{Метод простой итерации}\\\hhline{~~------}
	& &\multicolumn{1}{c|}{k} &\multicolumn{1}{c|}{1} &\multicolumn{1}{c|}{2} &\multicolumn{1}{c|}{k} &\multicolumn{1}{c|}{1} &\multicolumn{1}{c|}{2}\\\hline
	10000 &gfortran &\multicolumn{1}{c|}{12} &3.58 &3.58 &\multicolumn{1}{c|}{37} &10.4 &2.32\\\hhline{~-~--~--}
 &pgfortran & &3.48 &3.48 & &2.28 &2.27\\\hhline{~-~--~--}
 &ifort & &3.5 &3.5 & &7.5 &2.19\\\hline
	12000 &gfortran &\multicolumn{1}{c|}{13} &6.31 &6.31 &\multicolumn{1}{c|}{37} &18.2 &3.34\\\hhline{~-~--~--}
 &pgfortran & &5.6 &5.6 & &3.28 &3.25\\\hhline{~-~--~--}
 &ifort & &5.64 &5.64 & &12.8 &3.17\\\hline
\end{tabular}
\end{center}
\end{table}

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

Коммерческий проприетарный компилятор pgfortran генерирует быстродействующее параллельное приложение при написании
программы без использования современных матричных операторов и подпрограмм.

Если внимательно проанализировать результаты, представленные в табл.~3, можно заметить, что, не смотря на то, что метод
Зейделя требует значительно меньшее количество итераций, время счёта в методе простой итерации значительно меньше, чем
в методе Зейделя. Это связано с тем, что в методе Зейделя невозможно избавиться от последовательных циклов и перейти
полностью к матричным (конвейерным) операциям и подпрограммам. Алгоритм сложения является рекуррентным, что не
позволяет избавиться от последовательных циклов.

Однако можно ускорить алгоритм Зейделя при написании кода на Фортране, используя операцию матричного умножения matmul.
На каждой итерации можно предварительно умножать фрагмент матрицы  на вектор $x$. Это позволит сократить время счёта.
Платой за это будет память для хранения второй матрицы размерности $n\times n$. Ниже приведены результаты сравнения
быстродействия обычного и усовершенствованного метода Зейделя и метода простой итерации.
\begin{table}
\begin{center}
\tabcolsep=0.2em\scriptsize
\caption{\scriptsize Быстродействие метода Зейделя, усовершенствованного метода Зейделя и метода простой итерации.}\label{aer-tbl03}
\begin{tabular}{|p{0.17\textwidth}|p{0.2\textwidth}|p{0.17\textwidth}|p{0.17\textwidth}|p{0.17\textwidth}|}\hline
Размерность системы &Компилятор &\multicolumn{2}{c|}{Метод Зейделя} &Метод простой итерации\\\hhline{~~--~}
& &обычный &\multicolumn{1}{p{0.2\textwidth}|}{усовершенство\-ванный} &\\\hline
10000 &gfortran &3.57 &2.61 &2.32\\\hhline{~----}
 &pgfortran &3.48 &2.54 &2.27\\\hhline{~----}
 &ifort &3.5 &2.48 &2.19\\\hline
12000 &gfortran &6.26 &4.01 &3.34\\\hhline{~----}
 &pgfortran &5.6 &3.78 &3.25\\\hhline{~----}
 &ifort &5.62 &3.76 &3.17\\\hline
\end{tabular}
\end{center}
\end{table}

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

Одним из новейших методов построения параллельных программ является технология автораспараллеливания,
полноценная поддержка которой реализована в только проприетарных компиляторах Intel посредством опций командной строки
-parallel.

В таблице 5 приведены результаты применения опции
автораспараллеливания к последовательным программам умножения матриц (matmul, классический и блочный
алгоритмы).

\begin{table}
\begin{center}
\tabcolsep=0.2em\scriptsize
\caption{\scriptsize Ускорение в программах умножения матриц с опцией автораспараллеливания (4 ядра).}\label{aer-tbl04}
\begin{tabular}{|p{0.2\textwidth}|p{0.2\textwidth}|p{0.2\textwidth}|p{0.2\textwidth}|}\hline
размерность &matmul &Классический алгоритм &Блочный алгоритм\\\hline
1000 &1.4 &1.4 &2\\\hline
2000 &2.2 &2.2 &4\\\hline
3000 &2.3 &2.3 &5.2\\\hline
4000 &2.4 &2.4 &7.1\\\hline
5000 &2.5 &2.5 &6.8\\\hline
\end{tabular}
\end{center}
\end{table}

Кроме поддерживаемых в других языках программирования технологий параллельного программирования OpenMP
и MPI, в новый стандарт языка Fortran-2008 включены встроенные средства распараллеливания Co-Arrays (комассивы),
которые могут быть реализованы в системах как с распределенной, так и с общей памятью.

С помощью комассивов были разработаны параллельные реализации методов Зейделя и простой итерации. Оценка времени работы
программ приведена в таблице~6.

\begin{table}
\begin{center}
\tabcolsep=0.2em\scriptsize
\caption{\scriptsize Ускорение при решения СЛАУ размерности 7000 и с использованием технологии комассивов на компьютерном кластере ВятГУ.}\label{aer-tbl05}
\begin{tabular}{|p{0.3\textwidth}|p{0.1\textwidth}|p{0.1\textwidth}|p{0.1\textwidth}|p{0.1\textwidth}|}\hline
	&\multicolumn{4}{p{0.4\textwidth}|}{Количество процессорных узлов}\\\hhline{~----}
 &1 &2 &4 &8\\\hline
Метод простой итерации & 1 & 1.93 & 3.68 & 5.6\\\hline
Метод Зейделя & 1 & 1.3 & 1.64 & 1.75\\\hline
\end{tabular}
\end{center}
\end{table}

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

</latex>
{{LinksSection}}
<!-- <blockquote>[©]</blockquote> -->

<references/>

[[Категория:Draft]]{{stats|disqus_comments=0|refresh_time=2021-08-31T17:08:23.735260|vimeo_plays=47|youtube_comments=1|youtube_plays=1055}}

[[Категория:OSEDUCONF-2018]]
[[Категория:Fortran]]
[[Категория:СПО в науке]]
[[Категория:High Performace Computing]]

Текущая версия на 14:33, 5 сентября 2021

Докладчик
Вячеслав Стародумов

Представлен обзор основных возможностей современных компиляторов (gfortran, ifort) языка Фортрана при решении вычислительных задач.

Видео

on youtube

Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.

Презентация

Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018).pdf

Thesis

Примечания и ссылки


Plays:1102   Comments:1