Estimate π using integral. Parallelization performed by work distribution (loop parallelization).
The value of πis calculated using rectangles method that approximates following integral:
π = ∫ 4.0 / (1 + x2 ) dx
In our code, the interval is divided into equal subintervals and we take top middle point of each subinterval to calculate area of the rectangle.
The calculations will start by executing the main method from PcjExamplePiI class. Four tasks will be involved in calculations: on local machine. The listing contains comments that should clarify what program is doing. The user can easily change number of tasks by providing more host names to the deploy method. The PCJ will launch calculations on specified nodes.
importorg.pcj.NodesDescription;importorg.pcj.PCJ;importorg.pcj.StartPoint;importorg.pcj.Storage;importorg.pcj.PcjFuture;importorg.pcj.RegisterStorage;@RegisterStorage(PcjExamplePiI.Shared.class)publicclassPcjExamplePiIimplementsStartPoint {privatedoublef(finaldouble x) {return (4.0/ (1.0+ x * x)); } @Storage(PcjExamplePiI.class)enumShared { sum }double sum; @Overridepublicvoidmain() {PCJ.barrier();double time =System.nanoTime();long nAll =1_280_000_000;double w =1.0/ (double) nAll; sum =0.0;// Calculate partial results with the cyclic distributionfor (int i =PCJ.myId(); i < nAll; i +=PCJ.threadCount()) { sum = sum +f(((double) i +0.5) * w); } sum = sum * w;// Wait for all tasksk to finishPCJ.barrier();// Gather resultsPcjFuture cL[] =newPcjFuture[PCJ.threadCount()];double pi = sum;if (PCJ.myId() ==0) {for (int p =1; p <PCJ.threadCount(); p++) { cL[p] =PCJ.asyncGet(p,Shared.sum); }for (int p =1; p <PCJ.threadCount(); p++) { pi = pi + cL[p].get(); } }PCJ.barrier();// Print results time =System.nanoTime() - time;if (PCJ.myId() ==0) {System.out.format(" %.7f %.7f time %.5f \n", pi, time *1.0E-9, time); } }publicstaticvoidmain(String[] args) throwsIOException {String nodesFile ="nodes.txt";PCJ.executionBuilder (PcjExample.class).addNodes(newFile("nodes.txt")).start(); }}