Short question: How can you set $IterationLimit
for parallel computation?
I thought just setting $IterationLimit = Infinity
would work but it doesn't. I still get Iteration limit exceeded
errors. A bit of sample code below:
fff[0] = 1;
fff[p_] := fff[p - 1] (*simple function*)
limit = $IterationLimit (*checking $IterationLimit*)
fff[limit + 1000] (*this should give $IterationLimit::itlim error*)
ParallelTable[fff[i], {i, limit + 1000, limit + 1004}] (*this should also give multiple $IterationLimit::itlim errors*)
$IterationLimit = Infinity; (*setting infinite $IterationLimit*)
fff[limit + 1000] (*now this should compute without errors*)
ParallelTable[fff[i], {i, limit + 1000, limit + 1004}] (*this shouldn't give any errors either but for me it throws $IterationLimit::itlim errors*)
Answer
When using parallelization in Mathematica, it is very important to understand that the "parallel threads" are completely separate kernel processes. Assume that any communication between the main kernel and subkernels needs to be explicit (though there is some automation since version 8: DistributeDefinitions
is done automatically in many cases).
Since fff
is defined by you, the user, in the Global`
context, the definition of fff
is automatically distributed to the subkernels (in v8 and later) by ParallelTable
and you don't need to use DistributeDefinitions
explicitly. However, $IterationLimit
is a system symbol, and it won't be distributed.
If you set $IterationLimit
on the main kernel, it will only have an effect on the main kernel.
The subkernels have their own $IterationLimit
which you need to set separately with the aid of ParallelEvaluate
. (Do not use DistributeDefinitions
in this case.)
ParallelEvaluate[$IterationLimit = ...]
Comments
Post a Comment