exponenta event banner

parallel.gpu. RandStream

Поток случайных чисел на GPU

Описание

Использовать parallel.gpu.RandStream для управления потоком случайных чисел глобального GPU и создания нескольких независимых потоков на GPU. При генерации случайных чисел на GPU эти числа извлекаются из потока случайных чисел GPU. Этот поток отличается от случайного потока клиентского сеанса MATLAB ® на ЦП .

Для создания случайных чисел на GPU используйте функции генератора случайных чисел rand, randi, и randn с gpuArrays. По умолчанию эти функции извлекают числа из глобального потока случайных чисел GPU. Чтобы использовать другой поток, следуйте синтаксисам, описанным в разделе Функции объекта. Если используется поток случайных чисел GPU, результаты возвращаются как gpuArray.

Создание

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

Описание

пример

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

пример

s = parallel.gpu.RandStream(gentype,Name,Value) также указывает один или несколько необязательных Name,Value пар для управления свойствами потока.

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

развернуть все

Алгоритм генератора случайных чисел, заданный как один из следующих трех алгоритмов генератора случайных чисел, поддерживаемых графическим процессором.

Ключевое словоГенераторПоддержка нескольких потоков и субпотоковПриблизительный период с полной точностью
'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.

Этот аргумент задает Type собственность.

Свойства

развернуть все

Это свойство доступно только для чтения.

Алгоритм генератора, используемый потоком, указанным как 'Threefry4x64_20', 'Philox4x32_10', или 'mrg32k3a'.

Задать это свойство с помощью gentype аргумент при создании потока.

Типы данных: char

Это свойство доступно только для чтения.

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

Задайте это свойство как пару имя-значение при создании потока.

Это свойство доступно только для чтения.

Число потоков в группе, в которой был создан текущий поток, указанное как положительное целое число. Создание нескольких потоков одновременно с помощью функции parallel.gpu.RandStream.create.

Индекс потока текущего потока, заданный как положительное целое число. Индекс потока определяет отдельные потоки при создании нескольких потоков одновременно с помощью функции parallel.gpu.RandStream.create.

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

Сохранение и восстановление внутреннего состояния генератора с помощью State свойство позволяет воспроизвести последовательность случайных чисел. При установке этого свойства, значения присваивается s.State должно быть значением, считанным из s.State ранее. Использовать reset чтобы вернуть поток в предсказуемое состояние без предварительного чтения из State собственность.

Алгоритм нормального преобразования, указанный как 'BoxMuller или 'Inversion'.

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

Типы данных: char

Это свойство доступно только для чтения.

Антитетические значения, указанные как false или 0. Это свойство указывает, S генерирует антитетические псевдослучайные значения, то есть обычные значения, вычитаемые из 1 для однородных значений.

Это свойство всегда 0. Поток не генерирует антитетические значения. Изменение этого свойства невозможно.

Типы данных: logical

Это свойство доступно только для чтения.

Генерация полной точности, указанная как true или 1. Это свойство указывает, генерирует ли поток случайных чисел значения с полной точностью. Два случайных числа расходуются, чтобы гарантировать, что все биты двойника установлены.

Это свойство всегда 1. Изменение этого свойства невозможно.

Типы данных: logical

Функции объекта

parallel.gpu.RandStream.createСоздание независимых потоков случайных чисел на GPU
parallel.gpu.RandStream.listАлгоритмы генератора случайных чисел на GPU
parallel.gpu.RandStream.getGlobalStreamТекущий поток случайных чисел глобального графического процессора
parallel.gpu.RandStream.setGlobalStreamУстановка глобального потока случайных чисел GPU
reset (RandStream)Сброс потока случайных чисел

По умолчанию при создании случайных чисел на GPU с использованием функций генерации случайных чисел, таких как randслучайные числа извлекаются из глобального потока случайных чисел на GPU. Чтобы указать другой поток, создайте parallel.gpu.RandStream и передать его в качестве первого входного аргумента. Например, создайте вектор случайных чисел 4 на 1, используя алгоритм генератора Филокса.

s = parallel.gpu.RandStream('Philox');
r = rand(s,4,1);

Эти функции принимают parallel.gpu.RandStream объект и генерация случайных чисел на GPU:

randРавномерно распределенные случайные числа

Поддерживаемые синтаксисы, где s является parallel.gpu.RandStream объект:

X = rand(s)
X = rand(s,n)
X = rand(s,sz1,...,szN)
X = rand(s,sz)
X = rand(s,typename)
Дополнительные сведения о других входных аргументах см. в разделе rand, randi, и randn.

randiРавномерно распределенные псевдослучайные целые числа
randnОбычно распределенные случайные числа
randpermСлучайная перестановка целых чисел

Поддерживаемые синтаксисы, где s является parallel.gpu.RandStream объект:

p = randperm(s,n)
p = randperm(s,n,k)
Дополнительные сведения о других входных аргументах см. в разделе randperm.

Примеры

свернуть все

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

newStr = parallel.gpu.RandStream('Philox')
newStr =

Philox4x32_10 random stream on the GPU
             Seed: 0
  NormalTransform: BoxMuller

Затем задайте этот новый поток в качестве глобального.

parallel.gpu.RandStream.setGlobalStream(newStr);

Проверьте, что newStr является текущим глобальным потоком.

newStr
newStr =

Philox4x32_10 random stream on the GPU (current global stream)
             Seed: 0
  NormalTransform: BoxMuller

Функции графического процессора rand, randi, и randn теперь извлекайте случайные числа из нового глобального потока с помощью 'Philox' алгоритм генератора.

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

stCPU = RandStream('Threefry','Seed',0,'NormalTransform','Inversion');
stGPU = parallel.gpu.RandStream('Threefry','Seed',0,'NormalTransform','Inversion');

Только 'Inversion' алгоритм нормального преобразования доступен как на GPU, так и на CPU.

Установите эти потоки как глобальные потоки на CPU и GPU соответственно.

RandStream.setGlobalStream(stCPU);
parallel.gpu.RandStream.setGlobalStream(stGPU);

Запрос rand и randn теперь создает одинаковые наборы номеров как в GPU, так и в сеансе MATLAB клиента.

rC = rand(1,10)
rG = rand(1,10, 'gpuArray')
rC =
    0.1726    0.9207    0.8108    0.7169    0.8697    0.7920    0.4159    0.6503    0.1025    0.6166

rG =
    0.1726    0.9207    0.8108    0.7169    0.8697    0.7920    0.4159    0.6503    0.1025    0.6166

rnC = randn(1,10)
rnG = randn(1,10, 'gpuArray')
rnC =
    -0.9438    1.4095    0.8807    0.5736    1.1250    0.8133   -0.2124    0.3862   -1.2673    0.2966

rnG =
    -0.9438    1.4095    0.8807    0.5736    1.1250    0.8133   -0.2124    0.3862   -1.2673    0.2966
Представлен в R2011b