Использование компиляторов языка Фортран при решении вычислительных задач (Вячеслав Стародумов, OSEDUCONF-2018)
Материал из 0x1.tv
- Докладчик
- Вячеслав Стародумов
Представлен обзор основных возможностей современных компиляторов (gfortran, ifort) языка Фортрана при решении вычислительных задач.
Содержание
Видео
Презентация
Thesis
Фортран — первый язык программирования высокого уровня, ориентированный на решение вычислительных задач. Современный Фортран в первую очередь ориентирован на высокоэффективные вычисления.
Среди основных нововведений Фортрана можно выделить:
- поддержка длинных чисел (шестнадцатибайтные целые и вещественные тридцатидвухбайтные комплексные числа);
- динамические массивы переменной длины;
- все основные операции, процедуры и функции языка выполняются не только над скалярными величинами, но и над массивами, матрицами, а также их фрагментами — секциями[1];
- в современных компиляторах реализована конвейерная обработка операций и функций над массивами и секциями, благодаря чему исполняемый код программ обработки массивов и матриц, генерируемый компиляторами Фортрана, является самым быстрым;
- поддержка параллельных вычислений на уровне стандарта языка: параллельные циклы, комассивы;
- поддержка технологий параллельного программирования MPI, OpenMP;
- внедрение технологии автораспараллеливания в компиляторе ifort.
Многие экономические, инженерные и вычислительные задачи сводятся к задачам умножения матриц и решению систем линейных алгебраических уравнений большой размерности. Рассмотрим, какие возможности предоставляют современные компиляторы для решения этих задач.
При анализе быстродействия авторами использовались следующие компиляторы языка Фортран:
- свободный компилятор gfortran (ver 7.2), поддерживающий большинство возможностей современных стандартов языка; компилятор gfortran портирован в Windows;
- проприетарный компилятор компании Intel — ifort, входящий в состав комплекса проприетарных программ Intel Parallel Studio; компилятор доступен для бесплатного использования в некоммерческих целях преподавателями, студентами и научными работниками;
- компилятор pgfortran, входящий в состав PGI Edition, который поддерживает технологию CUDA; существует версия компиляторов семейства PGI — PGI Community Edition.
В очень многих вычислительных задачах необходимо выполнять матричные операции. Самой затратной матричной операцией является операция умножение матриц[2]. Авторами была проанализирована эффективность умножения матриц на современном Фортране. В Фортране присутствует встроенная подпрограмма умножения матриц matmul, в последней версии gfortran (gfortran-7) функция значительно оптимизирована. Ниже приведены результаты времени выполнения программ, реализующих классический и блочный алгоритмы умножения матриц и подпрограммы matmul.
| Компилятор | Классический алгоритм, порядок выполнения циклов | Блочный алгоритм (размер блока 16) |
matmul | ||||||
|---|---|---|---|---|---|---|---|---|---|
| ijk | jik | kij | ikj | jki | kji | ||||
| 1536 | gfortran | 20.5 | 23.65 | 52.9 | 49.9 | 2.22 | 3.77 | 2 | 0.5 |
| ifort | 0.67 | 0.7 | 0.7 | 0.67 | 1.99 | 0.7 | 2.68 | 0.69 | |
| pgfortran | 1.86 | 2.05 | 2.05 | 1.9 | 1.9 | 2.08 | 5.64 | 0.91 | |
| 2048 | gfortran | 91.12 | 89.84 | 219.5 | 222.48 | 5.26 | 8.84 | 4.75 | 1.16 |
| ifort | 1.52 | 1.66 | 1.65 | 1.6 | 4.68 | 1.64 | 6.98 | 1.63 | |
| pgfortran | 4.46 | 4.86 | 4.91 | 4.54 | 4.54 | 4.51 | 61.78 | 2.19 | |
При использовании проприетарных компиляторов, не важно в каком порядке записывать циклы в коде программ умножения матриц. Компиляторы ifort, pgfortran, достаточно хорошо оптимизируют исходный код. При использовании gfortran программист должен аккуратно писать код, записывая циклы в оптимальном для данного языка порядке. Подпрограмма умножения матриц, сформированная с помощью процедуры matmul и скомпилированная с помощью gfortran оказалась быстрее любого другого кода (даже быстрее блочного алгоритма и алгоритма Штрассена). Авторы сравнивали быстродействие программ умножения, написанных с использованием классических циклов на С и Фортране. Программы на Фортране работают на 10–12% быстрее. Использование matmul и свободного компилятора позволяет ускорить работу программы ещё в несколько раз. Поэтому именно matmul и новый компилятор gfortran-7 следует использовать для решения задач, сводящихся к умножению матриц.
Одной из тестовых задач анализа быстродействия является метод Гаусса решения СЛАУ. Было проведено сравнение быстродействие программ на С и Фортране.
| Размерность системы | Компилятор Фортрана | Время счёта, с | Компилятор С(С++) | Время счёта, с |
|---|---|---|---|---|
| 1000 | gfortran | 3.78 | g++ | 0.89 |
| ifort | 3.9 | icpc | 0.88 | |
| pgfortran | 1.44 | pgc++ | 0.85 | |
| 2000 | gfortran | 34.37 | g++ | 10.10 |
| ifort | 33.02 | icpc | 10.11 | |
| pgfortran | 16.13 | pgc++ | 9.95 |
Как видно из результатов, программы на C++ работают значительно быстрее, что является следствием большого количества циклов в алгоритме.
При написании последовательных приложений решения задач вычислительной математики использование конвейерных операций позволяет значительно повысить быстродействие приложений. Авторами было проведено тестирование метода Зейделя и метода простой итерации (в таблице k — количество итераций, 1 — программа с использованием циклов, 2 — программа с использованием конвейерных операций).
| Размерность системы | Компилятор | Метод Зейделя | Метод простой итерации | ||||
|---|---|---|---|---|---|---|---|
| k | 1 | 2 | k | 1 | 2 | ||
| 10000 | gfortran | 12 | 3.58 | 3.58 | 37 | 10.4 | 2.32 |
| pgfortran | 3.48 | 3.48 | 2.28 | 2.27 | |||
| ifort | 3.5 | 3.5 | 7.5 | 2.19 | |||
| 12000 | gfortran | 13 | 6.31 | 6.31 | 37 | 18.2 | 3.34 |
| pgfortran | 5.6 | 5.6 | 3.28 | 3.25 | |||
| ifort | 5.64 | 5.64 | 12.8 | 3.17 | |||
Значительное ускорение наблюдается, если удаётся написать код с использованием только матричных подпрограмм и операторов (без циклов). При совместном использовании обычных циклов и матричных операции ускорение работы программы оказывается незначительным.
Коммерческий проприетарный компилятор pgfortran генерирует быстродействующее параллельное приложение при написании программы без использования современных матричных операторов и подпрограмм.
Если внимательно проанализировать результаты, представленные в предыдущей таблице, можно заметить, что, не смотря на то, что метод Зейделя требует значительно меньшее количество итераций, время счёта в методе простой итерации значительно меньше, чем в методе Зейделя. Это связано с тем, что в методе Зейделя невозможно избавиться от последовательных циклов и перейти полностью к матричным (конвейерным) операциям и подпрограммам. Алгоритм сложения является рекуррентным, что не позволяет избавиться от последовательных циклов.
Однако можно ускорить алгоритм Зейделя при написании кода на Фортране, используя операцию матричного умножения matmul. На каждой итерации можно предварительно умножать фрагмент матрицы на вектор x. Это позволит сократить время счёта. Платой за это будет память для хранения второй матрицы размерности n × n. Ниже приведены результаты сравнения быстродействия обычного и усовершенствованного метода Зейделя и метода простой итерации.
| Размерность системы | Компилятор | Метод Зейделя | Метод простой итерации | |
|---|---|---|---|---|
| обычный | усовершенствованный | |||
| 10000 | gfortran | 3.57 | 2.61 | 2.32 |
| pgfortran | 3.48 | 2.54 | 2.27 | |
| ifort | 3.5 | 2.48 | 2.19 | |
| 12000 | gfortran | 6.26 | 4.01 | 3.34 |
| pgfortran | 5.6 | 3.78 | 3.25 | |
| ifort | 5.62 | 3.76 | 3.17 | |
Аналогичным образом можно ускорять и другие алгоритмы вычислительной математики, в которых используются матричные операции.
Одним из новейших методов построения параллельных программ является технология автораспараллеливания, полноценная поддержка которой реализована в только проприетарных компиляторах Intel посредством опций командной строки -parallel.
Ниже приведены результаты применения опции автораспараллеливания к последовательным программам умножения матриц (matmul, классический и блочный алгоритмы).
| Размерность | matmul | Классический алгоритм | Блочный алгоритм |
|---|---|---|---|
| 1000 | 1.4 | 1.4 | 2 |
| 2000 | 2.2 | 2.2 | 4 |
| 3000 | 2.3 | 2.3 | 5.2 |
| 4000 | 2.4 | 2.4 | 7.1 |
| 5000 | 2.5 | 2.5 | 6.8 |
Кроме поддерживаемых в других языках программирования технологий параллельного программирования OpenMP и MPI, в новый стандарт языка Fortran-2008 включены встроенные средства распараллеливания Co-Arrays (комассивы), которые могут быть реализованы в системах как с распределенной, так и с общей памятью.
С помощью комассивов были разработаны параллельные реализации методов Зейделя и простой итерации.
| Количество процессорных узлов | ||||
|---|---|---|---|---|
| 1 | 2 | 4 | 8 | |
| Метод простой итерации | 1 | 1.93 | 3.68 | 5.6 |
| Метод Зейделя | 1 | 1.3 | 1.64 | 1.75 |
Современные компиляторы Фортрана позволяют разрабатывать высокоэффективный код решения вычислительных задач с использованием современных технологий. Самые новые технологии параллельного программирования полноценно поддерживаются на сегодняшний день только проприетарными компиляторами. При разработке последовательных и параллельных приложений имеет смысл использовать последние версии свободного компилятора gfortran, который генерирует самый быстрый код при работе с матрицами.
Примечания и ссылки
- ↑ Секция массива — часть массива, которая определяется именем массива и границами изменения индексов (например,
x(:,4),y(1:15:3)). - ↑ Частным случаем матричного умножения являются — умножение матрицы на вектор и скалярное произведение векторов.
Plays:1102 Comments:1