2011-11-29 23 views
8

Estoy interesado en ejecutar la misma función que realiza algunas evaluaciones de monte carlo con diferentes valores de los argumentos en múltiples núcleos de forma paralela. También quiero asegurarme de que toda la función se ejecute en el mismo kernel, sin que los cálculos dentro de la función se distribuyan entre los kernels. Por ejemplo, supongamos que tengo una función (deliberadamente simplificado)Programación paralela en Mathematica

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]; 

ahora Quiero correr f [m1, m2], F [m3, m4], f [m5, m6], f [m7, m8 ] f [m9, m10] en cinco núcleos diferentes sin transferencia de información a través de estos núcleos, es decir, con una secuencia separada de números aleatorios en los diferentes núcleos.

¿Cómo se puede hacer esto dentro de Mathematica?

+1

Tener diversión chicos, estoy sentado éste hacia fuera. –

+1

@ Mr.Wizard: No es divertido cuando no estás cerca para competir con :) :) –

Respuesta

3

Tal vez pueda sembrar kernels individuales con $KernelID y $ProcessID?

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

Y esto debe ir a cinco núcleos diferentes (la opción FinestGrained toma cada evaluación de un nuevo kernel):

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

Cuando i (máximo 5) es mayor que el número de granos (8), esto va a tener problemas, es decir, f[13,14]puede usar la misma semilla que f[2,3].

+0

¿No es esto lo que sucede por defecto? Ver [aquí] (http://reference.wolfram.com/mathematica/tutorial/RandomNumberGeneration.html), dice * "Para cálculos paralelos es muy ventajoso tener un generador en cada hilo que produce números aleatorios independientes de los generadores En Mathematica, a cada subproceso utilizado en un cálculo paralelo se le dará un índice único que comienza desde cero (y normalmente va secuencialmente a través de $ ProcessorCount) que se utilizará para proporcionar diferentes semillas y generadores en cada subproceso. "* – Szabolcs

+0

Quiero todos los cálculos dentro de una función que suceden en el mismo kernel. Si la función involucra múltiples (digamos 10000) sorteos al azar, todos deberían provenir del mismo flujo. – asim

2

Creo que lo que estás buscando es BlockRandom.

De acuerdo con la documentation,

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. 

entonces usted podría tener:

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