Глава 1. Параллельные вычисления при численном решении уравнений математической физики.
Параллельные вычисления — способ организации компьютерных вычислений, при котором программы разрабатываются как набор взаимодействующих вычислительных процессов, работающих параллельно (одновременно). Термин охватывает совокупность вопросов параллелизма в программировании, а также создание эффективно действующих аппаратных реализаций. Теория параллельных вычислений составляет раздел прикладной теории алгоритмов[1].
Существуют различные способы реализации параллельных вычислений. Например, каждый вычислительный процесс может быть реализован в виде процесса операционной системы, либо же вычислительные процессы могут представлять собой набор потоков выполнения внутри одного процесса ОС. Параллельные программы могут физически исполняться либо последовательно на единственном процессоре — перемежая по очереди шаги выполнения каждого вычислительного процесса, либо параллельно — выделяя каждому вычислительному процессу один или несколько процессоров (находящихся рядом или распределённых в компьютерную сеть).
Основная сложность при проектировании параллельных программ — обеспечить правильную последовательность взаимодействий между различными вычислительными процессами, а также координацию ресурсов, разделяемых между процессами.
В некоторых параллельных системах программирования передача данных между компонентами скрыта от программиста (например, с помощью механизма обещаний), тогда как в других она должна указываться явно. Явные взаимодействия могут быть разделены на два типа:
Взаимодействие через разделяемую память: на каждом процессоре мультипроцессорной системы запускается поток исполнения, который принадлежит одному процессу. Потоки обмениваются данными через общий для данного процесса участок памяти[2]. Количество потоков соответствует количеству процессоров. Потоки создаются либо средствами языка (например, в Java или C#, C++ (начиная с C++11), C (начиная с C11)), либо с помощью библиотек явно (например, в С/C++ с помощью PThreads), либо декларативно (например, с помощью библиотеки OpenMP), или автоматически встроенными средствами компилятора (например, High Performance Fortran). Данный вид параллельного программирования обычно требует какой-то формы захвата управления (мьютексы, семафоры, мониторы) для координации потоков между собой.
Рассмотрим пример, в котором одномерный массив из трех типов частиц, взаимодействующих при помощи жестких пружин, описы- вается системой дифференциальных уравнений
m1u¨n
= −k(vn
+ wn−1
— 2un
) − f (1)(t),
n
m2v¨n
= −k(wn
+ un
— 2vn
) − f (2)(t),
(1)
n
m3w¨n
= −k(u
n+1
+ vn
— 2wn
) − f (3)(t),
n
n
n
n
представляющей собой результат применения второго закона Нью- тона, где un, vn, wn суть вертикальные смещения частиц, m1, m2, m3 их массы, k является общей жесткостью пружин, f (1), f (2), f (3)
± ± ±∞
суть внешние силы и n = 0 , 1 , 2 , ..., . Происхождение этой
системы уравнений можно проиллюстрировать с помощью аппрок- симации конечными разностями хорошо известного уравнения ко- лебаний струны (см. [6], [7])
ρu¨ = Tuxx + F ( t, x) ,
T
mu¨n =
h (un+1 + un−1 − 2un) + fn(t), m = ρh, fn(t) = hF (t, xn),
un+1−un − un−un−1
−
Мы предполагаем, что временная зависимость внешних сил име- ет вид гармонической функции exp( iωt) с частотой ω. Пользуясь трансляционной инвариантностью предположим, что
n
f (j)( t) = fj exp(− iωt + iKLn) ,
где j = 1 , 2 , 3, K является «квазиимпульсомk - свободным парамет- ром (− π/L < K < π/L), L - период массива. Мы ищем решение
Эту систему можно решить методом Крамера
Do'stlaringiz bilan baham: |