University stuff.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

MultiRadixPar.java 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import java.util.*;
  2. class MultiRadixPar{
  3. int n;
  4. volatile int[] a;
  5. final static int NUM_BIT = 7; // alle tall 6-11 .. finn ut hvilken verdi som er best
  6. int nThreads = Math.min(
  7. Runtime.getRuntime().availableProcessors(),
  8. 8);
  9. class PartAWorker implements Runnable {
  10. int start;
  11. int end;
  12. int biggest;
  13. PartAWorker(int start, int end) {
  14. this.start = start;
  15. this.end = end;
  16. this.biggest = a[start];
  17. }
  18. public void run() {
  19. for (int i = start + 1; i < end; ++i) {
  20. if (a[i] > biggest)
  21. biggest = a[i];
  22. }
  23. }
  24. }
  25. int [] radixMulti(int [] a_) {
  26. this.a = a_;
  27. // 1-5 digit radixSort of : a[]
  28. int max = a[0], numBit = 2, numDigits, n =a.length;
  29. int [] bit ;
  30. // a) finn max verdi i a[]
  31. Timer ta = new Timer().start();
  32. int d = a.length / nThreads;
  33. Thread[] threads = new Thread[nThreads];
  34. PartAWorker[] workers = new PartAWorker[nThreads];
  35. for (int i = 0; i < nThreads; ++i) {
  36. PartAWorker w = workers[i] = new PartAWorker(
  37. d * i, i == nThreads - 1 ? a.length : d * (i + 1));
  38. Thread t = threads[i] = new Thread(w);
  39. t.start();
  40. }
  41. for (Thread t: threads) { try { t.join(); } catch (InterruptedException ex) {} }
  42. max = workers[0].biggest;
  43. for (int i = 1; i < nThreads; ++i) {
  44. if (workers[i].biggest > max)
  45. max = workers[i].biggest;
  46. }
  47. while (max >= (1L<<numBit) )numBit++; // antall binaere siffer i max
  48. System.out.println("A: "+ta.end().prettyTime());
  49. System.out.println(max);
  50. // bestem antall bit i numBits sifre
  51. numDigits = Math.max(1, numBit/NUM_BIT);
  52. bit = new int[numDigits];
  53. int rest = (numBit%numDigits), sum =0;;
  54. // fordel bitene vi skal sortere paa jevnt
  55. for (int i = 0; i < bit.length; i++){
  56. bit[i] = numBit/numDigits;
  57. if ( rest-- > 0) bit[i]++;
  58. }
  59. int[] t=a, b = new int [n];
  60. for (int i =0; i < bit.length; i++) {
  61. radixSort( b,bit[i],sum ); // i-te siffer fra a[] til b[]
  62. sum += bit[i];
  63. // swap arrays (pointers only)
  64. t = a;
  65. a = b;
  66. b = t;
  67. }
  68. return a;
  69. } // end radixMulti
  70. class PartDWorker implements Runnable {
  71. int start, end, shift, mask;
  72. int[] b, count;
  73. PartDWorker(int start, int end, int[] b, int[] count, int shift, int mask) {
  74. this.start = start;
  75. this.end = end;
  76. this.b = b;
  77. this.count = count;
  78. this.shift = shift;
  79. this.mask = mask;
  80. }
  81. public void run() {
  82. for (int i = 0; i < n; i++) {
  83. int var = (a[i] >>> shift) & mask;
  84. if (var >= start && var < end) {
  85. b[count[var]++] = a[i];
  86. }
  87. }
  88. }
  89. }
  90. /** Sort a[] on one digit ; number of bits = maskLen, shiftet up 'shift' bits */
  91. void radixSort (int [] b, int maskLen, int shift){
  92. int n = a.length;
  93. int mask = (1<<maskLen) -1;
  94. int [] count = new int [mask+1];
  95. int biggestVar = 0;
  96. // b) count=the frequency of each radix value in a
  97. //Timer tb = new Timer().start();
  98. for (int i = 0; i < n; i++) {
  99. int var = (a[i]>>>shift) & mask;
  100. count[var]++;
  101. if (var > biggestVar)
  102. biggestVar = var;
  103. }
  104. //System.out.println("B: "+tb.end().prettyTime());
  105. // c) Add up in 'count' - accumulated values
  106. Timer tc = new Timer().start();
  107. int j = 0;
  108. int acumVal = 0;
  109. for (int i = 0; i <= mask; i++) {
  110. j = count[i];
  111. count[i] = acumVal;
  112. acumVal += j;
  113. }
  114. System.out.println("C: "+tc.end().prettyTime());
  115. // It doesn't make sense to do stuff in parallel if all values are 0
  116. if (biggestVar == 0) {
  117. System.out.println("biggest is 0");
  118. for (int i = 0; i < b.length; i++) {
  119. b[i] = 0;
  120. }
  121. return;
  122. }
  123. Timer td = new Timer().start();
  124. int d = biggestVar / nThreads;
  125. Thread[] threads = new Thread[nThreads];
  126. for (int i = 0; i < nThreads; ++i) {
  127. int start = d * i;
  128. int end = i == nThreads - 1 ? n + 1 : d * (i + 1);
  129. PartDWorker w = new PartDWorker(start, end, b, count, shift, mask);
  130. Thread t = threads[i] = new Thread(w);
  131. t.start();
  132. }
  133. for (Thread t: threads) {
  134. try { t.join(); } catch (InterruptedException ex) {}
  135. }
  136. System.out.println("par D: "+td.end().prettyTime());
  137. }// end radixSort
  138. void testSort(int [] a){
  139. for (int i = 0; i< a.length-1;i++) {
  140. if (a[i] > a[i+1]){
  141. System.out.println("SorteringsFEIL på plass: "+i +" a["+i+"]:"+a[i]+" > a["+(i+1)+"]:"+a[i+1]);
  142. return;
  143. }
  144. }
  145. }// end simple sorteingstest
  146. }// end SekvensiellRadix