All Downloads are FREE. Search and download functionalities are using the official Maven repository.

kilim.bench.BigPingPong Maven / Gradle / Ivy

Go to download

Coroutines, continuations, fibers, actors and message passing for the JVM

There is a newer version: 2.0.2-jdk7
Show newest version
/* Copyright (c) 2006, Sriram Srinivasan
 *
 * You may distribute this software under the terms of the license 
 * specified in the file "License"
 */

package kilim.bench;
import kilim.*;
public class BigPingPong extends Task {
    static Mailbox[] mboxes;
    static Mailbox mainmb;

    
    @SuppressWarnings("unchecked")
    public static void main(String args[]) throws Exception {
        boolean noargs = args.length == 0;
        int nTasks = noargs ? 10 : Integer.parseInt(args[0]);
        int nSchedulers = noargs ? 1 : Integer.parseInt(args[1]);
        int nThreadsPerScheduler = noargs ? 1 : Integer.parseInt(args[2]);
        Scheduler [] schedulers = new Scheduler[nSchedulers];
        
        System.out.println("nTasks : " + nTasks + ", nSchedulers: " + nSchedulers + 
                ", nThreadsPerScheduler: " + nThreadsPerScheduler);
        
        for (int c = 0; c < 13; c++) { // Timing loop
            long beginTime = System.currentTimeMillis();
            mboxes = new Mailbox[nTasks];
//            mainmb = new Mailbox(/* initial size = */ nTasks);
            mainmb = new Mailbox(/* initial size = */ nTasks, nTasks);
            for (int i = 0; i < nTasks; i++) {
                mboxes[i] = new Mailbox(/* initial size = */ nTasks, nTasks);
            }

            for (int i = 0 ; i < nSchedulers; i++) {
                schedulers[i] = new Scheduler(nThreadsPerScheduler);
            }
            
            BigPingPong[] tasks = new BigPingPong[nTasks];

            for (int i = 0; i < nTasks; i++) {
                BigPingPong t = new BigPingPong(i);
                tasks[i] = t;
                t.setScheduler(schedulers[i % nSchedulers]);
                t.start();
            }
            
            for (int i = 0; i < nTasks; i++) {
//                mainmb.getWait();
                Msg m = mainmb.getb(20000);
//              Msg m = mainmb.getb();
                if (m == null) {
                    System.err.println("TIME OUT (20s). No of tasks finished: " + i);
//                    for (BigPingPong t: tasks) {
//                        System.err.println(t);
//                    }
//                    for (Mailbox mb: mboxes) {
//                        System.err.println(mb);
//                    }
                    System.exit(1);
                }
            }
            // Total number of messages: from each task to every other task,
            // and finally one to the main mailbox to signal completion
            // nTasks * (nTasks - 1) + nTasks
            int nMessages = nTasks * nTasks; 
            System.out.println("Elapsed ms (" + nTasks + " tasks, " + 
                    nMessages + " messages) " + (System.currentTimeMillis() - beginTime));
            System.gc();
            Thread.sleep(1000);
            for (int i = 0; i < nSchedulers; i++) {
                schedulers[i].shutdown();
            }
        }
        System.exit(0);
    }

    int n; // Task's position in the slot array
    BigPingPong(int num) {
        n = num;
    }
    
    boolean done = false;
    int  numRcvd = 0;
    
    public void execute() throws Pausable {
        done = false;
        int l = mboxes.length;
        Msg mymsg = new Msg(id);
        
        int me = n;
        Mailbox mymb = mboxes[me];
        
        for (int i = 0; i < l; i++) {
            if (i == me)
                continue;
            mboxes[i].put(mymsg);
        }
        for (int i = 0; i < l - 1; i++) {
            Msg m = mymb.get();
            assert m != null;
            numRcvd++;
        }
        mainmb.put(mymsg);
        done = true;
    }
    
    private static class Msg {
        static Msg gMsg = new Msg(0);
        int from;
        Msg(int f) {from = f;}
    };
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy