Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Численные методы и работа в параллельности

Покупка
Новинка
Основная коллекция
Артикул: 832080.01.01
Доступ онлайн
от 428 ₽
В корзину
В учебном пособии излагаются основы применения разностных методов и методов вычислительной линейной алгебры в курсе численных методов, который автор разрабатывал в течение ряда лет в Национальном исследовательском Московском государственном строительном университете. Материал акцентирован на освоении студентами методов и практических навыков, широко применямых в научно-исследовательских и отраслевых организациях. Основное внимание уделено методам программирования задач вычислительного характера с использованием высокопроизводительных компиляторов и математических библиотек. Рассмотрен механизм распараллеливания вычислений на основе директив OpenMP в современных стандартах языка программирования С++, а также в стандарте C++ SYCL для гетерогенных вычислительных сред. Для студентов, обучающихся по специальности «Прикладная математика и информатика». Будет также полезно научным сотрудникам и инженерам.
34
124
Максютов, М. С. Численные методы и работа в параллельности : учебное пособие / М.С. Максютов. — Москва : ИНФРА-М, 2025. — 355 с. — (Высшее образование). — DOI 10.12737/2163327. - ISBN 978-5-16-020223-5. - Текст : электронный. - URL: https://znanium.ru/catalog/product/2163327 (дата обращения: 16.04.2025). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов
ЧИСЛЕННЫЕ 
МЕТОДЫ И РАБОТА 
В ПАРАЛЛЕЛЬНОСТИ
М.С. МАКСЮТОВ
Москва
ИНФРА-М
2025
УЧЕБНОЕ ПОСОБИЕ


УДК 519.6(075.8)
ББК 22.192я73
 
М17
Р е ц е н з е н т ы:
Мацеевич Т.А., доктор физико-математических наук, профессор, 
профессор кафедры высшей математики Национального исследовательского Московского государственного строительного университета;
Суворов А.П., кандидат технических наук, доцент, доцент кафедры 
прикладной математики и информатики Национального исследовательского Московского государственного строительного университета
ISBN 978-5-16-020223-5 (print)
ISBN 978-5-16-112751-3 (online)
© Максютов М.С., 2025
Максютов М.С.
М17  
Численные методы и работа в параллельности : учебное пособие / 
М.С. Максютов. — Москва : ИНФРА-М, 2025. — 355 с. — (Высшее образование). — DOI 10.12737/2163327.
ISBN 978-5-16-020223-5 (print)
ISBN 978-5-16-112751-3 (online)
В учебном пособии излагаются основы применения разностных методов 
и методов вычислительной линейной алгебры в курсе численных методов, 
который автор разрабатывал в течение ряда лет в Национальном исследовательском Московском государственном строительном университете. 
Материал акцентирован на освоении студентами методов и практических 
навыков, широко применямых в научно-исследовательских и отраслевых 
организациях. Основное внимание уделено методам программирования 
задач вычислительного характера с использованием высокопроизводительных компиляторов и математических библиотек. Рассмотрен механизм распараллеливания вычислений на основе директив OpenMP в современных стандартах языка программирования С++, а также в стандарте 
C++ SYCL для гетерогенных вычислительных сред.
Для студентов, обучающихся по специальности «Прикладная математика и информатика». Будет также полезно научным сотрудникам и инженерам.
УДК 519.6(075.8)
ББК 22.192я73


