parallel.gpu. RandStream.create

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

Синтаксис

s = parallel.gpu.RandStream.create('gentype')
[s1,s2,...] = parallel.gpu.RandStream.create('gentype','NumStreams',n)
[___] = parallel.gpu.RandStream.create('gentype',Name,Value)

Описание

s = parallel.gpu.RandStream.create('gentype') создает один поток случайных чисел, который использует алгоритм генератора случайных чисел, заданный 'gentype'.

Примечание

Функция создания объекта parallel.gpu.RandStream является более краткой альтернативой когда это необходимо, чтобы создать единый поток.

[s1,s2,...] = parallel.gpu.RandStream.create('gentype','NumStreams',n) создает потоки n случайных чисел, которые используют алгоритм генератора случайных чисел, заданный 'gentype'. Потоки независимы в псевдослучайном смысле. Потоки не обязательно независимы от потоков, созданных в других случаях.

пример

[___] = parallel.gpu.RandStream.create('gentype',Name,Value) также задает дополнительные пары Name,Value, чтобы управлять созданием потока, включая количество независимых потоков, чтобы создать.

Примеры

свернуть все

Можно создать несколько независимых потоков случайных чисел, которые имеют тот же генератор, seed и нормальные преобразования. Здесь, несколько независимых потоков создаются и затем используются, чтобы сгенерировать независимые потоки случайных чисел.

Во-первых, создайте потоки как массив ячеек.

streams = parallel.gpu.RandStream.create('Philox', 'NumStreams',3,'Seed',1,'NormalTransform','Inversion', 'CellOutput',true)
streams =

  1×3 cell array

    {1×1 parallel.gpu.RandStream}    {1×1 parallel.gpu.RandStream}    {1×1 parallel.gpu.RandStream}

Теперь, можно использовать каждый поток, чтобы сгенерировать случайные числа. В этом примере вы создаете матрицу, в которой каждая строка сгенерирована от различного потока случайных чисел.

x = zeros(3,10,'gpuArray');
for i=1:3
   x(i,:) = rand(streams{i},1,10);
end
x
x =

    0.5361    0.2319    0.7753    0.2390    0.0036    0.5262    0.8629    0.9974    0.9576    0.0054
    0.3084    0.3396    0.6758    0.5145    0.7909    0.7709    0.3386    0.1168    0.3694    0.0392
    0.5218    0.5625    0.7090    0.5854    0.5067    0.6528    0.5095    0.8777    0.3094    0.1100

Входные параметры

свернуть все

Генератор случайных чисел, заданный как вектор символов или строка для любого допустимого генератора случайных чисел, который поддерживает несколько потоков и подпотоков. Три алгоритма генератора случайных чисел поддерживаются на графическом процессоре.

Ключевое словоГенераторНесколько передают потоком и подпотоковая поддержкаАппроксимированный период в полной точности
'Threefry' или 'Threefry4x64_20'Threefry 4x64 генератор с 20 раундамиДа2514 (2 256 потоков длины 2258)
'Philox' или 'Philox4x32_10'Philox 4x32 генератор с 10 раундамиДа2193 (264 потока длины 2129)
'CombRecursive' или 'mrg32k3a'Объединенный несколько рекурсивный генераторДа2191 (263 потока длины 2127)

Для получения дополнительной информации о различиях между генерацией случайных чисел на графическом процессоре и центральным процессором, смотрите Потоки Случайных чисел на графическом процессоре.

Пример: parallel.gpu.RandStream.create('Philox')

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: parallel.gpu.RandStream.create('Philox','Seed',10) создает один поток случайных чисел с помощью алгоритма генератора 'Philox' с seed 0.

Количество независимых потоков, которые будут созданы, заданные как пара, разделенная запятой, состоящая из 'NumStreams' и неотрицательного целого числа. Потоки независимы в псевдослучайном смысле. Потоки не обязательно независимы от потоков, созданных в других случаях.

Индексы потоков создаются в этом вызове функции, заданном как пара, разделенная запятой, состоящая из 'StreamIndices' и неотрицательного целого числа или вектора неотрицательных целых чисел. Значением по умолчанию является 1:N, где N является значением, заданным с параметром 'NumStreams'.

Значения предусмотрели 'StreamIndices', должно быть меньше чем или равно значению, предусмотрел 'NumStreams'.

Seed случайных чисел для всех потоков, инициализированных, заданных как пара, разделенная запятой, состоящая из 'Seed' и неотрицательного целого числа. Seed задает отправную точку для алгоритма, чтобы сгенерировать случайные числа.

Алгоритм преобразования для нормально распределенных случайных чисел, сгенерированных с помощью randn (RandStream), заданного как пара, разделенная запятой 'NormalTransform' и алгоритм, называет 'BoxMuller' или 'Inversion'. Алгоритм 'BoxMuller' поддерживается для генераторов 'Philox' и 'Threefry. Генератор 'Inversion' поддерживается для генератора 'CombRecursive'. Никакие другие алгоритмы преобразования не поддерживаются на графическом процессоре.

Логический флаг, указывающий, возвратить ли потоковые объекты как элементы массива ячеек, заданного как пара, разделенная запятой 'CellOutput' и логическое значение 0 или 1. Значение по умолчанию является ложным.

Выходные аргументы

свернуть все

Поток случайных чисел для генерации случайных чисел на графическом процессоре, возвращенном как объект parallel.gpu.RandStream.

Советы

  • Если вы создаете несколько потоков путем вызова parallel.gpu.RandStream.create несколько раз, потоки не обязательно независимы друг от друга. Создать независимые потоки из отдельных вызовов parallel.gpu.RandStream.create:

    • Задайте то же множество значений для gentype, 'NumStreams' и 'Seed' в каждом случае.

    • Задайте различное значение для 'StreamIndices', который является между 1 и значением 'NumStreams' в каждом случае.

Представленный в R2011b