COSTA: COSt and Termination Analyzer for Java Bytecode
    
    // costa -cp '~/Systems/costa-extra/Experiments' -c x10/ArraySum -m 'main([Ljava/lang/String;)V' -p x10_total interm_results = true
// costa -cp '~/Systems/costa-extra/Experiments' -c x10/ArraySum -m 'main([Ljava/lang/String;)V' -p x10_peak interm_results = true

package x10;


public class ArraySum {

    int sum;
    int size;
    int[] data;
    int[] r;

    public ArraySum(int n) {
        size = n;
	for (int i=0; i<n; i++) {
		r[i] = i;
		data[i] = 1;
	    }
	sum = 0;
    }

    public void sum(int numThreads) {
	int mySize = size/numThreads;
	Conc.finish_begin();
	sum_1(data, mySize, numThreads);
	Conc.finish_end();
    }
    
    public void sum_1(int data[], int mySize, int numThreads) {
	for (int p=0; p<numThreads; p++) {
            Conc.async_begin();
	    sum_2(data, p*mySize, (p+1)*mySize);
	    Conc.async_end();
	}
    }

    public void sum_2(int a[], int start, int last) {
	int mySum = 0;
	for (int i=start; i<last; i++) {
	    mySum+=a[i];
	}
	sum += mySum;
    }

    public static void main(String args[]) {

        int size = 5*1000*1000;

        ArraySum a = new ArraySum(size);

	for (int i=1; i<args.length; i*=2) {
	    a.sum = 0;
	    a.sum(i);
	}
	
    }
}