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