Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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.

share|improve this question
1  
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. –  sebhofer Jul 20 '12 at 7:24

2 Answers 2

up vote 3 down vote accepted

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]
share|improve this answer

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).

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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