|
|
@@ -6,16 +6,17 @@
|
|
6
|
6
|
|
|
7
|
7
|
3. Mit einer höher werdenden Zahl von Threads steigt auch die Zahl der möglichen Deadlocks. Das Verhindern von diesen ist nur mithilfe der Flag `-n 1` möglich, wodurch nur ein Thread läuft.
|
|
8
|
8
|
|
|
9
|
|
-4.
|
|
|
9
|
+4. Hier wird ein Deadlock vermieden, da eine Fallunterscheidung gemacht wird, welche die Reihenfolge der Locks angibt. Im Fall, dass `src` und `dst` dieselben sind, muss nur ein Lock gesetzt werden. Deswegen gibt es hier einen Spezialfall.
|
|
10
|
10
|
|
|
11
|
|
-5.
|
|
|
11
|
+5. Mit den Flags `-t -n 2 -l 100000 -d` braucht der Code etwa `0.05 s` für die Ausführung. Eine Verdopplung der Zahl der Loops hat auch eine Verdopplung der Ausführungszeit zur Folge, sodass wir eine Zeit von ca. `0.9 s` bekommen. Bei einer Verdoppelung der Threadzahl nimmt die Ausführungsdauer weiter zu, sodass wir mit den Flags `-t -n 4 -l 100000 -d` eine Zeit von `~ 0.10 s` und mit den Flags `-t -n 4 -l 200000 -d` von `~ 0.22 s` bekommen.
|
|
12
|
12
|
|
|
13
|
|
-6.
|
|
|
13
|
+6. Mit der Parallelisierungsflag `-p` läuft das Programm deutlich schneller: Unsere obigen Tests benötigen nun noch `0.04`, `0.06`, `0.06` bzw. `0.09 s`. Zu erwarten ist ein Geschwindigkeitszuwachs um den Faktor der Threads, jedoch muss berücksichtigt werden, dass diese am Ende auch wieder zurückgeführt werden müssen, was die Ausführungszeit deutlich verlangsamt.
|
|
14
|
14
|
|
|
15
|
|
-7.
|
|
|
15
|
+7. Der erste Aufruf von `pthread_mutex_trylock()` wird benötigt, da in `dst->values` sonst eine race condition auftreten könnte.
|
|
|
16
|
+ Der Code läuft deutlich langsamer als `vector-global-order.c`. Die schon oben getesteten Flags liefern hier (ohne Parallelisierung) die Laufzeiten `0.19`, `0.28`, `1.09` und `2.57 s`. Die Retries werden deutlich mehr, wenn die Zahl der Threads ansteigt.
|
|
16
|
17
|
|
|
17
|
|
-8.
|
|
|
18
|
+8. In unseren Tests braucht `vector-avoid-hold-and-wait.c` für die Ausführung `0.09`, `0.13`, `0.15` und `0.17 s` bzw. mit der Flag `-p` braucht es `0.07`, `0.10`, `0.13` und `0.21 s`.
|
|
18
|
19
|
|
|
19
|
|
-9.
|
|
|
20
|
+9. Aufgrund der Verwendung von Assemblercode werden hier keine Locks benötigt. Diese Version tut also genau dasselbe wie die vorherigen Versionen.
|
|
20
|
21
|
|
|
21
|
|
-10.
|
|
|
22
|
+10. Die Version `vector-nolock.c` ist sowohl in der nichtparallelen als auch der parallel laufenden (`-p`) Variante eher langsam im Vergleich mit den anderen Versionen.
|