use Random; use Math; use Time; use BlockDist; config const n = 1000000; const PI = 3.141592653589793238462643; proc main() { const space = {1..n}; var Dom: domain(1) dmapped Block(boundingBox=space) = space; var p_x: [Dom] real(64); var p_y: [Dom] real(64); points(p_x, p_y); writeln("Calculate PI with data parallelism"); var start = getCurrentTime(); var pi = compute_pi(p_x, p_y); var stop = getCurrentTime(); writeln("PI estimate: ", format("#.#####", pi)); writeln("PI error: ", format("#.#####", abs(pi - PI))); writeln("Time: ", format("#.##", stop - start)); } proc points(p_x: [] real(64), p_y: [] real(64)) { fillRandom(p_x); fillRandom(p_y); return; } proc in_circle(x: real(64), y: real(64)): bool { return (x ** 2 + y ** 2) <= 1; } proc compute_pi(p_x: [] real(64), p_y: [] real(64)) : real { var c = +reduce in_circle(p_x, p_y); return c * 4.0 / n; }