Введение
Представляемое вашему вниманию учебное пособие служит логическим продолжением книги по программированию на С++ [10]. 
Все идеи, изложенные в ней, остаются неизменными и здесь. Язык 
программирования С++ в качестве основного, в достаточно простой, 
понятной для студентов технических вузов форме, выбран здесь неслучайно. Несмотря на быстрое распространение языка программирования Python, рассчитанного прежде всего на широкий круг 
специалистов, С++ выбран как инструмент вычислений именно 
в прикладной математике, в первую очередь — по факторам производительности и скорости вычислений, контролю и типизации 
данных, где С++ имеет существенные преимущества. Не забыт 
и язык программирования Fortran, который имеет лучшую среди 
всех языков программирования оптимизацию для данных с плавающей точкой.
Некоторые вычислительные коды, включенные в пособие, написаны на современной версии этого языка. Парадигму «параллельности всего» рацио нальнее будет использовать там, где она 
действительно нужна. Поэтому материал, представленный здесь, 
будет постепенно переходить от стандартных последовательных 
алгоритмов до их параллельных реализаций при вычислениях 
на многопроцессорных компьютерах. Основным инструмен том параллельных вычислений здесь остается интерфейс OpenMP, так 
как он позволяет относительно легко перейти от последовательного 
кода к параллельно выполняемому на ядрах процессора или процессоров. При этом код остается хорошо читаемым, а директивы 
OpenMP формально играют роль комментариев. Описание стандарта OpenMP не приводится, но все необходимые сведения содержатся на официальном ресурсе www.openmp.org. С развитием 
стандарта OpenMP (сегодня это уже версия 5.2) появилась возможность использовать для вычислений не только центральный процессор, но и различного рода акселераторы и графические карты, 
работая в гетерогенных средах. Поэтому дополнительно показаны 
расширенные возможности применения языка С++ в гетерогенных 
средах на основе новейшего стандарта параллельного программирования для C++ — SYCL.
На момент написания этого пособия язык программирования 
С++ успел полностью перейти на «минимально допустимый» стандарт программирования С++14 по умолчанию, и некоторые старые 


реализации языка уже не поддерживаются. Более того, сейчас уже 
полностью реализован и используется стандарт С++20, в связи 
с чем вычислительные коды составлены так, что поддерживаются 
как в новых, так и в старых стандартах С++.
Учебный материал рассчитан на студентов старших курсов технических специальностей вузов и студентов, обучающихся по специальности 01.03.02 «Прикладная математика и информатика». 
Однако он остается актуальным и для технических специалистов 
различного уровня. Основное направление изложения материала — 
разностные методы и вычислительные методы линейной алгебры. 
Автор старался придерживаться концепции «за формулой следует 
оператор» в излагаемом материале, по это му он изобилует текстами 
программ. Это не просто необходимая форма наполнения страниц, 
а по сути — те же формулы, но понятные для компьютера.
Материал пособия представлен так, чтобы, придя в научно-исследовательские лаборатории, вчерашние выпускники не задавали 
«лишних вопросов». В связи с этим в пособии особое внимание 
уделено различным математическим библиотекам. Помимо студентов, как уже было отмечено, книга может быть полезна инженерам различных технических специальностей, желающим применять численные методы в своей работе.


Глава 1. 
ПОГРЕШНОСТИ ВЫЧИСЛЕНИЙ
1.1. ОТНОСИТЕЛЬНАЯ И АБСОЛЮТНАЯ ПОГРЕШНОСТИ
В вычислительной практике редко бывает ситуация, когда 
искомый результат известен «безусловно точно», за исключением 
тех случаев, когда он явно предопределен. Например, cos(0) = 1, 
и рассуждения о том, «насколько это точно?», теряют смысл. Даже 
в случае 1/3 = 0,3(3) мы знаем «точный» результат! Иначе обстоит 
дело с ситуацией, когда, предположим, нам нужно вычислить 
2 = 1,414213562… и мы хотим выразиться в стиле, что это значение 
получено «вполне точно», «достаточно точно» и пр. Однако такие 
определения относятся скорее к нашей интуиции, чем к математическим определениям. Хотя интуиция в математике значит нисколько не меньше, чем «точное знание». Более того, можно сказать, 
что если само значение t  есть аргумент некоторой реальной физической величины, скажем, времени, то точность этого значения 
имеет относительный характер. Например, если t = 2 — это время, 
измеряемое в часах, днях и месяцах, то к цифрам, следующим после 
десятичной точки, можно не предъявлять особо «жестких» требований. С другой стороны, если это минуты, секунды, миллисекунды, 
то требования к числу цифр после десятичной точки ужесточаются!
Для того чтобы дать строгое определение погрешности вычислений, необходимо различать два их типа — абсолютную и относительную погрешности. Имея в нашем распоряжении точное значение числа, например cos( / 3)
0,5
π
=
, можно определить погрешность определения этой величины, полученного каким-либо 
приближенным способом (например, представив y = cos(x) в виде 
ряда Маклорена y = f(x), с конечным числом членов). Тогда, если 
записать 
cos( / 3)
y =
π
 как «истинное значение» числа, 
