Re: Any answer for this ParallelDo error

*To*: mathgroup at smc.vnet.net*Subject*: [mg108900] Re: Any answer for this ParallelDo error*From*: Albert Retey <awnl at gmx-topmail.de>*Date*: Tue, 6 Apr 2010 07:25:58 -0400 (EDT)*References*: <hpcjfk$mu3$1@smc.vnet.net>

Hi, > > Here is a harmless piece of code. > > Clear[a]; > t=AbsoluteTime[]; > a=ParallelTable[0,{i,1,20},{j,1,50}]; > DistributeDefinitions[a]; > mat=ParallelDo[a[[i,j]]=If[PrimeQ[(i^3+j^5)]==True,1,0],{i,1,20},{j, > 1,50}]; > AbsoluteTime[]-t > > The error is something like > > Set::noval: Symbol a in part assignment does not have an immediate value. > Set::noval: Symbol a in part assignment does not have an immediate value. > > I know there is a way of using SetSharedVariable but that version of > the code is very slow. > > Clear[a]; > t=AbsoluteTime[]; > a=ParallelTable[0,{i,1,20},{j,1,50}]; > SetSharedVariable[a]; > mat=ParallelDo[a[[i,j]]=If[PrimeQ[(i^3+j^5)]==True,1,0],{i,1,20},{j, > 1,50}]; > Print[a//ArrayPlot]; > AbsoluteTime[]-t > > Time taken: 6.1443514 > > The single processor version is much faster > > Clear[a]; > t=AbsoluteTime[]; > a=Table[0,{i,1,20},{j,1,50}]; > mat=Do[a[[i,j]]=If[PrimeQ[(i^3+j^5)]==True,1,0],{i,1,20},{j,1,50}]; > Print[a//ArrayPlot]; > AbsoluteTime[]-t > > Time taken: 0.0360021 > > My question is why I cant distribute the definition of a array to my > processor kernels. If you want to change the same variable from different kernels, you _have_ to use SetSharedVariable, and there _must_ be some kind of synchronisation between the kernels and this _must_ cause overhead. If you want speed, you need to take another approach, e.g. create a part of the table on each kernel and only join the results in the master kernel. It really depends on your problem and you need to take advantage of what you know about the problem, automatic parallelization will often fail to show speedup. You should also realize that there is _always_ overhead when parallelizing code, so you can only hope to see speedup if the calculation times are larger than the expected overhead from parallelization. For a problem that solves in 0.0360021 Seconds on one kernel I doubt there is a chance to see any speedup with parallelization at all (and that holds not only for Mathematica)... > Hope someone can give me an answer. I need to make this Do loop > parallel. for the toy problem you sent there is no chance to see speedup whatsover. If your real problem is larger, you should show something that at least takes a few seconds to run, otherwise it will usually not be possible to see whether parallelization is gaining anything at all. You should also not add the timing for ArrayPlot, eventual speedups will be even harder to see with it. For what you have shown, I wonder why you don't just use: a=ParallelTable[If[PrimeQ[(i^3+j^5)]==True,1,0],{i,1,20},{j,1,50}] which does not have the problem of synchronization and doesn't need SetSharedVariable. On the other hand the problem still solves in 0.036 Seconds on one kernel, and you will still suffer from overhead and not see any speedup... On my 2 processor machine, the parallel version starts to be faster than the serial for i,j about 200: start = AbsoluteTime[]; a1 = Table[ If[PrimeQ[(i^3 + j^5)] == True, 1, 0], {i, 1, 300}, {j, 1, 300}]; AbsoluteTime[] - start 1.1875000 start = AbsoluteTime[]; a2 = ParallelTable[ If[PrimeQ[(i^3 + j^5)] == True, 1, 0], {i, 1, 300}, {j, 1, 300} ]; AbsoluteTime[] - start 0.8906250 for i=j=1000 the parallel version shows a speedup of 14.9/8.7=1.7, which is already quite close the maximum of 2 that you could expect. hth, albert