Hi, Dave,

You're accessing a field (or calling a method) of a remote object
reference.  If you ran the compiler with the -STATIC_CALLS flag,
you would have gotten a compile-time error.  As it is, the
compiler inserts a dynamic check for you, which then fails at
runtime.

Try compiling your program with -STATIC_CALLS, and see what the
compiler reports.

Hope this helps,
        Igor
P.S. Judging by your stack trace, you seem to be running on a Mac.
There was a bug with printing Mac stack traces in X10 2.0.5 which
is fixed in SVN HEAD (so it will work better in the next release).

Dave Hudak <dhu...@osc.edu> wrote on 07/29/2010 12:53:18 PM:

> Hi All,
> 
> I took Igor's advice on using a cell to pass results back to the 
> calling place.  I recoded my function for translating a distarray into
> a string as follows.  The "boo/hoo" statements are line counters:
> 
>     public def place_str(): String
>     {
>       Console.OUT.println("hoo");
>       var s : String = "";                        //var is mutable
>       Console.OUT.println("hoo1");
>       var first : Boolean = true;                     //var 
> declaration must include type
>       Console.OUT.println("place_str "+here.id);
>       for (pt in a_prefix_sum | here) {
>          if (first) {
>             first = false;
>          }
>          else {
>             s += ", ";
>          }
>          Console.OUT.println("place_str point = "+pt);
>          s += a_prefix_sum(pt).toString();         //works because 
> toString is global
>       }
>       return s;
>     }
> 
>     public def str():String 
>     {
>        var s : String = "";                        //var is mutable
>       for (p in a_prefix_sum.dist.places()) {
>          Console.OUT.println("str "+p.id);
>          val z = new Cell[String](null);
>          Console.OUT.println("boo");
>          val h = here;
>          Console.OUT.println("boo2");
>          at (p) {
>             Console.OUT.println("boo3");
>             val q = place_str();
>             Console.OUT.println("boo4");
>             at (h) z.set(q);
>             Console.OUT.println("boo5");
>          }
>          s += z();
>          if (p.id != (Place.MAX_PLACES - 1)) {
>             s += ", ";
>          } //if
>          Console.OUT.println("s = "+s);
>       } //for i 
>       return s;
>    }
> 
> I am causing an exception when I call the place_str method from any 
> place other that place 0.  Here is the output:
> 
> dhu...@oscnet166 77%> mpirun -np 8 Driver
> <...snip>
> str 0
> boo
> boo2
> boo3
> hoo
> hoo1
> place_str 0
> place_str point = (1)
> place_str point = (2)
> place_str point = (3)
> place_str point = (4)
> boo4
> boo5
> s = 1, 2, 3, 4, 
> str 1
> boo
> boo2
> boo3
> Uncaught exception at place 0: x10.lang.ClassCastException (home==1): 
> DistPrefixSum{self.home==here}
> x10.lang.ClassCastException (home==1): DistPrefixSum{self.home==here}
>         at x10::lang::Throwable::fillInStackTrace()
> 
> Any ideas?
> 
> Thanks,
> Dave
> On Jul 28, 2010, at 8:05 PM, Igor Peshansky wrote:
> 
> > Igor Peshansky/Watson/i...@ibmus wrote on 07/28/2010 07:15:02 PM:
> > 
> >> Dave Hudak <dhu...@osc.edu> wrote on 07/28/2010 02:37:22 PM:
> >> 
> >>> Hi All,
> >>> 
> >>> I am trying to write a class that will do a prefix sum on an array. 
I
> >>> have written the single-place version and a single-place version 
that 
> >>> uses multiple activities to compute the sums.  I am now trying to 
> >>> write the distributed version.  Both classes are included (I will 
> >>> eventually write an interface for these classes).
> >>> 
> >>> I have been able to write the constructors and call them without 
run-
> >>> time exceptions occurring.  Now, I want to write a function that 
> >>> returns a single string representation of a dist array.  I wrote a 
> >>> function that should create a string representation of all dist 
array 
> >>> elements at a given location (I called it place_str), and then I 
want 
> >>> to loop over all places:
> >>> 
> >>> (from DistPrefixSum.x10):
> >>> 
> >>>    public def str():String 
> >>>    {
> >>>       var s : String = "";                        //var is mutable
> >>>      for (var place_id:int=0; place_id<Place.MAX_PLACES; place_id++) 

> > {
> >>>         s += at (Place.places(place_id)) place_str();
> >>>         if (place_id != (Place.MAX_PLACES - 1)) {
> >>>            s += ", ";
> >>>         } //if
> >>>      } //for i 
> >>>      return s;
> >>>   }
> >>> 
> >>> My error occurs on the at statement:
> >>> 
> >>> dhu...@oscnet166 35%> x10c++ -O -o Driver Driver.x10 PrefixSum.x10 
> >>> AsyncPrefixSum.x10 DistPrefixSum.x10
> >>> 
> >> 
> > 
> 
/Users/dhudak/osc/research/x10/tutorial/examples/GoodPrefixSum/src/DistPrefixSum.
> >>> x10:49: Local variable "place_id" is accessed from an inner class or 
a
> >>> closure, and must be declared final or shared.
> >>> 1 error.
> >>> 
> >>> Does anyone have any recommendations?  Creating a single string from 
a
> >>> dist array of integers is a reduction just like finding the sum or 
max
> >>> of the entries, so I figure its well understood...
> >> 
> >> Dave,
> >> 
> >> This is a bug in the typechecking of at expressions.  You can work 
> > around
> >> this by changing the body of the for loop to
> >> 
> >>      val z = new Cell[String](null);
> >>      val h = here;
> >>      at (Place.places(place_id)) { val q = place_str(); at (h) 
> > z.set(q); 
> >> }
> >>      s += z();
> >>      if (place_id != (Place.MAX_PLACES - 1)) {
> >>        s += ", ";
> >>      } //if
> >> 
> >> The above code is less efficient, but it should work.
> >> I've opened a JIRA issue: 
http://jira.codehaus.org/browse/XTENLANG-1632 
> > .
> >> Please watch that issue for updates on the fix.
> >>        Igor
> > 
> > Dave,
> > 
> > The fix turned out to be simple.  This is now fixed in SVN HEAD 
(r15224),
> > and will be available in the next X10 release (or you can build from 
SVN
> > to pick up the fix).
> >        Igor
-- 
Igor Peshansky  (note the spelling change!)
IBM T.J. Watson Research Center
X10: Parallel Productivity and Performance (http://x10-lang.org/)
XJ: No More Pain for XML's Gain (http://www.research.ibm.com/xj/)
"I hear and I forget.  I see and I remember.  I do and I understand" -- 
Confucius


------------------------------------------------------------------------------
The Palm PDK Hot Apps Program offers developers who use the
Plug-In Development Kit to bring their C/C++ apps to Palm for a share
of $1 Million in cash or HP Products. Visit us here for more details:
http://p.sf.net/sfu/dev2dev-palm
_______________________________________________
X10-users mailing list
X10-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/x10-users

Reply via email to