====== Solutions for assignments in Parallele Programmierung. ======
See [[eth:ETH]]. [[ParallelPrefix]]
===== Assignment 1 =====
/**
*
* @author Moritz Hoffmann
*
*/
public class Assignment1 {
/**
* Main method
*
* @param args
* List of numbers.
*/
public static void main(String[] args) {
int max = (1 << 16) - 1;
int min = (-1 ^ (1 << 16)) + 1;
for (String str : args) {
try {
int i = Integer.parseInt(str);
if (i >= min && i <= max) {
System.out.println(i + 1);
} else {
System.out.println("Number " + i + " out of range.");
}
} catch (NumberFormatException e) {
System.out.println("Failed to convert to number: " + str);
}
}
}
}
===== Assignment 2 =====
/**
*
* @author Moritz Hoffmann
*
*/
public class Assignment2 {
private final class MyException extends Exception {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
public MyException(String message, Throwable cause) {
super(message, cause);
}
public MyException(Throwable cause) {
super(cause);
}
}
/**
* Main method
*
* @param args
* List of numbers.
*/
public static void main(String[] args) {
new Assignment2().process(args);
}
/**
* Process the string array.
*
* @param args
* Same as from {@link Assignment1#main(String[])}
*/
private void process(String[] args) {
for (String str : args) {
try {
int i = Integer.parseInt(str);
try {
if (i < 0) {
throw new MyException(Integer.toString(i));
}
System.out.println(i + 1);
} catch (MyException e) {
System.err.println("Negative value " + e.getMessage()
+ " -- bailing out.");
break;
}
} catch (NumberFormatException e) {
System.out.println("Failed to convert to number: " + str);
}
}
}
}
Bounded buffer for assignment 3:
package hw03;
public class BoundedBuffer implements Buffer {
private static final int SIZE = 5;
private final int[] buffer = new int[SIZE];
private int pos = -1;
public int read() throws BufferEmptyException {
return get();
}
public void write(int i) throws BufferFullException {
set(i);
}
private synchronized int get() {
while (pos == -1) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// the first element
int v = buffer[0];
System.arraycopy(buffer, 1, buffer, 0, pos);
pos = pos - 1;
this.notifyAll();
return v;
}
private synchronized void set(int v) {
System.out.println(pos);
while (pos >= SIZE - 1) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
pos = pos + 1;
buffer[pos] = v;
this.notifyAll();
}
}
===== Assignment 4 =====
package hw04;
public class MTMergeSort {
/**
* A sorter runnable. This will create as many sub threads as passed by the
* threads parameter. If it is an odd number, one half will be sorted using
* a thread, the other will be sorted by this object.
*
* @author Moritz Hoffmann
*
*/
private final class Sorter implements Runnable {
private final int l, r;
private final Thread left, right;
private final int middle;
private final SeqMergeSort sorter;
Sorter(int left, int right, int threads, SeqMergeSort sorter) {
this.sorter = sorter;
threads = threads - 1;
l = left;
r = right;
middle = (l + r) / 2;
if (threads > 1) {
// construct both left and right threads
final int thalf = threads / 2;
this.left = new Thread(new Sorter(l, middle, threads - thalf,
sorter));
this.right = new Thread(
new Sorter(middle + 1, r, thalf, sorter));
} else if (threads == 1) {
// construct only left thread, right part will be sorted by
// this.
this.left = new Thread(new Sorter(l, middle, 0, sorter));
this.right = null;
} else {
this.left = this.right = null;
}
}
public void run() {
// System.out.println("Running " + Thread.currentThread().getId());
if (this.left == null && this.right == null) {
// sort here
sorter.mergesort(l, r);
} else if (this.left != null && this.right == null) {
// let left sort in background
this.left.start();
// sort here
sorter.mergesort(middle + 1, r);
try {
// wait for left to finish.
this.left.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// merge the results together.
sorter.merge(l, middle, middle + 1, r);
} else {
// sort both left and right in a separate thread.
left.start();
right.start();
try {
left.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
right.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// merge the results together.
sorter.merge(l, middle, middle + 1, r);
}
// System.out.println("Returning " +
// Thread.currentThread().getId());
}
}
private final int[] to_sort;
private final int total_sort_threads;
public MTMergeSort(int[] to_sort, int no_threads) {
this.to_sort = to_sort;
this.total_sort_threads = no_threads;
}
public void sort() {
// Your code here to perform multithreaded merge sort
// You should use SeqMergeSort.sort() and SeqMergeSort.merge()
// for sorting and merging, respectively.
// total number of sorting threads = this.total_sort_threads
// The shared sorter instance.
SeqMergeSort mergesort = new SeqMergeSort(to_sort);
// construct a new sorter instance.
Sorter s = new Sorter(0, to_sort.length - 1, total_sort_threads,
mergesort);
// call it synchronously as it can use the main thread as well.
long t = System.nanoTime();
s.run();
System.out.println((double) (System.nanoTime() - t) / 1000000 + "[ms]");
}
}