Jim LaGrone <jlagr...@cs.uh.edu> wrote on 08/27/2009 09:38:38 PM: > Eventually I'll get the hang of this. Thanks for all your help. > > > On Aug 27, 2009, at 6:13 PM, Igor Peshansky wrote: > > > Jim LaGrone <jlagr...@cs.uh.edu> wrote on 08/27/2009 06:43:57 PM: > > > >> > >> On Aug 27, 2009, at 3:55 PM, Igor Peshansky wrote: > >> > >>> You can also use the place-local idiom, as follows: > >>> > >>> val norms = Array.make[Double](Dist.makeUnique(), (Point)=>0.0); > >>> finish ateach ( (p) in distS.places() ) { > >>> for ( (i, j) in distS | p ) { // at this point, p == here > >>> norms(p.id) += Math.sqrt(S(i,j).real*S(i,j).real + > >>> S(i,j).image*S(i,j).image); > >>> } > >>> } > >>> rawNormPower2 = norms.sum(); // a distributed reduction > >>> > >>> Here, norms is an array with a unique distribution (which has one > >>> point > >>> per place). The ateach loop again spawns parallel iterations on > >>> each > >>> place (but now there's one per place covered by the distribution). > >>> The > >>> body of the ateach has a sequential loop that runs over the part of > >>> distS > >>> that lives in that place. Each iteration of that sequential loop > >>> updates > >>> the local element of norms. There is no need for atomic, since all > >>> updates happen sequentially. Once the ateach loop is done, a > >>> (distributed) > >>> reduction is performed over the norms array, and the sum is stored > >>> in the > >>> final result location. > >> > >> > >> Using this method and Java backend, I have > >> > >> rawNormPower2 = 0; > >> val norms = Array.make[Double](Dist.makeUnique(), (Point)=>0.0); > >> finish ateach( (p) in distS.places() ){ //line 327 > >> for( (i,j) in distS | p ){ > >> norms(p.id) += Math.sqrt(S(i1,j1).real*S(i1,j1).real + > >> S(i1,j1).image*S(i1,j1).image); > >> } > >> } > >> rawNormPower2 = norms.sum()/( N*Mc ); //line 333 > >> > >> > >> but get this > >> > >> /Users/jlagrone/GradSchool/Research/workspace/X10-code/SSCA3-X10/src- > >> par/State.x10:327: Could not infer type for formal parameter. > >> /Users/jlagrone/GradSchool/Research/workspace/X10-code/SSCA3-X10/src- > >> par/State.x10:327: Could not infer type for formal parameter. > >> /Users/jlagrone/GradSchool/Research/workspace/X10-code/SSCA3-X10/src- > >> par/State.x10:333: No valid method call found for sum() in > >> x10.lang.Array[x10.lang.Double]. > > > > Sorry, this will teach me to actually test the code before sending > > it out. > > Line 327 should be "finish for ( p in distS.places() ) async (p) {". > > In line 33, replace "sum()" by "reduce((a:Int,b:Int)=>a+b, 0)". > > > > First - > > reduce((a:Int,b:Int)=>a+b, 0) doesn't compile.
D'oh. "reduce((a:Double,b:Double)=>a+b, 0.0)", of course -- you're dealing with doubles, not ints. > The API looks like this should work: > > reduce(Double.+,0) > > It compiles but I don't know about the correctness. That should definitely work in SVN HEAD -- I wasn't sure it would in the 1.7.* releases, so I didn't mention it. > Second - > > Using this code: > > val norms = Array.make[Double](Dist.makeUnique(), (Point)=>0.0); > finish for ( p in distS.places() ) async(p){ > for( (i,j) in distS | p ){ > norms(p.id) += Math.sqrt(S(i,j).real*S(i,j).real + > S(i,j).image*S(i,j).image); > } > } > > I get this output for places 3, 2, & 1: > > BAD PLACE EXCEPTION > BAD PLACE EXCEPTION > BAD PLACE EXCEPTION > x10.lang.BadPlaceException: object=State Object {/*object values > omitted*/} access at place=(Place 3) > at x10.runtime.Runtime.placeCheck(Runtime.java:699) > at State$2.apply(State.java:674) > at x10.runtime.Activity.now(Activity.java:222) > at x10.runtime.Activity.run(Activity.java:156) > at x10.runtime.Worker$3.apply(Worker.java:330) > at x10.runtime.impl.java.Runtime.runAt(Runtime.java:96) > at x10.runtime.Worker.loop(Worker.java:317) > at x10.runtime.Worker.join(Worker.java:246) > at x10.runtime.Pool$5.apply(Pool.java:418) > at x10.runtime.impl.java.Runtime.runAt(Runtime.java:96) > at x10.runtime.Pool.join(Pool.java:410) > at x10.runtime.FinishState.waitForFinish(FinishState.java:83) > at x10.runtime.Runtime.stopFinish(Runtime.java:1068) > at State.formImage(State.java:731) > at State.stage1(State.java:1417) > at RUN_knowledgeFormation.main(RUN_knowledgeFormation.java:466) > at RUN_knowledgeFormation$Main$1.apply(RUN_knowledgeFormation.java:48) > at x10.runtime.Activity.now(Activity.java:222) > at x10.runtime.Activity.run(Activity.java:127) > at x10.runtime.Worker$3.apply(Worker.java:330) > at x10.runtime.impl.java.Runtime.runAt(Runtime.java:96) > at x10.runtime.Worker.loop(Worker.java:317) > at x10.runtime.Runtime.start(Runtime.java:143) > at RUN_knowledgeFormation$Main.main(RUN_knowledgeFormation.java:35) > at x10.runtime.impl.java.Runtime.run(Runtime.java:46) > at java.lang.Thread.run(Thread.java:613) > > > > A query on Place.MAX_PLACES returns 4 and I'm using a dual-core with > Java backend. > > Any suggestions? Interesting. The above code should work, unless S is a field of an object that lives in place 0 (e.g., if S is really this.S). If that is the case, simply store S in a local variable (e.g., "val S = this.S") and let the async capture it. Otherwise, I'd suspect a bug in the Java backend implementation... Igor -- Igor Peshansky (note the spelling change!) IBM T.J. Watson Research Center XJ: No More Pain for XML's Gain (http://www.research.ibm.com/xj/) X10: Parallel Productivity and Performance (http://x10.sf.net/) ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ X10-users mailing list X10-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/x10-users