Oblig4 seq = new Sequential(points); | Oblig4 seq = new Sequential(points); | ||||
Oblig4 par = new Parallel(points); | Oblig4 par = new Parallel(points); | ||||
Timer ts = new Timer().start(); | |||||
seq.solve(); | |||||
ts.end(); | |||||
System.out.println("Sequential: "+ts.prettyTime()); | |||||
Timer tseq = run(seq, null); | |||||
run(par, tseq); | |||||
} | |||||
static Timer run(Oblig4 o, Timer base) { | |||||
System.out.println(o.name+": filling..."); | |||||
o.fill(); | |||||
System.out.println("Done."); | |||||
Timer tp = new Timer().start(); | |||||
par.solve(); | |||||
tp.end(); | |||||
System.out.println("Parallel: "+tp.prettySpeedup(ts)); | |||||
Timer t = new Timer().start(); | |||||
o.solve(); | |||||
t.end(); | |||||
if (base == null) | |||||
System.out.println(o.name+": "+t.prettyTime()); | |||||
else | |||||
System.out.println(o.name+": "+t.prettySpeedup(base)); | |||||
seq.draw(); | |||||
return t; | |||||
} | } | ||||
} | } |
x = new int[n]; | x = new int[n]; | ||||
y = new int[n]; | y = new int[n]; | ||||
coHull = new IntList(); | coHull = new IntList(); | ||||
} | |||||
// Fill x and y arrays | |||||
void fill() { | |||||
points.fyllArrayer(x, y); | points.fyllArrayer(x, y); | ||||
} | } | ||||
class Parallel extends Oblig4 { | class Parallel extends Oblig4 { | ||||
int nThreads = Math.min( | |||||
Runtime.getRuntime().availableProcessors(), | |||||
16); | |||||
Parallel(NPunkter17 points) { | Parallel(NPunkter17 points) { | ||||
super(points); | super(points); | ||||
name = "Parallel"; | name = "Parallel"; | ||||
@Override | @Override | ||||
void solve() { | void solve() { | ||||
MinMaxXY minmax = findMinMax(); | |||||
MAX_X = x[minmax.maxX]; | |||||
MAX_Y = y[minmax.maxY]; | |||||
IntList indexes = new IntList(n); | |||||
for (int i = 0; i < n; ++i) | |||||
indexes.add(i); | |||||
} | |||||
class MinMaxXY { | |||||
int minX, maxX, maxY; | |||||
} | |||||
class FindMinMaxWorker extends Thread { | |||||
int start, end; | |||||
int minX, maxX, maxY; | |||||
FindMinMaxWorker(int start, int end) { | |||||
this.start = start; | |||||
this.end = end; | |||||
this.minX = start; | |||||
this.maxX = start; | |||||
this.maxY = start; | |||||
} | |||||
public void run() { | |||||
for (int i = start + 1; i < end; ++i) { | |||||
if (x[i] < x[minX]) | |||||
minX = i; | |||||
if (x[i] > x[maxX]) | |||||
maxX = i; | |||||
if (y[i] > y[maxY]) | |||||
maxY = i; | |||||
} | |||||
} | |||||
} | |||||
MinMaxXY findMinMax() { | |||||
FindMinMaxWorker[] workers = new FindMinMaxWorker[nThreads]; | |||||
int d = n / nThreads; | |||||
for (int i = 0; i < nThreads; ++i) { | |||||
workers[i] = new FindMinMaxWorker( | |||||
d * i, | |||||
(i == nThreads - 1 | |||||
? n - 1 | |||||
: d * (i + 1))); | |||||
workers[i].start(); | |||||
} | |||||
MinMaxXY minmax = new MinMaxXY(); | |||||
for (FindMinMaxWorker w: workers) { | |||||
try { w.join(); } catch (InterruptedException ex) {} | |||||
if (x[w.minX] < x[minmax.minX]) | |||||
minmax.minX = w.minX; | |||||
if (x[w.maxX] > x[minmax.maxX]) | |||||
minmax.maxX = w.maxX; | |||||
if (y[w.maxY] > y[minmax.maxY]) | |||||
minmax.maxY = w.maxY; | |||||
} | |||||
return minmax; | |||||
} | } | ||||
} | } |
MinMaxXY findMinMax() { | MinMaxXY findMinMax() { | ||||
int minX = 0; | int minX = 0; | ||||
int maxX = 0; | int maxX = 0; | ||||
int maxY = 0; | int maxY = 0; | ||||
for (int i = 1; i < n; ++i) { | for (int i = 1; i < n; ++i) { | ||||
int px = x[i]; | |||||
if (px < x[minX]) | |||||
if (x[i] < x[minX]) | |||||
minX = i; | minX = i; | ||||
if (px > x[maxX]) | |||||
if (x[i] > x[maxX]) | |||||
maxX = i; | maxX = i; | ||||
int py = y[i]; | |||||
if (py > y[maxY]) | |||||
if (y[i] > y[maxY]) | |||||
maxY = i; | maxY = i; | ||||
} | } | ||||