а 
( / 3)
y
f
=
π
′
 — как приближенное, то можно сформулировать 
определение абсолютной погрешности Δy и относительной δy:
 
,
(
)/
/
.
y
y
y
y
y
y
y
y
y
Δ =
−′
δ =
−
= Δ
′
′
′  
(1.1)
Допустим, 
0,5
y
Δ =
. Как сильно мы ошиблись? Если y′ = 0,5, то 
точность весьма невелика. Если же мы нашли абсолютную погреш
ность при приближенном вычислении некоторой другой функции y, 
где 
5
2 10
y =
⋅
′
, то это более чем удачная погрешность! В обоих случаях величина погрешности одинакова. Однако если в первом 
случае она велика, то во втором — незначительна! Поэтому, чтобы 
избежать двусмысленности в трактовке величины погрешности, 
лучше использовать относительную погрешность:
 
(
)
(
)
5
1
5
6
0,5
0,5/ 0,5
1,
2 10
5 10
/ 2 10
2.5 10
−
−
δ
=
=
δ
⋅
= ⋅
⋅
=
⋅
. 
Таким образом, в первом случае мы ошиблись на все 100%, во 
втором — всего на 0,00025%! Однако истинное значение y обыч но 
неизвестно и чаще приходится довольствоваться приближенной 
величиной. Поэтому стали использовать предельную величину абсолютной погрешности Δy: 
 
;
y
y
y
y
y
y
y
y
y
y
Δ
≤Δ
−
≤Δ
→
−Δ
<
<
+ Δ
′
′
′
′
′
′
′. 
(1.2)
Предельная абсолютная погрешность принимается равной половине единицы последнего разряда числа. Например, приближенное 
значение y′ = 3,14 могло быть получено в результате ручного округления результатов расчетов 3,141 и 3,135. Тогда, 
0,005
y
Δ
≤
→
′
 
0,005
0,005
y
y
→
≤
→Δ
=
′
.
При вычислении на компьютере округление не производится, 
по это му погрешность вычислений удваивают.
Приведем примеры оценки предельной абсолютной погрешности (табл. 1.1).
Таблица 1.1
y′
1,7
–0,0051
20
35,00
Δy′
0,05
0,00005
0,5
0,005
Предельная относительная погрешность определяется как
 
y
y
y
Δ ′
δ
=
′
′ . 
(1.3)
Например, ( 0,0051)
0,00005/ 0,0051
0,0098
1%.
δ −
=
=
=
При сложении и вычитании абсолютные погрешности складываются. Так же складываются относительные погрешности 
при умножении и делении. Если при суммировании наблюдается 
различная относительная погрешность у слагаемых, то на практике 
относительная погрешность суммы выбирается наибольшей среди 
слагаемых.


Значащими цифрами числа y называются все цифры в его записи, начиная с первой ненулевой слева. Значащую цифру числа y 
называют верной, если абсолютная погрешность числа не превосходит единицы последнего разряда, соответствующей этой цифре. 
Пример: y = 0,024500. Для различных значений предельных абсолютных погрешностей для приближенных к нему значений y′ 
можем подчеркнуть верные цифры: Δy′ = 0,00005, y′ = 0,0245. 
Для Δy′ = 0,000005, y′ = 0,02450.
Вообще говоря, если известно истинное значение числа y, то известно и «истинное» значение абсолютной погрешности Δy′ = y – y′. 
В этом случае значащие и верные цифры не совпадают! Пусть известно истинное значение y = 1,00000. Получено приближенное 
к нему y′ = 0,99999. Тогда Δy′ = y – y′ = 0,00001. Подчеркнем верные: 
y′ = 0,99999. Если же мы получили приближение y′ = 0,99991, то 
Δy′ = 0,00009 и верных цифр уже меньше: y′ = 0,99991. Таким 
образом, понятие «верные цифры» не звучит буквально: 1,00000 
и 0,9999 это не одно и тоже! Запишем следующие правила вычисления погрешности:
 
