Difference between revisions of "Guide:TAUChapel"
Line 33: | Line 33: | ||
proc compute_pi(p_x: [] real(64), p_y: [] real(64)) : real { | proc compute_pi(p_x: [] real(64), p_y: [] real(64)) : real { | ||
− | var c : int; | + | var c : sync int; |
− | + | forall i in in_circle(p_x, p_y) { | |
c += i; | c += i; | ||
} | } | ||
Line 47: | Line 47: | ||
=== Reduction === | === Reduction === | ||
+ | |||
+ | Furthermore with reorganization will allow us to take advantage of Chapel's built in reduction: | ||
+ | |||
+ | proc compute_pi(p_x: [] real(64), p_y: [] real(64)) : real { | ||
+ | |||
+ | var c : int; | ||
+ | c= +reduce in_circle(p_x, p_y); | ||
+ | return c * 4.0 / n; | ||
+ | |||
+ | } | ||
=== Multiple Locals === | === Multiple Locals === | ||
=== Performance Results === | === Performance Results === |
Revision as of 04:26, 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 : sync int; forall 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
Furthermore with reorganization will allow us to take advantage of Chapel's built in reduction:
proc compute_pi(p_x: [] real(64), p_y: [] real(64)) : real { var c : int; c= +reduce in_circle(p_x, p_y); return c * 4.0 / n; }