I have mathematica with many additional kernels besides Local ( e.g., core1, core2, core3, core4 ... ) added through Kernel Configuration Options. I have been running multiple copies of a simulation (mycalculation.nb) in these different cores. The kernel for each notebook was set using this function:
SetOptions[EvaluationNotebook[], Evaluator -> "corei"];
where corei is core1, core 2, .. etc. So all kernels run in parallel without interfering with each other. Now I am trying to automate this and use Mathematica Scripts to run each kernel with my code converted into Input Form (mycalculation.m). When I do that, the above line gives this error message since the "Evaluator" seems to be defined for front end and notebook interface only:
FrontEndObject::notavail: A front end is not available; certain operations require a front end.
Note that my code in "mathematica scripts" form works fine when I skip the "Evaluator" definition. Is there a corresponding option that I can put in the file (mycalculation.m) or in the command line, which is;
MathKernel -noprompt -run "<
so that I can tell MathKernel to execute the rest of the code not in the local kernel but in some other kernel. I could not find it myself.
Answer
You can obtain kernel IDs with either, Kernels[]
or ParallelEvaluate[$KernelID]
.
ids=ParallelEvaluate[$KernelID]
{1, 2, 3, 4}
kobjs=Kernels[]
{KernelObject[1, "local"], KernelObject[2, "local"], KernelObject[3, "local"], KernelObject[4, "local"]}
These can then be used with ParallelEvaluate
to specify which kernel you wish to run your code on.
Set all the cells you want to evaluate in your .m
file to be initialization cells.
Then you can run that .m
file on whichever kernels you like from either a notebook file or another .m
file:
ParallelEvaluate[Get["/mypath/myscriptfile.m"];,{1,3}]
or by list of required IDs:
ParallelEvaluate[Get["/mypath/myscriptfile.m"];,ids]
or by list of required kernel objects:
ParallelEvaluate[Get["/mypath/myscriptfile.m"];,kobjs[[1;;3]]]
If you have different custom script files you want to run on their own core:
ParallelEvaluate[Get["/mypath/myscriptfile1.m"];,1]
ParallelEvaluate[Get["/mypath/myscriptfile2.m"];,2]
ParallelEvaluate[Get["/mypath/myscriptfile4.m"];,4]
Comments
Post a Comment