kilim.bench.BigPingPong Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of kilim Show documentation
Show all versions of kilim Show documentation
Coroutines, continuations, fibers, actors and message passing for the JVM
/* 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;}
};
}