# 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.

```java
import org.pcj.NodesDescription;
import org.pcj.PCJ;
import org.pcj.StartPoint;
import org.pcj.Storage;
import org.pcj.PcjFuture;
import org.pcj.RegisterStorage;

@RegisterStorage(PcjExamplePiI.Shared.class)
public class PcjExamplePiI implements StartPoint {

    private double f(final double x) {
        return (4.0 / (1.0 + x * x));
    }

    @Storage(PcjExamplePiI.class)
    enum Shared {
        sum
    }
    double sum;

    @Override
    public void main() {

        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 distribution
        for (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 finish
        PCJ.barrier();

// Gather results
        PcjFuture cL[] = new PcjFuture[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);
        }
    }

    public static void main(String[] args) throws IOException {
    String nodesFile  = "nodes.txt";
    PCJ.executionBuilder (PcjExample.class)
                .addNodes(new File("nodes.txt"))
                .start();
    }
}


```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://pcj.icm.edu.pl/examples/loop-parallelization.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
