"Pi by Quadrature" again (sorry), but this time trying to use
parallelism via partitioning the problem using an parallel array.  As a
first step I thought of using the Array[T] class -- or should that be
Array<T> the API page uses both notations, cf.
http://dist.codehaus.org/x10/xdoc/2.0.3/

I had thought that something along the lines of:

    val computeSlice = ( p : Point ) => {
      val id : int = p(0) ;
      val start : long = 1 + id * sliceSize ;
      val end : long = ( id + 1 ) * sliceSize ;
      var sum : double = 0.0 ;
      for ( var i : long = start ; i < end ; ++i ) {
        val x : double = ( i - 0.5 ) * delta ;
        sum += 1.0 / ( 1.0 + x * x ) ;
      }
      sum
    } ;
    val sums = ( new Array[Double] ( numberOfTasks) ).lift
( computeSlice ) ;


<<<< I am not convinced this operation labelled "lift" is actually a
"lift" operation, it is actually "map" isn't it? >>>>


should do the job (rightly or wrongly), but when compiled (successful)
and then executed, I get:

        |>x10c++ -o Pi_X10_Parallel Pi_X10_Parallel.x10
        x10c++: 1 dynamically checked calls or field accesses.
        |> runx10 Pi_X10_Parallel
        Uncaught exception at place 0: x10.lang.ClassCastException
        x10.lang.ClassCastException
                at x10::lang::Throwable::fillInStackTrace()
                at x10aux::throwClassCastException()
                at Pi_X10_Parallel() [0x41d42e]
                at 
x10aux::ClassCastNotPrimitive<x10aux::ref<x10::lang::Fun_0_1<double, double> >, 
x10aux::ref<x10::lang::Fun_0_1<x10aux::ref<x10::array::Point>, double> > 
>::_(x10aux::ref<x10::lang::Fun_0_1<x10aux::ref<x10::array::Point>, double> >, 
bool)
                at 
x10aux::ClassCastPrimitive<x10aux::ref<x10::lang::Fun_0_1<double, double> >, 
x10aux::ref<x10::lang::Fun_0_1<x10aux::ref<x10::array::Point>, double> > 
>::_(x10aux::ref<x10::lang::Fun_0_1<x10aux::ref<x10::array::Point>, double> >, 
bool)
                at x10aux::ClassCast<x10aux::ref<x10::lang::Fun_0_1<double, 
double> >, x10aux::ref<x10::lang::Fun_0_1<x10aux::ref<x10::array::Point>, 
double> > >::_(x10aux::ref<x10::lang::Fun_0_1<x10aux::ref<x10::array::Point>, 
double> >, bool)
                at x10aux::ref<x10::lang::Fun_0_1<double, double> > 
x10aux::class_cast<x10aux::ref<x10::lang::Fun_0_1<double, double> >, 
x10aux::ref<x10::lang::Fun_0_1<x10aux::ref<x10::array::Point>, double> > 
>(x10aux::ref<x10::lang::Fun_0_1<x10aux::ref<x10::array::Point>, double> >)
                at Pi_X10_Parallel::execute(int)
                at 
Pi_X10_Parallel::main(x10aux::ref<x10::lang::Rail<x10aux::ref<x10::lang::String>
 > >)
                at x10aux::BootStrapClosure::apply()
                at x10_lang_Runtime__closure__1::apply()
                at x10::lang::Activity::run()
                at x10_lang_Runtime__Worker__closure__0::apply()
                at 
x10::lang::Runtime__Worker::loop(x10aux::ref<x10::lang::Runtime__Latch>, bool)
                at x10::lang::Runtime__Worker::apply()
                at x10::lang::Runtime__Pool::apply()
                at 
x10::lang::Runtime::start(x10aux::ref<x10::lang::VoidFun_0_0>, 
x10aux::ref<x10::lang::VoidFun_0_0>)
                at int x10aux::template_main<x10::lang::Runtime, 
Pi_X10_Parallel>(int, char**)
                at main
                at __libc_start_main
                at Pi_X10_Parallel() [0x41c9e9]
        |>

which doesn't really tell me anything useful in terms I can relate to my
code.  Using the Java backend:

        |> x10c Pi_X10_Parallel.x10
        x10c: 1 dynamically checked calls or field accesses.
        |> x10 Pi_X10_Parallel
        java.lang.ClassCastException
                at Pi_X10_Parallel$2.cast(Pi_X10_Parallel.java:110)
                at Pi_X10_Parallel.execute(Pi_X10_Parallel.java:115)
                at Pi_X10_Parallel.main(Pi_X10_Parallel.java:204)
                at Pi_X10_Parallel$Main$2.apply(Pi_X10_Parallel.java:183)
                at x10.lang.Runtime$5.apply(Runtime.java:4454)
                at x10.lang.Activity.run(Activity.java:217)
                at x10.lang.Runtime$Worker$3.apply(Runtime.java:3455)
                at x10.runtime.impl.java.Runtime.runAt(Runtime.java:105)
                at x10.lang.Runtime$Worker.loop(Runtime.java:3422)
                at x10.lang.Runtime$Worker.apply(Runtime.java:3308)
                at x10.lang.Runtime$Pool.apply(Runtime.java:3842)
                at x10.lang.Runtime.start(Runtime.java:4461)
                at Pi_X10_Parallel$Main.main(Pi_X10_Parallel.java:166)
                at x10.runtime.impl.java.Runtime.run(Runtime.java:50)
                at java.lang.Thread.run(Thread.java:636)
        |>

which at least gives me some pointers to lines in error, but only in
terms of the intermediate generated code:

        if (rtt != null && ! rtt.instanceof$(self)) throw new 
java.lang.ClassCastException();

OK, it is clear from the context of the line in the Java code that the
problematic code in X10 is:

        val sums = ( new Array[Double] ( numberOfTasks) ).lift
        ( computeSlice ) ;

but there is no way this is a reasonable way of debugging things.  Have
I just missed something that I should have realized?

-- 
Russel.
=============================================================================
Dr Russel Winder      t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Road    m: +44 7770 465 077   xmpp: rus...@russel.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder



------------------------------------------------------------------------------

_______________________________________________
X10-users mailing list
X10-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/x10-users

Reply via email to