Параллельное программирование в Mathematica - PullRequest
8 голосов
/ 30 ноября 2011

Я заинтересован в запуске той же самой функции, которая выполняет некоторые оценки Монте-Карло с различными значениями аргументов на множественных ядрах параллельно.Я также хочу убедиться, что вся функция выполняется в одном и том же ядре, без вычислений внутри функции, распределенных по ядрам.Например, предположим, у меня есть функция (намеренно упрощенная)

f[a_, b_] := Module[{}, RandomReal[{a, b}]]


In[1]:= LaunchKernels[]

Out[1]= {KernelObject[1, "local"], KernelObject[2, "local"], 
 KernelObject[3, "local"], KernelObject[4, "local"], 
 KernelObject[5, "local"], KernelObject[6, "local"], 
 KernelObject[7, "local"]}

SeedRandom[795132, Method -> "ParallelGenerator"];

m1 = 1; m2 = 2; m3 = 3; m4 = 4; m5 = 5; m6 = 6; m7 = 7; m8 = 8;

DistributeDefinitions[f, m1, m2, m3, m4, m5, m6, m7, m8];

Теперь я хочу запустить f [m1, m2], f [m3, m4], f [m5, m6], f [m7, m8] f [m9, m10] на пяти разных ядрах без передачи информации по этим ядрам, т. е. с отдельным потоком случайных чисел в разных ядрах.

Как это можно сделать в Mathematica?

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

Возможно, вы можете посеять отдельные ядра с $KernelID и $ProcessID?

ParallelEvaluate[
 Print[$KernelID $ProcessID];
 SeedRandom[$KernelID $ProcessID]
]

И это должно идти в пять разных ядер (опция FinestGrained переводит каждую оценку в новое ядро):

ParallelTable[$KernelID -> f[2 i - 1, 2 i], {i, 5}, Method -> "FinestGrained"]

Когда i (макс. 5) больше, чем количество ядер (8), это может привести к проблемам, например, f[13,14] может использовать тот же начальный размеркак f[2,3].

2 голосов
/ 01 декабря 2011

Я считаю, что вы ищете BlockRandom.

Согласно документации ,

BlockRandom[expr]
evaluates expr with all pseudorandom generators localized,
so that uses of SeedRandom, RandomInteger, and related functions
within the evaluation of expr do not affect subsequent pseudorandom sequences.

Тогда у вас может быть:

f[a_, b_] := BlockRandom[{}, RandomReal[{a, b}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...