# Guide:TAUChapel

### From TAU Wiki

(Difference between revisions)

Revision as of 03:26, 30 September 2013 (edit)Scottb (Talk | contribs) ← Previous diff |
Revision as of 03:58, 30 September 2013 (edit)Scottb (Talk | contribs) Next diff → |
||

Line 15: |
Line 15: | ||

c = 0; | c = 0; | ||

forall i in 1..n { | forall i in 1..n { | ||

- | if radius(p_x[i], p_y[i]) then | + | if (x ** 2 + y ** 2 <= 1) then |

c += 1; | c += 1; | ||

} | } | ||

Line 22: |
Line 22: | ||

} | } | ||

- | Notice that the '''forall''' here will compute each iteration in parallel, hence the need to define variable '''c''' as a '''sync''' variable. | + | Notice that the '''forall''' here will compute each iteration in parallel, hence the need to define variable '''c''' as a '''sync''' variable. Performance here is limited by the need to synchronize access to '''c'''. Take a look of this profile: |

+ | |||

+ | |||

+ | X% percent of the time is spent in synchronization. Let's see if we can do better. | ||

=== Procedure promotion === | === Procedure promotion === | ||

+ | |||

+ | Only feature of Chapel is procedure promotion where calling a procedure that takes scalar arguments with an array, the procedure is called for each element of the array in parallel: | ||

+ | |||

+ | proc compute_pi(p_x: [] real(64), p_y: [] real(64)) : real { | ||

+ | |||

+ | var c : int; | ||

+ | for i in in_circle(p_x, p_y) { | ||

+ | c += i; | ||

+ | } | ||

+ | return c * 4.0 / n; | ||

+ | |||

+ | } | ||

+ | proc in_circle(x: real(64), y: real(64)): bool | ||

+ | { | ||

+ | return (x ** 2 + y ** 2) <= 1; | ||

+ | } | ||

+ | |||

=== Reduction === | === Reduction === |

## Revision as of 03:58, 30 September 2013

## Contents |

# Chapel

## MonteCarlo example

To test out some Chapel's language features let program a MonteCarlo simulation to calculate PI. We can calculate PI by assess how many points with coordinates x,y fit in the unit circle, ie x^2+y^2<=1.

### Basic

Here is the basic routine that computes PI:

proc compute_pi(p_x: [] real(64), p_y: [] real(64)) : real { var c : sync int; c = 0; forall i in 1..n { if (x ** 2 + y ** 2 <= 1) then c += 1; } return c * 4.0 / n; }

Notice that the **forall** here will compute each iteration in parallel, hence the need to define variable **c** as a **sync** variable. Performance here is limited by the need to synchronize access to **c**. Take a look of this profile:

X% percent of the time is spent in synchronization. Let's see if we can do better.

### Procedure promotion

Only feature of Chapel is procedure promotion where calling a procedure that takes scalar arguments with an array, the procedure is called for each element of the array in parallel:

proc compute_pi(p_x: [] real(64), p_y: [] real(64)) : real { var c : int; for i in in_circle(p_x, p_y) { c += i; } return c * 4.0 / n; } proc in_circle(x: real(64), y: real(64)): bool { return (x ** 2 + y ** 2) <= 1; }