exponenta event banner

parallel.gpu. RandStream.create

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

Описание

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 пар для управления созданием потока, включая число создаваемых независимых потоков.

Примеры

свернуть все

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

Сначала создайте потоки как массив ячеек.

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

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

свернуть все

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

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

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

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

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

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

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

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

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

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

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

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

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

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

свернуть все

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

Совет

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

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

    • Укажите другое значение для 'StreamIndices' то есть между 1 и 'NumStreams' значение в каждом случае.

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