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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
+ + + + +
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]