python numpy multiprocessing

Python Multiprocesamiento Numpy Aleatorio



multiprocessing (2)

Llamar g (core) y permuting una copia de la matriz devuelve 4 arrays idénticamente ''barajadas''. Esto parece indicar que la copia de trabajo no es local, el proceso secundario.

Lo que probablemente indique es que el generador de números aleatorios se inicializa de manera idéntica en cada proceso secundario, produciendo la misma secuencia. Necesita sembrar el generador de cada niño (tal vez arrojando la identificación del proceso del niño en la mezcla).

Esta pregunta ya tiene una respuesta aquí:

¿El alcance de una función ndarray numpy es diferente dentro de una función llamada multiprocesamiento? Aquí hay un ejemplo:

Utilizando el módulo de multiproceso de python, estoy llamando a una función como esta:

for core in range(cores): #target could be f() or g() proc = mp.Process(target=f, args=(core)) jobs.append(proc) for job in jobs: job.start() for job in jobs: job.join() def f(core): x = 0 x += random.randint(0,10) print x def g(core): #Assume an array with 4 columns and n rows local = np.copy(globalshared_array[:,core]) shuffled = np.random.permutation(local)

Al llamar a f(core) , la variable x es local al proceso, es decir. imprime un entero diferente, aleatorio como se esperaba. Estos nunca superan 10, lo que indica que x=0 en cada proceso. ¿Es eso correcto?

Llamar g(core) y permuting una copia de la matriz devuelve 4 arrays idénticamente ''barajadas''. Esto parece indicar que la copia de trabajo no es local, el proceso secundario. ¿Es eso correcto? Si es así, aparte de usar el espacio de memoria compartida, ¿es posible que un ndarray sea local para el proceso secundario cuando debe llenarse desde el espacio de memoria compartido?

EDITAR:

Alterar g(core) para agregar un entero aleatorio parece tener el efecto deseado. La matriz muestra un valor diferente. Algo debe estar ocurriendo en la permutation que está ordenando aleatoriamente las columnas (local para cada proceso hijo) las mismas ... ideas?

def g(core): #Assume an array with 4 columns and n rows local = np.copy(globalshared_array[:,core]) local += random.randint(0,10)

EDIT II: np.random.shuffle también exhibe el mismo comportamiento. El contenido de la matriz se está barajando, pero se está mezclando con el mismo valor en cada núcleo.


Para generar una matriz aleatoria, esta publicación fue muy útil. La siguiente función g(core) logró generar una permutación aleatoria para cada núcleo.

def g(core): pid = mp.current_process()._identity[0] randst = np.random.mtrand.RandomState(pid) randarray = randst.randint(0,100, size=(1,100)