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

---
David E. Hudak, Ph.D.          dhu...@osc.edu
Program Director, HPC Engineering
Ohio Supercomputer Center
http://www.osc.edu










------------------------------------------------------------------------------
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