Hallo,
wir sollen für eine aufgabe in softwaretechnik I die methode unten parallelisieren, so dass die schneller ausgeführt wird. Dazu haben wir einen Testfall bekommen, der einmal sequentiell das berechnen soll und danach mit mehrern threads.
Bis jetzt habe ich die Differenzen parallelisiert indem jeder thread in der run() methode
temp = f1 - f2[i] ;
ausrechnet in einem bestimmten bereich und in ein temporäres array zwischenspeichert. Wenn alle fäden fertig sind wird sequentiell
Das Problem dabei es wird dadurch langsamer.
Kann mir jemand vielleicht einen anderen Ansatz liefern mit dem dieses Problem schneller zu lösen ist?
Alles anzeigen
wir sollen für eine aufgabe in softwaretechnik I die methode unten parallelisieren, so dass die schneller ausgeführt wird. Dazu haben wir einen Testfall bekommen, der einmal sequentiell das berechnen soll und danach mit mehrern threads.
Bis jetzt habe ich die Differenzen parallelisiert indem jeder thread in der run() methode
temp = f1 - f2[i] ;
ausrechnet in einem bestimmten bereich und in ein temporäres array zwischenspeichert. Wenn alle fäden fertig sind wird sequentiell
Das Problem dabei es wird dadurch langsamer.
Kann mir jemand vielleicht einen anderen Ansatz liefern mit dem dieses Problem schneller zu lösen ist?
Quellcode
- /**
- * Ermittelt die Earth Mover's Distance zwischen zwei gleich großen
- * Gleitkommazahlenfeldern (im Kontext: Graustufenhistogramme).
- *
- * Der Algorithmus ermittelt die Summe der "Mengen", die von Index zu Index
- * "bewegt" werden müssen, um die beiden Felder deckungsgleich zu bekommen.
- *
- * @param f1
- * Das eine Gleitkommazahlenfeld
- * @param f2
- * Das andere Gleitkommazahlenfeld
- * @return Gleitkommawert, der die Distanz der beiden Gleitkommazahlenfelder
- * angibt.
- */
- float calcEarthMovingDistance(float[] f1, float[] f2) {
- if (f1.length != f2.length) {
- throw new IllegalArgumentException(
- "Die Histogramme sind nicht gleich breit!");
- }
- final float worstCaseDiff = f1.length - 1;
- float sum = 0;
- float diff = 0;
- for (int i = 0; i < f1.length; i++) {
- diff = (f1[i] + diff) - f2[i];
- sum += Math.abs(diff);
- }
- sum /= worstCaseDiff;
- return Math.abs(1 - sum);
- }