This is a typical X10 beginner mistake: you specify types that
are too imprecise.  You cannot index into an Array with a Point
unless it can be statically proven that the rank of that Point
is exactly equal to the rank of the Array's region.

The best rule of thumb is to let X10 infer the types for you.
Barring that, you should look carefully at the methods you call
to ensure that the rank is propagated correctly.  Incidentally,
to get efficient iteration, you'd want to propagate other
pr0operties of the Array's region (e.g., the fact that it's
rectangular).

Another problem is that array elements have to be accessed in
the place where they live (as specified by the distribution).
This is not something that can be checked statically, but you
will get a runtime exception if this rule is violated.

So, you should rewrite your code as follows:

public static def main(args:Rail[String]!){
   val R = 1..4; // The inferred type here is Region(1){rect}
   val D = Dist.makeCyclic(R); // The inferred type here is 
Dist{region==R)

   val data_squares = Array.make[Int](D, ((i):Point(1)) => i*i);

   for (val p in D) { // The inferred type here is Point(1)
      Console.OUT.println( "Array index: " + p + " distributed place :" + 
D(p));

      // this is the problem part, but this is how I understood arrays

      Console.OUT.println( "Array element: " + at (D(p)) data_squares(p));

      // how can I access e.g. data_squares(3) and its value and place.
      // using 2.0 java back end on eclipse
   }
}

Vijay already covered most of these points, but one that I wanted
to bring up is that, unless you know exactly what the type is,
better let the type system infer the most precise type.  In
particular, if you'd left the type of D as just Dist, the iteration
would have been woefully inefficient (which would have hurt your
peformance for larger arrays).

As Vijay said, we are working on relaxing that requirement.
        Igor

Haris H <hha...@gmail.com> wrote on 03/28/2010 03:57:47 PM:

> Hi guys,
> can somebody clear this up for me please.
> I can not get my head around this element manipulation in distributed 
arrays
> in 2.0.
> 
> Here is the overly simplified code but represents my problem,
> so please tell me what am I doing wrong and what it should be.
> 
> I am having trouble understanding accessing elements of the array and 
their
> distributed location.
> 
> Thank you.
> 
> public static def main(args:Rail[String]!){
> 
>    R: Region = 1..4;
>    D: Dist = Dist.makeCyclic(R);
> 
>    val data_squares = Array.make[Int](D, ((i):Point) => i*i);
> 
>    for (val p: Point in D) {
>        Console.OUT.println( "Array index: " + p + " distributed place :" 
+
> D(p));
> 
>       // this is the problem part, but this is how I understood arrays
> 
>       Console.OUT.println( "Array element: " + data_squares(p));
> 
>      // how can I access e.g. data_squares(3) and its value and place.
>      // using 2.0 java back end on eclipse
>   }
> }
-- 
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


------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
X10-users mailing list
X10-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/x10-users

Reply via email to