Потоки случайных чисел на графическом процессоре

По умолчанию генерация случайных чисел функционирует rand, randi, и randn используйте различные настройки генератора для вычислений на графическом процессоре по сравнению с настройками на центральном процессоре. Можно изменить поведение генераторов случайных чисел, чтобы сгенерировать воспроизводимые последовательности случайных чисел на графическом процессоре и центральном процессоре.

В приведенной ниже таблице приведены параметры по умолчанию для графического процессора и центрального процессора на клиентском и рабочем MATLAB.® сеансы:

 ГенераторSeedНормальное Преобразование
Клиентский центральный процессор'Twister' или 'mt19937ar'0'Ziggurat'
Рабочий центральный процессор'Threefry' или 'Threefry4x64_20'0'Inversion'
Графический процессор (на клиентском или рабочем)'Threefry' или 'Threefry4x64_20'0'BoxMuller'

В большинстве случаев не имеет значения, что генератор случайных чисел по умолчанию на графическом процессоре не совпадает с генераторами по умолчанию на клиентском или рабочем центральном процессоре. Однако, если вам нужно воспроизвести одни и те же результаты как на графическом процессоре, так и на центральном процессоре, можно установить генераторы соответственно.

Клиентский центральный процессор и графический процессор

В новом сеансе работы с MATLAB MATLAB генерирует различные последовательности случайных чисел на центральном процессоре и графическом процессоре.

Rc = rand(1,4)
Rc =
    0.8147    0.9058    0.1270    0.9134
Rg = rand(1,4,'gpuArray')
Rg =
    0.3640    0.5421    0.6543    0.7436

Если вам нужно сгенерировать одну и ту же последовательность случайных чисел как на графическом процессоре, так и на центральном процессоре, можно задать соответствие настроек генератора.

На графическом процессоре доступны три алгоритма генератора случайных чисел: 'Threefry', 'Philox', и 'CombRecursive'. Все поддерживаются на центральный процессор. В следующей таблице перечислены алгоритмы для этих генераторов и их свойства.

Ключевое словоГенераторПоддержка нескольких потоков и субпотоковПриблизительный период полной точности
'Threefry' или 'Threefry4x64_20'Трехфазный генератор 4x64 с 20 патронамиДа2514 (2256 потоки длиной 2258)
'Philox' или 'Philox4x32_10'Генератор Philox 4x32 с 10 патронамиДа2193 (264 потоки длиной 2129)
'CombRecursive' или 'mrg32k3a'Объединенный множественный рекурсивный генераторДа2191 (263 потоки длиной 2127)

Вы можете использовать rng и gpurng установить алгоритм генератора и seed на CPU и GPU, соответственно.

sc = rng(1,'Threefry');
Rc = rand(1,4)
Rc =
   0.1404    0.8197    0.1073    0.4131
sg = gpurng(1,'Threefry');
Rg = rand(1,4,'gpuArray')
Rg =
    0.1404    0.8197    0.1073    0.4131

rand и randi теперь сгенерируйте те же последовательности случайных чисел на клиентском центральном процессоре и графическом процессоре.

Рабочий центральный процессор и графический процессор

Параллельный рабочий центральный процессор использует тот же тип генератора случайных чисел по умолчанию и seed, что и клиентский графический процессор и рабочий графический процессор, если таковой имеется. Графический процессор и центральный процессор не имеют общего потока. По умолчанию rand и randi сгенерировать ту же последовательность чисел на графическом процессоре и рабочем центральном процессоре.

Настройки отличаются от настроек на клиентском центральном процессоре. Для получения дополнительной информации смотрите Управление потоками случайных чисел на рабочих

Если вам нужно сгенерировать различные случайные числа на каждом работнике, можно изменить настройки генератора. В этом примере каждый рабочий процесс создает одну и ту же последовательность на своем графическом процессоре и центральном процессоре, но для каждого рабочего процесса генерируются различные последовательности.

p = parpool(2);
spmd
    rng(labindex,'Threefry');
    Rc = rand(1,4)

    gpurng(labindex,'Threefry');
    Rg = rand(1,4,'gpuArray')
end
delete(p)

Нормально распределенные случайные числа

Для нормально распределенных случайных чисел, созданных с помощью randn MATLAB выдает различные результаты на клиентском центральном процессоре, рабочем центральном процессоре и графическом процессоре. Преобразованием равномерных случайных чисел в нормально распределенные случайные числа управляет NormalTransform настройка. Управлять этим на графическом процессоре можно используя parallel.gpu.RandStream.

На клиентском центральном процессоре значение по умолчанию 'NormalTransform' установка 'Ziggurat'. На рабочем центральном процессоре настройкой по умолчанию является 'Inversion'.

Если не указано иное, графический процессор использует 'BoxMuller' преобразование для 'Threefry' и 'Philox' генераторы и 'Inversion' преобразование для 'CombRecursive' генератор.

Можно задать одинаковые генераторы и преобразования на центральном процессоре и графическом процессоре, чтобы получить одинаковые randn последовательности. Единственным преобразованием, поддерживаемым как в центральный процессор, так и в графический процессор, является 'Inversion' преобразование.

sc = RandStream('Threefry','NormalTransform','Inversion','Seed',1);
RandStream.setGlobalStream(sc)

sg = parallel.gpu.RandStream('Threefry','NormalTransform','Inversion','Seed',1);
parallel.gpu.RandStream.setGlobalStream(sg);

Rc = randn(1,4)
Rc =
   -1.0783    0.9144   -1.2412   -0.2196
Rg = randn(1,4,'gpuArray')
Rg =
   -1.0783    0.9144   -1.2412   -0.2196

См. также

| | |

Похожие темы