2011-08-03 18 views
5

Tengo muchos cientos de archivos de Mathematica de larga duración y deseo usar la evaluación paralela. Tengo un procesador de 2 x 4 núcleos cada máquina con 16 Gb de memoria. Mi licencia de Mathematica me permite ejecutar como máximo 2 núcleos maestros con 1 del maestro podría tener 4 núcleos esclavos (esta es mi interpretación después de jugar con ella por un tiempo).Evaluación de celdas en paralelo en Mathematica

Solía ​​ejecutar mi código en dos núcleos maestros en dos blocs de notas diferentes. Para acelerar las cosas, intenté encapsular algunas celdas con ParallelEvaluate[] y pareció funcionar. Luego, también tengo 4 copias de mi código funcionando sin conocimiento uno del otro a través de uno de los núcleos maestros, lo cual está bien. (Básicamente estoy tratando de ejecutar tantas copias de mi código/mathkernel en paralelo como sea posible. No estoy filmando para nada realmente paralelo todavía).

Como mi código es demasiado largo y complicado, no quiero volver a editar cada celda para que se evalúen en paralelo. ¿Hay algo mágico que pueda poner en el comienzo de mi computadora portátil por lo que cada celda evaluada después de eso será por defecto ParallelEvaluate[ ... cell contents.... ]?

+1

¿Estás realmente seguro de que desea 'ParallelEvaluate []' todas sus células? ¿Ya experimentaste con tu código? Sugerencia: probablemente obtendrá listas en las que obtendrá un único resultado ahora ... –

+0

Sí, estoy recibiendo listas de tablas y eso está bien. Combinaré manualmente esas tablas en el kernel maestro y analizaré los resultados. Solo estoy tratando de descubrir la forma más fácil de usar todos los mathkernels para acelerar el cálculo. – Hsn

+0

Estaba intentando experimentar con $ Pre = ParallelEvaluate ;, pero ahora no puedo usar Mma (problemas de HW), quizás quiera probarlo –

Respuesta

2

Según lo sugerido por belisarius, $ Pre = ParallelEvaluate hace exactamente lo que yo quiero. Un problema fue cuando hago $ Pre = Identity para desactivarlo, así puedo volver a mi kernel principal, y aún así mateica intenta evaluar eso en núcleos esclavos en lugar de master y falla. Terminé resolviéndolo de la siguiente manera: SetSharedVariable [parallelcontrol]; parallelcontrol = ParallelEvaluate; $ Pre: = control paralelo; ... todo se evalúa en esclavos aquí ...; parallelcontrol = Identidad; .... todo volver a ser evaluado en maestro sólo ... He aquí una muestra de ejecución en mi portátil que cuenta con 2 núcleos:

LaunchKernels[] 

{KernelObject [1, "local"], KernelObject [2, "local"]}

$KernelID 
ParallelEvaluate[$KernelID] 

{1, 2}

SetSharedVariable[parcontrol]; $Pre := parcontrol; parcontrol = ParallelEvaluate 

Null [ParallelEvaluate]

$KernelID 

{1, 2}

parcontrol = Identity 

{identidad, identidad}

$KernelID 
parcontrol = ParallelEvaluate 

ParallelEvaluate

$KernelID 

{1, 2}