On 4/2/13 1:07 PM, Danny Munera wrote:
Hello Vijay,

Thank you for your fast reply.

I have implemented the code that you send me, but I have yet another problem. Because, regardless of the number of threads that I have in each place (X10_NTHERADS), the first async task (with the parallel function) ends first than the async task with the kill variable update. Then, the algorithm always waits for the end in all places.

I guess that is how the x10 activities scheduler works, unfortunately with this behavior I don't have any speedup with the parallelism.

You should probably call Runtime.probe() in between the computing calls, thus. This will give the runtime an opportunity to run and handle incoming asyncs, such as the one that will set killed to true.

Note that in general one must be careful when calling Runtime.probe(). At this time any incoming activity may be scheduled. If you have written your code already in such a way that your data structures are safe even if there are other concurrent activities then you should not have a problem.

class C {
  var killed:Boolean=false;

  static def compute() {
    val roots= PlaceLocalHandle.make[C](Dist.makeUnique(), ()=> new C());

    finish for (p in Place.places()) at(p)async{
sol = roots().parallel_function();
        val home =here;
for (p in Place.places() if (home.id <http://home.id> != p.id <http://p.id>) at(p) async root().killed=true;
     }
  }
  def parallel_function() {
     while (! killed) {
        continueComputing();
        Runtime.probe();
      }
     // store the result of computing in state on C, now retrieve it
     return result();
  }
}


An example of code using Runtime.probe is in the UTS application in the benchmarks directory:

http://x10.svn.sourceforge.net/viewvc/x10/benchmarks/trunk/PERCS/UTS/

Best,
Vijay

Is there a way for this part of the code creates a priority async task?

for (p in Place.places() if (home.id <http://home.id/> != p.id <http://p.id/>) at(p) async root().killed=true;

Regards,

Danny MĂșnera


On Tue, Apr 2, 2013 at 1:04 PM, Vijay Saraswat <vi...@saraswat.org <mailto:vi...@saraswat.org>> wrote:

    On 4/2/13 5:06 AM, Danny Munera wrote:
    Hello all,

    I'm trying to implement an algorithm in parallel. The idea is
    using each place as an algorithm independent instance, then,
    finishing the program when the first place reaches the solution.
    So far, I have something like this:

    finish for (p in Place.places()) at(p)async{
    sol = parallel_function();
    //kill other places
    }

    Currently, I don't have any idea about how to kill the other
    place, I have searched in x10 tutorials, language specification
    and the API, and I have not found anything.

    Do you have any idea to how to do that?


    You don't "kill" a place, you kill the activities running at a
    place. Have them periodically check for a variable being set. e.g.

    class C {
      var killed:Boolean=false;

      static def compute() {
        val roots= PlaceLocalHandle.make[C](Dist.makeUnique(), ()=>
    new C());

        finish for (p in Place.places()) at(p)async{
    sol = roots().parallel_function();
            val home =here;
    for (p in Place.places() if (home.id <http://home.id> != p.id
    <http://p.id>) at(p) async root().killed=true;
         }
      }
      def parallel_function() {
         while (! killed) continueComputing();
         // store the result of computing in state on C, now retrieve it
         return result();
      }
    }



------------------------------------------------------------------------------
Minimize network downtime and maximize team effectiveness.
Reduce network management and security costs.Learn how to hire 
the most talented Cisco Certified professionals. Visit the 
Employer Resources Portal
http://www.cisco.com/web/learning/employer_resources/index.html
_______________________________________________
X10-users mailing list
X10-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/x10-users

Reply via email to