11
$\begingroup$

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 "<<mycalculation.m"

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.

$\endgroup$
1
  • 1
    $\begingroup$ Do kernels actually interfere if you start them like that from the command line? A quick test suggested that they don't. They all show the same $KernelID though, if that poses a problem. $\endgroup$
    – sebhofer
    Jul 20, 2012 at 7:24

2 Answers 2

3
$\begingroup$

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]
$\endgroup$
2
$\begingroup$

Do I understand it correctly that you have several CPU cores in your machine (say, four of them), and you wish to run as many instances of the simulation as the number of cores, to make maximum use of the available computing power?

In this case you can just start four separate instances of the Mathematica kernel on the command line. Simply run MathKernel -noprompt -run "<<mycalculation.m" four times, and four instances of the kernel will be working in parallel.

As I understand, in your applications the four simulations run completely independently of each other. For this kind of work it is not necessary to use the Parallel Computing Tools, but I do recommend you take a look at them, in case you'll need them to interact later (or perhaps collect all results using a controller Mathematica kernel, and analyse them together).

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.