Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Методы Монте-Карло для параллельных вычислений. Учебное пособие
.pdf
+ + + + +
z:
z:
ADDSS xmm0, xmm1
x: x:
y: y:
xmm0
xmm1
xmm0 xmm0
xmm1
xmm0
ADDPS xmm0, xmm1
Рис. 3. Сложение четырех пар чисел с плавающей точкой с одинарной точно-
+ +
z:
PMULDQ xmm0, xmm1
x:
y:
xmm0 (long int[2])
xmm1 (int[4])
xmm0 (int[4])
стью в векторных регистрах в векторном режиме (слева) и в скалярном режиме
(справа)
Рис. 4. Умножение двух пар чисел с плавающей точкой с одинарной точностью
в векторных регистрах без переполнения
же операции нахождения максимального или минимального элемента,
которые определены для вектора значений, а возвращают число. Логично поэтому иметь операции загрузки и выгрузки одного числа из
векторного регистра, о чем упоминалось ранее.
Операции сравнения позволяют проверить поэлементно выполнение соотношения xi◦yi, где символ ◦ означает одно из отношений <, >,
=, >, 6, 6= и т. д. Если соотношение выполняется для некоторой пары
xi, yi, то все биты соответствующего места в регистре устанавливаются
в единицы, а если не выполняется, то в значение 0. По стандарту представления чисел с плавающей точкой IEEE 754, значение из 32 битов,
установленных в единицу, не представляет никакого вещественного числа, а имеет специальное значение не-числа, NaN (Not a Number — англ.).
171

Рассмотрим в качестве примера вычисление следующей функции:
3.14 −0.4 −2.0 0.01 xmm0
−1.0 xmm1−1.0 −1.0 −1.0
< < < <
xmm00 0 NaN 0
xmm21.0 1.0 1.0 1.0
& & &
xmm00 0 01.0
&
+
3.14 −0.4 −2.0 0.01 xmm3
+ + +
3.14 −0.4 −1.0 0.01 xmm0
addps xmm0, xmm3
cmpltps xmm0, xmm1
andps xmm0, xmm2
(
x
yi=
i
xi+ 1 при xi< −1;
Будем считать, что вектор x = (x1, x2, x3, x4) лежит в векторных регистрах xmm0 и xmm3, в регистре xmm1 записан вектор (−1, −1, −1, −1),
а в регистре xmm2 — вектор (1, 1, 1, 1). Диаграмма на рис. 5 показывает необходимую последовательность действий. Только сравнение
при xi> −1,
i = 1, 2, 3, 4. (2)
Рис. 5. Схема вычисления выражения (2)
−2 < −1 оказывается истинным, и в соответствующей части регистра
xmm0 выставляются единицы. Следующая команда, andps, выполняет
побитное И, чтобы сформировать вектор, который затем прибавляется к x: прибавляться будут нули или единицы в соответствии с тем
«шаблоном», который обнаружила команда сравнения чисел с плаваю-
172

щей точкой cmpltps. Промежуточные вычисления остаются в регистре
xmm0, поэтому и необходимо иметь две копии вектора x. Окончательный
результат оказывается также в регистре xmm0.
Компиляторы языков высокого уровня поддерживают векторные
вычисления двумя способами: 1) за счет распространения некоторых
элементарных операций на векторные типы данных и 2) за счет предоставления доступа к инструкциям ассемблера, в том числе через специализированные функции. Рассмотрим в качестве примера работу с
векторными данными в компиляторе gcc (GNU C Compiler) из пакета
GCC (GNU Compiler Collection) с языка Си.
Векторная переменная с точки зрения синтаксиса языка отличается от массива, хотя, с математической точки зрения, они эквивалентны. Напомним, для объявления массивов из четырех вещественных
чисел с плавающей точкой с именами x, y и z используется следующая
запись:
1 f l o a t x[ 4 ] , y [ 4 ] , z [ 4 ] ;
Для создания аналогичных векторных переменных потребуется добавить специальный атрибут к типу:
1 f l o a t __a t t r ibu t e _ _ ( ( v e c tor _ s i z e (1 6 ) ) ) x , y, z ;
Подчеркнем, что теперь x — это не массив, а скалярная переменная.
Атрибут указывает, что переменная x занимает 16 байт и является вектором из 16/sizeof(float) = 4 величин типа float. Теперь для векторного сложения можно написать
1 z = x + y ;
Эта строка по действию эквивалентна циклу
1 for ( i = 0 ; i <4; ++ i )
2 z[ i ] = x [ i] + y[ i ];
но разворачивается в векторную ассемблерную команду addps, сопровождаемую необходимыми командами перемещения данных. Для компиляции исходного текста программы на Си, содержащего векторные
операции, необходимо указать дополнительные опции компилятору, а
именно -msse, -msse2, -msse3, -msse4.1, соответственно тому, какими
расширениями обладает целевой процессор. Заметим, что не все арифметические операции векторизованы для каждого типа данных. Напри-
173

