Re: Incorrect parallel computation

*To*: mathgroup at smc.vnet.net*Subject*: [mg125986] Re: Incorrect parallel computation*From*: Zach Bjornson <bjornson at stanford.edu>*Date*: Wed, 11 Apr 2012 18:19:26 -0400 (EDT)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*References*: <jlrhi8$eoe$1@smc.vnet.net>

On Apr 8, 1:17 am, Yasha Gindikin <gindi... at gmail.com> wrote: > Dear colleagues, > > would you please advise me on why the following simple code executes incorrectly when parallelized? > > a = Subsets[Range[1, 5], {3}]; > L = Length@a; > b = Table[0, {5}]; > c = Table[0, {5}]; > SetSharedVariable[c]; > Do[b[[a[[l, k]]]] += 1, {l, L}, {k, 3}]; > ParallelDo[c[[a[[l, k]]]] += 1, {l, L}, {k, 3}]; > b===c > > False > > Thank you! > Best regards, > Yasha Gindikin. If you have a situation where each iteration is slow (e.g. where the time to access the results variable c is negligible relative to the time to compute its new value), try CriticalSection as below. In this simplified example, it will be slower than plain Do because of locking. a = Subsets[Range[1, 5], {3}]; L = Length@a; b = Table[0, {5}]; Do[b[[a[[l, k]]]] += 1, {l, L}, {k, 3}]; c = Table[0, {5}]; SetSharedVariable[c]; ParallelDo[CriticalSection[{clock}, c[[a[[l, k]]]] += 1], {l, L}, {k, 3}] b===c True -Zach