По умолчанию генерация случайных чисел функционирует 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
gpurng
| parallel.gpu.RandStream
| RandStream
| rng