мер, нет операции целочисленного деления. Поэтому при компиляции
кода
1 int __ a ttr i b u te_ _ (( v e c tor_ s i z e (1 6 ) ) ) x , y , z ;
2 z = x / y ;
строка 2 приведет к сообщению об ошибке.
Совсем не обязательно, чтобы векторная переменная содержала
ровно 16 байт. Компилятор постарается сгенерировать код, который, используя имеющиеся команды ассемблера для данного процессора, сделает то, что ожидается. Например, для целочисленного умножения на
процессоре без расширения SSE4 будет сгенерирована последовательность умножений и сдвигов, в то время как при разрешенном SSE4 достаточно одной инструкцией.
Второй путь заключается в использовании специальных функций. В частности, сложение выполняется вызовом функции
1 z = __bu i l tin _ i a32 _ a dd p s ( x , y ) ;
Имя функции состоит из префикса __builtin_ia32 и имени ассемблерной инструкции. Полный список таких функций можно найти в документации к компилятору.
Изучение списка векторных инструкций процессоров Intel и AMD
покажет, что в нем отсутствуют многие важные математические функции, например, тригонометрические. Поэтому производители процессоров выпускают специализированные библиотеки для векторного вычисления математических функций.
Осталось только познакомиться с удобным способом обращения
к отдельным элементам векторной переменной. Менее изящный способ
заключается в использовании указателей и приведении типов. Рекомендуемый в руководствах и несомненно более изящный способ состоит в
использовании такой конструкции языка Си, как объединение, union
(см. программу ниже).
Программа 1. Организация доступа к элементам векторной переменной
1 type d e f v4 s f float __ a tt r i b ute _ _
2 (( v ect o r _ siz e ( 1 6)));
3 type d e f f4vec u n ion {
4 v4sf v ;
5 float f [4];
6 } ;
7
174

8 f 4 v e c x;
9 // и н ици а л и за ц и я век т о р а
10 x. f [0] = 1 . 0 ; x .f [ 1 ] = -3.2;
11 x. f [2] = 0 . 4 ; x .f [ 3 ] = 0. 2 ;
12 // в е к тор н о е по э л е мен т н о е у множ е н и е
13 x. v = x . v * x . v;
14 // в ы ч исл я е м квад р а т длины в ектор а
15 f l o a t re s = x . f [ 0 ] + x . f [ 1 ] + x . f [ 2 ] + x . f [3];
Дальнейшие примеры использования векторных вычислений рассматриваются в разделах 2.3, 2.5.

Обзор источников
Глава 1
Методы параллельных вычислений подробно излагаются в книгах [2, 3, 4, 5]. Различным технологиям организации параллельных вычислений посвящены работы [27, 46, 49].
Глава 2
Алгоритмам моделирования величин с равномерным распределением посвящено множество работ [22]. Обзор генераторов псевдослучайных чисел для задач защиты информации и криптографии можно
найти в книге [18]. Метод вихря Мерсена предложен в работе [48], которой следует наше изложение. Обсуждение длины периода и метод параметризации цикла для генератора Фибоначчи опирается на работу [47].
Изложение вопросов реализации некоторых алгоритмов для векторных
и параллельных компьютеров основывается на работах [41, 50, 53]. Применения метода исключения для дискретных случайных величин можно найти, например, в [40].
Глава 3
Общие методы генерирования случайных величин последовательной программой излагаются в руководствах [8, 11, 22, 36, 40] и др.
Методы и примеры использования марковских цепей для моделирования многомерных распределений собраны в [36], которая использована
при написании главы. Методы векторизации генерирования нормального распределения следуют работам [38, 39].
Глава 4
Вычисление определенных интегралов методом Монте-Карло изложено во многих книгах, например, в [12, 30]. Вопросы организации
параллельных вычислений, в частности оценка среднего значения величины при ограничениях на время работы вычислительных устройств,
рассматривались в работах [26, 42, 43, 51].
Глава 5
Интегральные преставления решений уравнений в обыкновенных
или частных производных гиперболического типа довольно редко рассматриваются в литературе. Излагаемые методы были предложены в
работах [15, 16, 17]. За примерами применения винеровских процессов
176

для решения уравнений в частных производных читателю следует обратиться к [9, 13, 29].
Глава 6
Более подробно с принципами создания имитационных моделей
можно познакомиться с монографиях [1, 31]. Кибернетический подход
к математическому моделированию сложных систем развит в работах
[25, 33]. Вопросы статистического оценивания характеристик систем
массового обслуживания излагаются также в [7, 19]. Системы с разделением времени аналитическими методами изучали многие авторы
[14, 21, 35]. Отметим дополнительно обзор [28], посвященный использованию зависимых испытаний для оптимизации стохастических управляющих систем.