(
)
(
)
(
)
( )
(
)
(
)
,
,
,
.
k
a
b
a
b
a b
a
b
a
a
b
b
a
k
a
a
b
a
b
a
b
Δ
±
= Δ ± Δ
δ
⋅
= δ + δ
⎛
⎞
δ
= δ + δ
⎜
⎟
⎝
⎠
δ
= δ
Δ ± Δ
δ
±
=
±
 
(1.4)
1.2. ПОНЯТИЕ ТОЧНОСТИ
Понятие точности для некоторой величины можно представить как ее значение, не содержащее погрешности. Повышая точность, мы уменьшаем погрешность, и наоборот. В алгоритме кода 
не должно быть вычислений, проводящихся «самотеком», и в нем 
необходим контроль над точностью вычислений. Это важно потому, что все вычисления ограничены разрядной сеткой компьютера. Часто для этого употреб ляется термин: найти значение с «наперед заданной точностью». В первую очередь, конечно, речь идет 
об абсолютной погрешности. Однако не менее важен контроль относительной погрешности, который позволяет избежать ошибок 
«масштабирования» при определении погрешностей в вычислениях. Оценим погрешность функции y, используя формулу (1.4):


(
)
(
)
(
)
( )
(
)
(
)
(
)
( )
( )
( )
3
;
1
1
3
1
2
1
1
3
2
1
1
( )
1
3
.
2
1
a
b
y
x
x
y
a
b
x
x
a
b
x
x
a
b
x
x
a
b
x
x
a
b
x
x
+
=
−
⎡
⎤
δ =
δ
+
+ δ
+ δ
−
=
⎣
⎦
⎡
⎤
Δ
+
Δ
−
Δ
=
+
+
=
⎢
⎥
+
−
⎣
⎦
⎡
⎤
Δ
+ Δ
Δ
−Δ
Δ
=
+
+
⎢
⎥
+
−
⎣
⎦
  
(1.5)
В последнем выражении (1.4) можно заметить бесконечное возрастание погрешности при a ≈ b. Действительно, значение погрешности в (1.5) сколь угодно возрастает при стремлении x → 1.
Рассмотрим пример, где решается задача вида y = 1 – x. Значение x снова получаем приближенно. Допустим, мы нашли приближение x′ к x, содержащее все шесть верных значащих цифр: 
x′ = 0,999997. Тогда y′ = 1 – 0,999997 = 0,000003. Потерянными 
оказались минимум пять верных цифр: предельная абсолютная погрешность для y′ составит Δy′ = 0,0000005, значащих цифр в итоге 
y′ = 0,000003 — одна! Вычислим относительные погрешности, используя формулу (1.3):
 
(
)
(
)
7
6
7
5 10
0,166665
17%;
3 10
5 10
0,0000007
0,000007%.
0,999997
y
y
y
x
−
−
−
Δ
⋅
′
δ
=
=
=
≡
′
⋅
′
⋅
δ
=
=
≡
′
 
