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