/bench/kilim/bench/BigPingPong.java

http://github.com/kilim/kilim · Java · 113 lines · 80 code · 16 blank · 17 comment · 14 complexity · 52027f9dbf1dc16536accee905b9fa34 MD5 · raw file

  1. /* Copyright (c) 2006, Sriram Srinivasan
  2. *
  3. * You may distribute this software under the terms of the license
  4. * specified in the file "License"
  5. */
  6. package kilim.bench;
  7. import kilim.*;
  8. public class BigPingPong extends Task {
  9. static Mailbox<Msg>[] mboxes;
  10. static Mailbox<Msg> mainmb;
  11. @SuppressWarnings("unchecked")
  12. public static void main(String args[]) throws Exception {
  13. boolean noargs = args.length == 0;
  14. int nTasks = noargs ? 10 : Integer.parseInt(args[0]);
  15. int nSchedulers = noargs ? 1 : Integer.parseInt(args[1]);
  16. int nThreadsPerScheduler = noargs ? 1 : Integer.parseInt(args[2]);
  17. Scheduler [] schedulers = new Scheduler[nSchedulers];
  18. System.out.println("nTasks : " + nTasks + ", nSchedulers: " + nSchedulers +
  19. ", nThreadsPerScheduler: " + nThreadsPerScheduler);
  20. for (int c = 0; c < 13; c++) { // Timing loop
  21. long beginTime = System.currentTimeMillis();
  22. mboxes = new Mailbox[nTasks];
  23. // mainmb = new Mailbox<Msg>(/* initial size = */ nTasks);
  24. mainmb = new Mailbox<Msg>(/* initial size = */ nTasks, nTasks);
  25. for (int i = 0; i < nTasks; i++) {
  26. mboxes[i] = new Mailbox<Msg>(/* initial size = */ nTasks, nTasks);
  27. }
  28. for (int i = 0 ; i < nSchedulers; i++) {
  29. schedulers[i] = Scheduler.make(nThreadsPerScheduler);
  30. }
  31. BigPingPong[] tasks = new BigPingPong[nTasks];
  32. for (int i = 0; i < nTasks; i++) {
  33. BigPingPong t = new BigPingPong(i);
  34. tasks[i] = t;
  35. t.setScheduler(schedulers[i % nSchedulers]);
  36. t.start();
  37. }
  38. for (int i = 0; i < nTasks; i++) {
  39. // mainmb.getWait();
  40. Msg m = mainmb.getb(20000);
  41. // Msg m = mainmb.getb();
  42. if (m == null) {
  43. System.err.println("TIME OUT (20s). No of tasks finished: " + i);
  44. // for (BigPingPong t: tasks) {
  45. // System.err.println(t);
  46. // }
  47. // for (Mailbox mb: mboxes) {
  48. // System.err.println(mb);
  49. // }
  50. System.exit(1);
  51. }
  52. }
  53. // Total number of messages: from each task to every other task,
  54. // and finally one to the main mailbox to signal completion
  55. // nTasks * (nTasks - 1) + nTasks
  56. int nMessages = nTasks * nTasks;
  57. System.out.println("Elapsed ms (" + nTasks + " tasks, " +
  58. nMessages + " messages) " + (System.currentTimeMillis() - beginTime));
  59. System.gc();
  60. Thread.sleep(1000);
  61. for (int i = 0; i < nSchedulers; i++) {
  62. schedulers[i].shutdown();
  63. }
  64. }
  65. System.exit(0);
  66. }
  67. int n; // Task's position in the slot array
  68. BigPingPong(int num) {
  69. n = num;
  70. }
  71. boolean done = false;
  72. int numRcvd = 0;
  73. public void execute() throws Pausable {
  74. done = false;
  75. int l = mboxes.length;
  76. Msg mymsg = new Msg(id);
  77. int me = n;
  78. Mailbox<Msg> mymb = mboxes[me];
  79. for (int i = 0; i < l; i++) {
  80. if (i == me)
  81. continue;
  82. mboxes[i].put(mymsg);
  83. }
  84. for (int i = 0; i < l - 1; i++) {
  85. Msg m = mymb.get();
  86. assert m != null;
  87. numRcvd++;
  88. }
  89. mainmb.put(mymsg);
  90. done = true;
  91. }
  92. private static class Msg {
  93. static Msg gMsg = new Msg(0);
  94. int from;
  95. Msg(int f) {from = f;}
  96. };
  97. }