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

По умолчанию функции генерации случайных чисел 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'Threefry 4x64 генератор с 20 раундамиДа2514 (2 256 потоков длины 2258)
'Philox' или 'Philox4x32_10'Philox 4x32 генератор с 10 раундамиДа2193 (264 потока длины 2129)
'CombRecursive' или 'mrg32k3a'Объединенный несколько рекурсивный генераторДа2191 (263 потока длины 2127)

Можно использовать rng и gpurng, чтобы установить алгоритм генератора и seed на центральном процессоре и графическом процессоре, соответственно.

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

Смотрите также

| | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте