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

По умолчанию генерация случайных чисел функционирует randrandi, и 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

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

| | |

Похожие темы