Список алгоритмов
Линейный конгруэнтный генератор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Обратный конгруэнтный генератор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
I. Первый векторный линейный конгруэнтный генератор с единым
набором параметров .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
II. Второй векторный линейный конгруэнтный генератор с единым
надзором параметров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
III. Второй векторный линейный конгруэнтный генератор с нескольки-
ми наборами параметров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Обобщенный генератор Фибоначчи с запаздыванием .. . . . . . . . . . . . . . . 30
IV. Первый векторный обобщенный генератор Фибоначчи с запаздыва-
нием . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
V. Второй векторный обобщенный генератор Фибоначчи с запаздыва-
нием . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
VI. Алгоритм перетасовывания для двух псевдослучайных последова-
тельностей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
VII. Алгоритм перетасовывания для одной последовательности .. . . .37
«Вихрь Мерсенна» .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Метод непересекающихся отрезков для получения независимых пото-
ков псевдослучайных чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Метод подпоследовательностей для получения независимых потоков
псевдослучайных чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Метод параметризации итерационной процедуры для получения неза-
висимых потоков псевдослучайных чисел .. . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Явный обратный конгруэнтный генератор псевдослучайных чисел . 42
Метод параметризации циклов для получения независимых потоков
псевдослучайных чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
VIII. Моделирование дискретной случайной величины . . . . . . . . . . . . . . 47
IX. Моделирование цепи Маркова с конечным числом состояний . . . 49
X. Метод исключения для непрерывного распределения вероятно-
стей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
XI. Метод суперпозиции для генерации величин с распределением вида
смеси . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
XII. Комбинированный метод суперпозиции и исключения . . . . . . . . . . 58
Метод условных распределений для генерирования случайного векто-
ра . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
XIII. Метод исключения для генерирования значений случайного
вектора .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
178

Метод функциональных преобразований для генерирования случайно-
го вектора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
XIV. Моделирование вектора из независимых экспоненциальных слу-
чайных величин . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
XV. Моделирование вектора из нормальных величин . . . . . . . . . . . . . . . 66
XVI. Ускоренное моделирование вектора нормальных величин . . . . . 68
Метод цепей Маркова для генерирования случайного вектора . . . . . . 70
Геометрический метод Монте-Карло для приближенного вычисления
интегралов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Метод математического ожидания для приближенного вычисления
интегралов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Метод выделения главной для уменьшения дисперсии при приближен-
ном вычислении интегралов .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Метод интегрирования по части области для уменьшения дисперсии
при приближенном вычислении интегралов . . . . . . . . . . . . . . . . . . . . . . . . . 83
Метод существенной выборки для уменьшения дисперсии при прибли-
женном вычислении интегралов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Метод выборки по группам для уменьшения дисперсии при прибли-
женном вычислении интегралов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Метод выборки по группам на неоднородных параллельных вычисли-
тельных устройствах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Метод получения несмещенной оценки математического ожидания
при параллельных вычислениях в условиях ограниченного времени
моделирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Вычисление кратного интеграла с помощью библиотеки OpenMP . . 96
Вычисление кратного интеграла с помощью технологии MPI . . . . . . . 98
XVII. Моделирование однородного пуассоновского процесса . . . . . . . 104
Оценка решения обыкновенного дифференциального уравнения гипер-
болического типа по методу Монте-Карло . . . . . . . . . . . . . . . . . . . . . . . . . . 112
XVIII. Моделирование марковского процесса с дискретным множе-
ством состояний .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .119
Метод дискретных событий для имитации сложной управляющей
системы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
XIX. Моделирование процесса обслуживания с разделением времени
и переналадками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
XX. Моделирование распространения зондирующего излучения в
многослойных биологических тканях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

Предметный указатель
MPI
вычисление кратного интеграла,
98
запуск программы, 100
коммуникатор, 19
компиляция программы, 100
передача
блокирующая, 20
неблокирующая, 20
пример использования, 156
система передачи сообщений, 19
технология, 98
OpenMP, 156
сложение векторов, 16
технология, 15
архитектура SIMD, 168
бинарный метод возведения в
степень, 40
биологическая ткань, 148, 149
рассеяние в, 153
биомедицинская диагностика, 147
оптический метод, 147
томография, 147
биоткань, 147
вариация функции, 81
векторная инструкция
арифметическая, 170
логическая, 170
операции сравнения, 171
перемещения данных, 169
векторные вычисления, 168
поддержка в компиляторах,
173–175
векторный регистр
xmm0 – xmm7, 168
128-битный, 168
компьютера Cray-1, 168
упаковка чисел, 169
вероятность
доверительная, 75, 81
условная, 55
выбор из памяти
без выравнивания, 170
с выравниванием, 170
выборочная
функция распределения, 80
вычисление кратного интеграла
пример, 93
вычислительный кластер, 19, 155
генератор
«вихрь Мерсенна», 38, 44
период, 39
Фибоначчи, 30, 31, 43
период, 30–31
удвоение периода, 31
библиотека AMD
Library, 44
библиотека Intel
R
Core Math
R
Math Kernel
Library, 44
библиотека RngStreams(), 45
библиотека SPRNG, 44
конгруэнтный
линейный, 25, 41, 42, 44
мультипликативный, 25, 40
обратный, 26
период, 25
решетчатая структура, 27
явный обратный, 42
границы доверительные, 76
датчик случайных чисел физический,
21
дискретный случайный вектор, 70
дисперсия, 66
наименьшее значение, 86
задача Дирихле, 56
180
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