Результат позволяет судить о катастрофической потере точности: при изменении входных данных (x) на очень незначительную величину результат (y) изменяется весьма значительно. 
Заметим также, что такой результат получился в том числе из-за 
вычитания близких чисел. Он показывает, что при построении 
вычислительных алгоритмов следует избегать такого вычитания, 
иначе возможна катастрофическая потеря точности. Если избежать этого не удается, то следует видоизменять алгоритм так, чтобы 
исключить такую ситуацию.
Часто при вычислениях с плавающей точкой стараются «набрать», где это возможно, как можно более длинный «хвост» после 
десятичной точки. Однако следует понимать, что при операциях 
сложения и вычитания с приближенными числами (в компьютере 


они приближенные по умолчанию, что следует из конечности разрядной сетки) необходимо, чтобы они обладали одинаковыми абсолютными погрешностями, с одинаковым числом разрядов после десятичной точки, т.е. имели одинаковую длину в байтах. Ни в коем 
случае не следует смешивать вещественные данные с одинарной 
и двойной точностью. Например, складывая 12,345 + 1,2 = 13,545, 
можно провести вычисления, выровняв их к одной наименьшей 
«длине»: 12,3 + 1,2 = 13,5. Отброшенные дополнительные разряды 
не повысили точность вычислений.
При умножении и делении приближенных чисел необходимо 
учитывать, что правило коммутативности здесь не действует. 
При таких операциях количество значащих цифр выравнивается 
по наименьшему из них. Для иллюстрации этого напишем простую 
программу, вычисляющую сумму ряда 
1
(1/
)
N
i
i
y
x
=
= ∑
 сначала от большего к меньшему члену, затем наоборот. Если взять число членов 
ряда достаточно малым, N = 100, вы разницы не заметите. Но если 
значительно увеличить их до N = 10 000 000, то результаты расчета 
вас сильно удивят:
#include <iostream>
#include <cstdlib>
#include <fl oat.h>
#include <iomanip>
using namespace std;
const int N      = 10000000;
const fl oat one  = 1.0f;
fl oat Forward_count();
fl oat Backward_count();
int main()
{
 
fl oat forward, backward;
 
forward  = Forward_count();
 
backward = Backward_count();
            cout<<fi xed<<setprecision(6);
 
cout<<"COMPUTING SUM ORDERS :"<<endl;
 
cout<<"Forward order  : "<<forward<<endl;
 
cout<<"Backward order : "<<backward<<endl;
}
fl oat Forward_count()
{
 
fl oat sum=0.0, var;
 
int i;


for (i=1;i<=N; ++i)sum += one/i;
 
return sum;
}
fl oat Backward_count()
{
 
fl oat sum=0.0, var;
 
int i;
 
for (i=N;i>=1; --i)sum += one/i;
 
return sum;
}
 
COMPUTING SUM ORDERS :
Forward order  : 15.403683
Backward order : 16.686031
Сумма, вычисленная справа налево, оказалась не равной сумме, 
вычисленной в обратном порядке. Если это ваш банковский счет, 
идущий на миллионы, то можно будет представить вашу реакцию, 
вызванную неправильным порядком начисления процентов! Однако вы сохраните ваши накопления, если предложите клерку пересчитать сумму в обратном порядке, по мере возрастания чисел. 
Это, конечно, шутка, и причин для волнения нет: проценты начисляются совсем другим способом. Тем не менее становится очевидным, что при «прямой» операции сложения мы наблюдаем результат сложения как больших, так и очень малых величин. Чем 
больше число членов ряда N мы возьмем, тем больше вероятность 
потери точности результата из-за ограничений разрядной сетки! 
Например, хорошо известен результат прибавления 1 к машинному 
нулю εm, когда 1 + εm = 1. Аналогично для соответствующих a
b
≫ 
результат (a + b) = a. В случае же «обратной» операции сложения 
последовательно накапливается сумма примерно одинаковых, как 
очень малых, так и больших величин, и точность результата ограничена только разрядностью представления данных.
Для применения арифметической операции сложения величин 
с плавающей точкой в компьютере сначала выравниваются их порядки, и только потом производится их сложение. Не уместившиеся знаки после десятичной точки в процессе выравнивания отбрасываются. Это также объясняет, с точки зрения представления 
данных в компьютере, менее точный результат для «прямой» операции сложения.
Рассмотрим еще один пример для операции сложения, который 
сказывается на погрешностях вычислений. Организуем цикл при

Похожие

Доступ онлайн
от 428 ₽
В корзину