Hi Nimit --

First, this would be a great stack overflow question if you would be willing to post it there (in the sense that I think it's a common question and that others would find value in it).

Yes, recursive parallelism is supported in Chapel. The main thing to know is that Chapel's type inference machinery is currently not very good with recursive procedures, and therefore such routines need to declare an explicit return type.

I'll demonstrate a few ways to write this using a (naive) recurisve computation of fibonacci, just because of its famiarity.

In the first, I'll use a `cobegin` statement which says to execute each
of its child statements in a separate task.  See the users' guide for
details: https://chapel-lang.org/docs/latest/users-guide/taskpar/cobegin.html

---

proc fib(n): n.type {
  assert(n >= 0);
  if n == 0 || n == 1 then
    return 1;
  else {
    var f1, f2: n.type;
    cobegin with (ref f1, ref f2) {
      f1 = fib(n-1);
      f2 = fib(n-2);
    }
    return f1 + f2;
  }
}

for i in 0..10 do
  writeln(fib(i));

---

The main downside to this approach is that, because the cobegin introduces a new scope, the 'f1' and 'f2' variables need to be declared outside of it (i.e., there's no opportunity to have their types inferred) and then they need to be passed in by reference to the tasks so that they can be modified.

The second way is to use the begin statement (https://chapel-lang.org/docs/latest/users-guide/taskpar/begin.html):

---

proc fib(n): n.type {
  assert(n >= 0);
  if n == 0 || n == 1 then
    return 1;
  else {
    var f1$: sync n.type;
    begin f1$ = fib(n-1);

    var f2 = fib(n-2);

    return f1$ + f2;
  }
}

for i in 0..10 do
  writeln(fib(i));

---

This fires off one task to compute one of the recursive calls, storing its result in a synchronized variable to make sure we don't return before it is complete. Then the original task calls the second recursive call and we return the sum. The users guide doesn't yet have a sync variable section, but the idea is that, by default, reads block until the variable is written and writes block until it is read. Here's a primer for more
information:

        https://chapel-lang.org/docs/latest/primers/syncsingle.html


I think the way we'd really like to write this is using a concept
we've discusssed but not implemented called a begin expression,
which would look something like this:

---

proc fib(n): n.type {
  assert(n >= 0);
  if n == 0 || n == 1 then
    return 1;
  else {
    return (begin fib(n-1)) + fib(n-2);  // or maybe '+ (begin fib(n-2))'
  }
}

for i in 0..10 do
  writeln(fib(i));

---

This would effectively put a synchronized variable in place of each of the begin expressions to ensure that we didn't try to compute the sum before returning it.

Hope this is helpful,
-Brad






On Thu, 25 Jan 2018, Nimit Bhardwaj wrote:

Just was thinking of parallel recursion, I explain what it is (its just my
thinking, it may be hypothetical), suppose I have an algorithm which is
using recursion, just suppose its just sum of array algorithm, I want to
know if there is a way in chapel which can use recursion to work in
parallel, to support it I provide a simple algorithm below to add the
numbers of array:

Algo sumOfArray(A, i, j):
   if j - i + 1 == 2:
       return A[i] + A[j]
   else if j - i + 1 == 1:
       return A[i]
   else:
       mid = (i + j) / 2 //this integer division
       return sumOfArray(A, i, mid) + sumOfArray(A, mid + 1, j)


The above algorithm works as given, it sums the sum of left and right
subsection of array from mid of array, this type of recursion is simple, in
sense that it makes the *disjoint* sections, disjoint in sense that ranges
between different recursions don't overlap with i and j, so any recursion
which is disjoint, even if its updating the data structure can be executed
parallely, so I want to know if there is a way to run these two calls as in
the above algorithm sumOfArrays parallely, this idea will also work in
segment trees, where even the ranges made are disjoint.

I want to know if there is any way to work parallely, this comes in handy,
I want to implement and see the effect of parallelism for a segment tree.


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Chapel-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/chapel-users

Reply via email to