Несколько потоков

Используя несколько независимых потоков

MATLAB включает алгоритмы генератора, которые позволяют вам создать несколько независимых потоков случайных чисел. Например, четыре типа генератора, которые поддерживают несколько независимых потоков, являются Объединенным Несколько Рекурсивные ('mrg32k3a'), мультипликативный изолированный Фибоначчи ('mlfg6331_64'), Philox 4x32 ('philox4x32_10'), и Threefry 4x64 ('threefry4x64_20') генераторы. Можно создать несколько независимых потоков, которые, как гарантируют, не перекроются, и для который тесты, которые демонстрируют, что (псевдо) независимость значений между потоками была выполнена. Для получения дополнительной информации об алгоритмах генератора, которые поддерживают несколько потоков, см. таблицу алгоритмов генератора в Выборе Random Number Generator.

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

[s1,s2,s3] = RandStream.create('mlfg6331_64','NumStreams',3)
s1 = 
mlfg6331_64 random stream
      StreamIndex: 1
       NumStreams: 3
             Seed: 0
  NormalTransform: Ziggurat
s2 = 
mlfg6331_64 random stream
      StreamIndex: 2
       NumStreams: 3
             Seed: 0
  NormalTransform: Ziggurat
s3 = 
mlfg6331_64 random stream
      StreamIndex: 3
       NumStreams: 3
             Seed: 0
  NormalTransform: Ziggurat

Как доказательство независимости, вы видите, что эти потоки являются в основном некоррелироваными.

r1 = rand(s1,100000,1);
r2 = rand(s2,100000,1); 
r3 = rand(s3,100000,1);
corrcoef([r1,r2,r3])
ans = 3×3

    1.0000    0.0007    0.0052
    0.0007    1.0000    0.0000
    0.0052    0.0000    1.0000

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

numLabs = 256;
labIndex = 4;
s4 = RandStream.create('mlfg6331_64','NumStreams',numLabs,'StreamIndices',labIndex)
s4 = 
mlfg6331_64 random stream
      StreamIndex: 4
       NumStreams: 256
             Seed: 0
  NormalTransform: Ziggurat

Несколько потоков, поскольку они статистически независимы, могут использоваться, чтобы проверить точность симуляции. Например, набор независимых потоков может использоваться, чтобы несколько раз повторять симуляцию Монте-Карло в различных сеансах работы с MATLAB или на различных процессорах и определять отклонение в результатах. Это делает несколько потоков полезными в крупномасштабных параллельных симуляциях.

Используя seed, чтобы получить различные результаты

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

Создайте два потока с различными seed при помощи Генератора случайных чисел Вихрь Мерсенна.

s1 = RandStream('mt19937ar','Seed',1)
s1 = 
mt19937ar random stream
             Seed: 1
  NormalTransform: Ziggurat
s2 = RandStream('mt19937ar','Seed',2)
s2 = 
mt19937ar random stream
             Seed: 2
  NormalTransform: Ziggurat

Используйте первый поток в одном сеансе работы с MATLAB, чтобы сгенерировать случайные числа.

r1 = rand(s1,100000,1);

Используйте второй поток в другом сеансе работы с MATLAB, чтобы сгенерировать случайные числа.

r2 = rand(s2,100000,1);

С различными seed, потоковые обычно возвращаемые значения, которые являются некоррелироваными.

corrcoef([r1,r2])
ans = 2×2

    1.0000    0.0030
    0.0030    1.0000

Эти два потока с различными seed могут казаться некоррелироваными, поскольку пространство состояний Вихря Мерсенна настолько больше (219937 элементы), чем количество возможных seed (232). Возможности перекрытия в различных запусках симуляции являются довольно удаленными, если вы не используете большое количество различных seed. Используя широко расставленные seed не увеличивает уровень случайности. На самом деле беря эту стратегию до крайности и пересевая генератор, прежде чем каждый вызов может привести к последовательности значений, которые не статистически независимы и тождественно распределены.

Отбор поток является самым полезным, если вы используете его в качестве шага инициализации, возможно, при запуске MATLAB, или прежде, чем запустить симуляцию.

Используя подпотоки, чтобы получить различные результаты

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

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

defaultStream = RandStream('mlfg6331_64');
RandStream.setGlobalStream(defaultStream)
for i = 1:5
    defaultStream.Substream = i;
    z = rand(1,i)
end
z = 0.6986
z = 1×2

    0.9230    0.2489

z = 1×3

    0.0261    0.2530    0.0737

z = 1×4

    0.3220    0.7405    0.1983    0.1052

z = 1×5

    0.2067    0.2417    0.9777    0.5970    0.4187

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

for i = 6:10
    defaultStream.Substream = i;
    z = rand(1,11-i)
end
z = 1×5

    0.2650    0.8229    0.2479    0.0247    0.4581

z = 1×4

    0.3963    0.7445    0.7734    0.9113

z = 1×3

    0.2758    0.3662    0.7979

z = 1×2

    0.6814    0.5150

z = 0.5247

Каждый из этих подпотоков может воспроизвести свою итерацию цикла. Например, можно возвратиться к 6-му подпотоку в цикле.

defaultStream.Substream = 6;
z = rand(1,5)
z = 1×5

    0.2650    0.8229    0.2479    0.0247    0.4581

Смотрите также

|

Похожие темы