Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы Монте-Карло для параллельных вычислений. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
5 n /= 2; 6 if (0 == n ) b reak ; 7 a = a * a % m; 8 if (0 != n % 2) ans = a * ans % m ;
9 }; 10 retur n an s ; 11 };
В общем случае, с математической точки зрения, каждый из L вычислительных процессов работает с псевдослучайной последователь­ностью, имеющей в качестве параметра начало последовательности.
Метод подпоследовательностей. Этот метод применим в тех же предположениях, что и метод непересекающихся отрезков: требуется снабдить каждый из L вычислительных процессов набором из N псев­дослучайных чисел, и имеется генератор с периодом d > L · N . Однако по сравнению с методом непересекающихся отрезков, данный метод воз­можно использовать и когда заранее неизвестно требуемое количество N псевдослучайных чисел для каждого из вычислительных процессов. Тогда каждому вычислительному процессу выделяется ровно одна из подпоследовательностей
{U1, U
L+1
, U
, . . .}; {U2, U
2L+1
L+2
, U
, . . .}; . . .
2L+2
. . . ; {UL, U2L, U3L, . . .}.
Например, для линейного конгруэнтного генератора можно воспользо­ваться формулой (2.2).
Идея выделения подпоследовательностей легко модифицируется под запросы конкретной задачи. Предположим, что для получения од­ного значения случайной величины X используются два псевдослучай­ных числа. Последовательная программа будет работать с парами чисел
(U1, U2), (U3, U4), . . . .
Чтобы параллельные вычислительные процессы работали с точными подпоследовательностями исходной последовательности, следует вос­пользоваться следующим разбиением:
{U1, U2, U
2L+1
, U
2L+2
. . . ; {U
, . . .}; {U3, U4, U
2L−1
, U2L, U
, U4L, . . .}.
4L−1
2L+3
, U
, . . .}; . . .
2L+4
41
В любом случае при использовании данного метода надо про­верять, что подпоследовательности в результате снова удовлетворяют таким требованиям, как равномерность распределения, некоррелиро­ванность, и т. д.
Параметризация итерационной процедуры. Многие генераторы псевдослучайных чисел содержат набор параметров. Исходя из этого, возможно каждому вычислительному процессу присвоить свои значе­ния параметров. Таким образом, разные вычислительные процессы бу­дут работать с принципиально различными псевдослучайными после­довательностями, а не с различными частями одной и той же последо­вательности. Преимуществом такого подхода является то, что не проис­ходит уменьшения периода порождаемой последовательности в L раз.
Рассмотрим несколько примеров параметризации распространен­ных генераторов. Начнем с линейного конгруэнтного генератора. Пара­метризация приводит к системе рекуррентных соотношений
X
n+1, j
= ajX
+ cjmod m, n = 0, 1, . . . ; l = 1, 2, . . . , L.
n, j
Здесь дополнительный индекс j относится к j-му потоку псевдослучай­ных чисел. Известны следующие рекомендации. 1) При модуле m = 2 исследователями были изучены генераторы с aj≡ a, и попарно вза- имно простыми аддитивными константами cj. В частности, рекоменду­ется выбирать в качестве констант последовательные простые числа, не превосходящиеpm/2. При такой параметризации статистическая корреляция между разными потоками оказывается допустимо малой.
2) Модуль m является простым числом, возможно, близким к числу ви­да 2p. В этом случае предлагается использовать в качестве параметра
`
сомножитель aj. В частности, полагают aj= a
j
, где `j— j-е целое
число, взаимно простое с m − 1.
В качестве второго примера рассмотрим явный обратный конгру- энтный генератор (explicit inverse congruent generator, EICG)
Xn= an + b mod m, n = 1, 2, . . . . (2.7)
Этот генератор дает явную формулу для вычисления всех членов по­следовательности вместо привычных уже нам рекуррентных формул. К нему, очевидно, применимы все приведенные ранее методы. Рассмот­рим следующую параметризацию генератора (2.7):
X
= ajn + cjmod m, n = 1, 2, . . . ; j = 1, 2, . . . , N. (2.8)
n, j
p
42
Известно, что хорошие статистические свойства векторов
(X
, X
n, 1
n, 2
, . . . , X
n, L
)
имеют место, если все числа вида cjajразличны. В частности, можно положить aj≡ a, cj= a(j − 1) + c mod m, тогда
cjaj= (j − 1) + ca mod m.
Реализация многопоточной версии приведена в Программе 4.1.
Параметризация циклов. Часто оказывается, что максимально допустимая длина цикла некоторого генератора существенно меньше числа возможных состояний «внутренней памяти» генератора. Это мо­жет означать, что все возможные состояния внутренней памяти об­разуют несообщающиеся классы циклических состояний. Поэтому по­является возможность выделять каждому вычислительному процессу свою уникальную псевдослучайную последовательность максимально возможного периода.
Обратимся к генератору, задаваемому рекуррентным соотноше­нием (2.5). Для его работы необходимо хранить j значений X . . . , X
. Пусть каждое значение занимает e бит. Тогда общее число
n−j
n−1
, X
n−2
возможных состояний генератора равно 2ej−1 (исключается нулевое со- стояние). Полный период дают начальные состояния, содержащие хотя бы одно нечетное число. Итак, остается всего (2j− 1)2
j(e−1)
допусти-
мых состояний генератора. А поскольку длина одного периода равна
e−1(2j
2
− 1), то это общее число возможных циклов есть
,
(2j− 1)2
(2j− 1)2
j(e−1)
e−1
(j−1)(e−1)
= 2
.
Таким образом, для получения параллельных потоков псевдослучайных чисел с помощью генераторов вида (2.5) необходимо уметь выбирать на­чальные значения, принадлежащие различным циклическим классам. Биты двоичного разложения числа x обозначим b0, b1, .. . , b что x = (b
e−1be−2
дослучайных чисел X0, X1, .. . , X
. . . b1b0)2. Можно рассматривать биты первых j псев-
как двумерную матрицу. Если
j−1
e−1
, так
обозначать символом ∗ биты, которые могут заполняться произвольным образом, то такая матрица выглядит примерно следующим образом:
43
b
e−1be−2
∗ ∗ . . . 0 0 X 0 ∗ . . . ∗ 0 X
.
.
.
∗ 0 . . . ∗ 0 X ∗ ∗ . . . ∗ 1 X
.
.
.
. . . b1b
.
.
.
.
.
.
0
e−1
e−2
.
.
.
.
.
.
1
0
Точный алгоритм вычисления мест, на которых должны стоять нули, приведен в [47]. При этом гарантируется, что каждое заполнение этой битовой матрицы принадлежит отдельному периоду генератора.
2.9. Некоторые реализации генераторов для параллельных вычислений
Генераторы псевдослучайных чисел для параллельных вычисле­ний реализованы в различных библиотеках — как специализированных, так и общего назначения.
R
Математическая библиотека Intel
Math Kernel Library1включа­ет набор векторных генераторов случайных чисел, в том числе конгру­энтные генераторы, вихрь Мерсенна. Также эта библиотека содержит векторизованные функции для генерации случайных величин с основ­ными дискретными и непрерывными законами распределения.
R
В библиотеку AMD
Core Math Library2включены векторизо­ванные реализации нескольких генераторов псевдослучайных чисел со значениями в полуинтервале (0, 1] и генераторов псевдослучайных чи­сел из основных дискретных и непрерывных законов распределения. Также есть поддержка независимых потоков псевдослучайных чисел.
Специализированная библиотека SPRNG3предназначена для по­лучения независимых потоков псевдослучайных чисел в параллельных программах на системах с разделенной памятью. Разработчики спро­ектировали библиотеку для совместного использования с технологи­ей MPI. Предполагается, что каждый процессор поддерживает толь­ко один поток псевдослучайных чисел. Набор генераторов включает линейный конгруэнтный генератор, мультипликативный генератор Фи­боначчи с запаздыванием и др. В основе разделения на независимые
1
http://software.intel.com/ru-ru/articles/intel-mkl/
2
http://developer.amd.com/libraries/acml/pages/default.aspx
3
http://sprng.cs.fsu.edu/
44
потоки чисел здесь лежит принцип параметризации генераторов.
Библиотека RngStreams4может быть использована как совмест­но с MPI, так и в многопоточных приложениях с OpenMP. В основе создания нескольких потоков здесь лежит разделение на подпоследова­тельности.
Все рассмотренные выше библиотеки ориентированы на включе­ние в программы на языках Fortan и C/C++. Существуют также биб­лиотеки для других языков программирования. Например, рассмотрен­ная выше библиотека RngStreams существует также в версиях, написан­ных на языках Java и C#.
4
http://www.iro.umontreal.ca/˜lecuyer/myftp/streams00/
Глава 3. Моделирование случайных величин и векторов с произвольным законом распределения
Методы Монте-Карло основываются на порождении выборки зна­чений случайной величины X с заданным законом распределения. При этом сам закон распределения может быть дан непосредственно, на­пример, в виде функции распределения FX(x) = P({X < x}). Также случайная величина может быть задана конструктивно в виде некото­рой функции от других случайных величин Y , Z, . . . , для которых известен совместный закон распределения. Для моделирования случай­ной величины и векторов с заданным законом распределения наиболее часто встречающимся приемом является функциональное преобразова­ние случайной величины U с равномерным законом распределения на (0, 1). В настоящем разделе приводятся некоторые распространенные алгоритмы моделирования случайных величин и случайных векторов. Обсуждается возможность применения векторных вычислений.
3.1. Моделирование дискретных случайных величин
Рассмотрим сначала моделирование дискретной случайной вели­чины X с конечным числом значений a1, a2, . . . , aK, K < ∞. Пусть p — вероятность значения aj, j = 1, 2, . . . , K. Разобьем отрезок [0, 1] на полуинтервалы ∆1= [0, p1), ∆2= [p1, p1+p2), . . ., ∆K= [p1+p2+. . . +
+ p
распределением на (0, 1). Найдем интервал ∆j, которому принадлежит число u. Тогда в качестве значения случайной величины X выберем aj.
дикатор IA= IA(ω) = I(A) события A ⊂ Ω. По определению, IAпри­нимает значение 1 при ω ∈ A и значение 0 при ω 6∈ A. Говорят, что случайная величина IAимеет распределение Бернулли с параметром p = P(A). Предполагая, что вероятность p задана, сможем «разыграть» значение случайной величины IAследующим образом. Получим значе­ние u случайной величины U. Если u < p, положим IA= 1, иначе положим IA= 0.
K = ∞; в этом случае число интервалов ∆jтакже бесконечно счетно. Для оценки эффективности этого алгоритма будем считать, что провер­ка принадлежности точки u одному подынтервалу ∆jтребует единицы
, 1]. Пусть u — значение случайной величины U с равномерным
K−1
Простейшим примером такой случайной величины является ин-
Если число значений a1, a2, . . . бесконечно счетно, будем писать
j
46
времени. Тогда легко увидеть, что математическое ожидание числа про­верок равно
K
X
1 +
jpj.
j=1
Среднее число проверок можно уменьшить, если перенумеровать зна-
чения a1, a2, . . . , в порядке убывания вероятностей p1, p2, . . . .
Если число K конечно и невелико, границы интервалов можно хранить в массиве. В противном случае границы интервалов необходимо вычислять каждый раз, когда проверяется новое значение u. Для кон­кретных распределений вычисление вероятностей pjоказывается воз­можным провести по рекуррентным схемам. Обозначим kj= pj/p
j−1
отношение вероятностей. Алгоритм моделирования дискретной случай­ной величины примет следующий вид.
Алгоритм VIII
Моделирование дискретной случайной величины
Шаг 1. Получить значение u случайной величины с равномер- ным распределением на (0, 1). Положить j = 1, вычислить p1.
Шаг 2. Если u < pj, завершить работу, возвратить значение aj.
Шаг 3. Если u > pj, то присвоить u значение (u − pj), затем
увеличить j на 1, вычислить pj= kjp
и вернуться к шагу 2.
j−1
Рассмотрим моделирование случайных величин с типовыми дис­кретными распределениями вероятностей.
Пуассоновское распределение с параметром λ. Для j = 1, 2, . . . имеем:
p0= e−λ, pj=
j
λ
e−λ, kj=
j!
p
p
j
j−1
λ
=
.
j
Продемонстрируем работу этого алгоритма на конкретном числовом примере. Пусть для определенности λ = 1 и на первом шаге алгоритма получили u = 0,8759. Поскольку p0= e−1≈ 0,3679 и u > p0(шаг 2), по­ложим u = 0,8759−0,3679 = 0,508 и вычислим p1: p1= p0·(1/1) ≈ 0,3679 (шаг 3). Поскольку u > p1, вычисляем: u = 0,508 − 0,3679 = 0,1401, p2= p1· (1/2) ≈ 0,1839. Теперь u < p2и значение случайной величины X оказалось равным 2. Трудоемкость алгоритма находится по формуле
∞
j
X
λ
1 +
j=0
e−λ= 1 + λ.
j
j!
47
Другой алгоритм моделирования пуассоновской случайной вели­чины заключается в следующем. Пусть величины U0, U1, . . . незави­симы и одинаково распределены по равномерному закону на интервале (0, 1). Введем случайную величину
X = min{n : U0U1···Un< e−λ}.
Тогда величина X распределена по закону Пуассона с параметром λ. В среднем в этом методе придется генерировать λ + 1 случайную вели­чину с равномерным распределением.
Заметим, что ни один из рассмотренных алгортимов не преобра­зуется непосредственно в векторную форму.
Геометрическое распределение с параметром q. Вероятности име­ют следующий вид:
pj= (1 −q)jq, j = 0, 1, . . . ,
откуда kj= 1 −q. Трудоемкость алгоритма равна
∞
X
1 +
jq(1 −q)j= q−1.
j=0
Другой алгоритм моделирования основывается на наблюдении, что случайная величинаln U / ln(1 −q)имеет геометрическое распре­деление с параметром q. Здесь [·] обозначает целую часть числа. Хотя накладные расходы на вычисление логарифма могут сделать такой спо­соб медленным, этот способ допускает очевидную векторизацию: сразу для вектора величин U1, U2, . . . , Urможно вычислить вектор из лога­рифмов с использованием специальной библиотеки векторных матема­тических функций.
Биномиальное распределение с параметрами q, n. Вероятности имеют вид
pj= C
j
qj(1 −q)
n
j
для j = 0, 1, . . . , n.
Отсюда
kj= q(n − j + 1) × ((1 −q)j)−1.
Трудоемкость алгортима равна
n
X
1 +
C
j=0
j
qj(1 −q)j= 1 + nq.
n
48
Отрицательно-биномиальное распределение с параметрами q, m.
Вероятности определяются для 0 < q < 1 и m > 0 и имеют вид
pj=
где
Γ(j + m)
Γ(m)Γ(j + 1)
Γ(a) =
qm(1 −q)j, j = 0, 1, . . . ,
∞
Z
a−1e−x
x
0
dx
— гамма-функция Эйлера. Из вида вероятностей получаем
kj= (m + j − 1)(1 −q)j−1.
Трудоемкость алгоритма равна
∞
X
1 +
j=0
Γ(j + m)
j
Γ(m)Γ(j + 1)
qm(1 −q)j= 1 + mq−1.
Алгоритм моделирования дискретных случайных величин лег-
ко переносится на случай моделирования однородной марковской цепи {Xn; n = 0, 1, . . .} с конечным числом состояний a1, a2, . . . , aK.
Алгоритм IX
Моделирование цепи Маркова с конечным числом состояний
Пусть начальное распределение
(0)
p
= P({X0= aj}), j = 1, 2, . . . , K
j
и переходные вероятности
p
= P({X
j,l
= al}|{Xn= aj}), j, l = 1, 2, . . . , K
n+1
заданы. Тогда значение X0выбирается из распределения вероятностей
(0)
(0)
q
, q
1
, . . . , q
2
события {Xn= j} значение X ятностей q
j,1
(0)
; дальше для всякого n = 0, 1, .. . при наступлении
, q
K
, . . . , q
j,2
j,K
.
выбирается из распределения веро-
n+1
49
Приведем пример, ставший уже классическим. Пусть в ограни­ченной связной области D двумерной плоскости xOy с простой грани­цей Γ задано дифференциальное уравнение в частных производных
∂2u(x, y)
2
∂x
∂2u(x, y)
+
∂y
= f(x, y) (3.1)
2
для неизвестной функции u(x, y) с граничными условиями
u(x, y) = g(x, y), (x, y) ∈ Γ. (3.2)
Если f(x, y) = 0 для всех (x, y) ∈ D, то имеем уравнение Ла­пласа, а при f(x, y) 6= 0 — уравнение Пуассона. Для приближенного решения уравнения (3.1) с граничным условием (3.2) выбирают пара­метр h («шаг сетки») и полагают x = kh, y = lh, k, l — целые числа. Точки (kh, lh) называются узлами сетки. Узел (kh, lh) ∈ D∪Γ называ­ется внутренним, если узлы (kh ± h, lh) и (kh, lh ±h) также принадле­жат G, в противном случае узел называется граничным. Заметим, что граничные узлы не обязаны принадлежать границе Γ (рис. 3.1). Обозна­чим u
g
k,l
= u(kh, lh). Для внутренних узлов положим f
k,l
= f (kh, lh).
k,l
= g(ˆxk, ˆyl), где точка ( ˆxk, ˆyl) ∈ Γ — ближайшая точка границы Γ к
граничному узлу (kh, lh). Заменяя входящие в уравнение (3.1) частные производные вторыми разделенными разностями, получаем разностное уравнение
1
u
k,l
(u
=
4
Дополним уравнения (3.3) равенствами u
k−1,l
+ u
k+1,l
+ u
k,l−1
k,l
+ u
= g
− h2f
k,l+1
для граничных узлов.
k,l
). (3.3)
k,l
Системе уравнений (3.3) можно придать следующую вероятност­ную интерпретацию. Определим цепь Маркова {Xn; n = 0, 1, . . .} так, что возможные значения случайной величины Xnсуть узлы сетки, а из узла (kh, lh) с равной вероятностью 1/4 возможен переход в любой из соседних узлов (kh − k, lh), (kh + h, lh), (kh, lh − h), (kh, lh + h). В качестве значения величины X0выберем фиксированный внутренний узел (kh, lh). Определим случайную величину N как номер шага, на котором происходит первое попадание в какой-нибудь граничный узел. Тогда величины
¯u
= Mg(XN)−
k, l
2
h
f(X0)+f (X1)+. . .+f (X
4
N −1
 
))
{X0= (kh, lh)}
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]