University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Parallel.java 1.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. class Parallel extends Oblig4 {
  2. int nThreads = Math.min(
  3. Runtime.getRuntime().availableProcessors(),
  4. 16);
  5. Parallel(NPunkter17 points) {
  6. super(points);
  7. name = "Parallel";
  8. }
  9. @Override
  10. void solve() {
  11. MinMaxXY minmax = findMinMax();
  12. MAX_X = x[minmax.maxX];
  13. MAX_Y = y[minmax.maxY];
  14. IntList indexes = new IntList(n);
  15. for (int i = 0; i < n; ++i)
  16. indexes.add(i);
  17. }
  18. class MinMaxXY {
  19. int minX, maxX, maxY;
  20. }
  21. class FindMinMaxWorker extends Thread {
  22. int start, end;
  23. int minX, maxX, maxY;
  24. FindMinMaxWorker(int start, int end) {
  25. this.start = start;
  26. this.end = end;
  27. this.minX = start;
  28. this.maxX = start;
  29. this.maxY = start;
  30. }
  31. public void run() {
  32. for (int i = start + 1; i < end; ++i) {
  33. if (x[i] < x[minX])
  34. minX = i;
  35. if (x[i] > x[maxX])
  36. maxX = i;
  37. if (y[i] > y[maxY])
  38. maxY = i;
  39. }
  40. }
  41. }
  42. MinMaxXY findMinMax() {
  43. FindMinMaxWorker[] workers = new FindMinMaxWorker[nThreads];
  44. int d = n / nThreads;
  45. for (int i = 0; i < nThreads; ++i) {
  46. workers[i] = new FindMinMaxWorker(
  47. d * i,
  48. (i == nThreads - 1
  49. ? n - 1
  50. : d * (i + 1)));
  51. workers[i].start();
  52. }
  53. MinMaxXY minmax = new MinMaxXY();
  54. for (FindMinMaxWorker w: workers) {
  55. try { w.join(); } catch (InterruptedException ex) {}
  56. if (x[w.minX] < x[minmax.minX])
  57. minmax.minX = w.minX;
  58. if (x[w.maxX] > x[minmax.maxX])
  59. minmax.maxX = w.maxX;
  60. if (y[w.maxY] > y[minmax.maxY])
  61. minmax.maxY = w.maxY;
  62. }
  63. return minmax;
  64. }
  65. }