Update README.md

This commit is contained in:
BergesJ 2017-07-12 12:04:32 +02:00 committed by GitHub
parent e74be4aaff
commit dca18e4009

View File

@ -11,10 +11,10 @@ Zur Erinnerung: Die Funktion `nBesteEingaben` gibt Ihnen mit beliebiger numerisc
diejenigen Eingaben (4-Tupel, jeweils mit Werten aus [-10,10]) zurück, für die eine diejenigen Eingaben (4-Tupel, jeweils mit Werten aus [-10,10]) zurück, für die eine
`komlizierteFunktion` maximal wird. Hierfür wird der komplizierten Funktion mithilfe von `komlizierteFunktion` maximal wird. Hierfür wird der komplizierten Funktion mithilfe von
List-Applicative (kartesisches Produkt) eine lange, beliebig dichte Liste möglicher Eingabewerte List-Applicative (kartesisches Produkt) eine lange, beliebig dichte Liste möglicher Eingabewerte
zwischen `(-10,-10,-10,-10)` und `(10,10,10,10)` übergeben. Bei einem Abstand von 0.5 ergeben sich zwischen `(-10,-10,-10,-10)` und `(10,10,10,10)` übergeben.
damit 41^4 = 2 825 761 Berechnungen. Diese lohnt es sich zu parallelisieren. Bei einem Abstand von 0.5 ergeben sich damit 41^4 = 2 825 761 Berechnungen. Diese lohnt es sich zu parallelisieren!
Parallelisieren Sie die Funktion `nBesteEingaben`, mit mindestens drei verschiedenen Strategien für Listen aus Parallelisieren Sie die Funktion `nBesteEingaben`, mit mindestens drei verschiedenen Strategien für Lists (bzw. Lazy Lists) aus
[`Control.Parallel.Strategies`](https://hackage.haskell.org/package/parallel-3.2.1.1/docs/Control-Parallel-Strategies.html#v:evalList). [`Control.Parallel.Strategies`](https://hackage.haskell.org/package/parallel-3.2.1.1/docs/Control-Parallel-Strategies.html#v:evalList).
Um ihre Parallelisierung zu testen, verwenden Sie die folgenden Terminalbefehle: Um ihre Parallelisierung zu testen, verwenden Sie die folgenden Terminalbefehle:
@ -25,13 +25,17 @@ stack exec -- MainParallel1 +RTS -N2 -s
stack exec -- MainParallel1 +RTS -N4 -s stack exec -- MainParallel1 +RTS -N4 -s
stack exec -- MainParallel1 +RTS -N8 -s stack exec -- MainParallel1 +RTS -N8 -s
``` ```
`-Nx` steht hierbei für die Verwendung von x Kernen. `-Nx` steht für die Verwendung von x Kernen.
`MainParallelx` steht für die Verwendung der Strategie x.
Eine sinnvolle Parallelisierung erkennen Sie daran, dass die Berechnung schneller wird, Eine sinnvolle Parallelisierung erkennen Sie daran, dass die Berechnung schneller wird,
je mehr echte Kerne Sie für zur Verfügung stellen. je mehr echte Kerne Sie für zur Verfügung stellen. Mindestens eine Strategie sollte in diesem
Sinne sinnvoll sein.
Notieren sie die Laufzeiten ihrer Versuche in einer Tabelle und geben sie den Speedup (`-N1`-Zeit/`-Nx`Zeit) an. Notieren sie die Laufzeiten ihrer Versuche in einer Tabelle und geben sie den Speedup (`-N1`-Zeit/`-Nx`Zeit) an.
Nützliche Funktion: [`using :: a -> Strategy a -> a`](https://hackage.haskell.org/package/parallel-3.2.1.1/docs/Control-Parallel-Strategies.html#v:using)
Issue 2 Issue 2
------- -------
@ -39,7 +43,7 @@ Sie werden bemerkt haben, dass der Speedup sich nicht linear mit der Anzahl der
Nach [Amdahls Gesetz](https://de.wikipedia.org/wiki/Amdahlsches_Gesetz) ist bei vielen Kernen der nicht-parallelisierte Part Nach [Amdahls Gesetz](https://de.wikipedia.org/wiki/Amdahlsches_Gesetz) ist bei vielen Kernen der nicht-parallelisierte Part
(in unserem Fall das sortieren) für die schlechte Performance verantwortlich. (in unserem Fall das sortieren) für die schlechte Performance verantwortlich.
Da wir uns nur für die Top `n` eingaben interessieren, schreiben sie eine Funktion Da wir uns nur für die Top `n` eingaben interessieren, schreiben Sie eine Funktion
```haskell ```haskell
topn :: Int -> [a] -> [a] topn :: Int -> [a] -> [a]
@ -54,30 +58,30 @@ Issue 3
------- -------
Sie besitzen eine Bank und sollen Überweisungen programmieren. Sie finden in `Banking.hs` alles fertig. Nur noch die `debit`-Funktion muss geschrieben werden, Sie besitzen eine Bank und sollen Überweisungen programmieren. Sie finden in `Banking.hs` alles fertig. Nur noch die `debit`-Funktion muss geschrieben werden,
die von dem ersten auf das Zweite Konto überweist. die von dem ersten auf das zweite Konto überweist.
Im Szenario der Main-Funktionen hat die Bank 10 verschiedene Server, die gleichzeitig dieselbe Transaktion auf der Datenbank ausführen wollen Im Szenario der Main-Funktionen hat die Bank 10 verschiedene Server, die gleichzeitig dieselbe Transaktion auf der Datenbank ausführen wollen
(also haben sie mehrere "Banken" in der Main, die auch alle etwas ausgeben, aber alle zeigen denselben Kontostand, da die Konten selbst nur 1x existieren). (also haben sie mehrere "Banken" in der Main, die auch alle etwas ausgeben, aber alle zeigen denselben Kontostand, da die Konten selbst nur 1x existieren).
Führen sie anschließend MainBanking1 und MainBanking2 aus. Was können sie beobachten? Wie kommt es zu den Ergebnissen? Führen Sie anschließend `MainBanking1` und `MainBanking2` aus. Was können sie beobachten? Wie kommt es zu den Ergebnissen?
Hint (optional!): Mittels `stack exec -- MainBanking1 +RTS -ls` können sie ein eventlog ausgeben lassen, welches sie mittels `threadscope` (`stack install threadscope`) ansehen können. Hint (optional!): Mittels `stack exec -- MainBanking1 +RTS -ls` können Sie ein eventlog ausgeben lassen, welches Sie mittels `threadscope` (`stack install threadscope`) ansehen können.
Was passiert, wenn sie dies mit `-N1` ausführen? Wieso? Was passiert, wenn Sie dies mit `-N1` ausführen? Wieso?
Issue 4 Issue 4
------- -------
Da sie in Aufgabe 3 in Probleme gelaufen sind (sind sie doch, oder? ;) ), benutzen sie hier statt `MVar`s die STM-eigenen `TMVar`s. Da Sie in Aufgabe 3 in Probleme gelaufen sind (sind Sie doch, oder? ;) ), benutzen Sie hier statt `MVar`s die STM-eigenen `TMVar`s.
In `STMBanking.hs` finden sie die gleiche Situation vor - nur müssen sie hier mit `STM` statt mit `MVar` arbeiten. In `STMBanking.hs` finden Sie die gleiche Situation vor - nur müssen Sie hier mit `STM` statt mit `MVar` arbeiten.
Führen sie anschließend MainSTMBanking1 und MainSTMBanking2 aus. Was können sie beobachten? Inwiefern unterscheiden sich die Ergebnisse zu den `MVar`s? Führen Sie anschließend MainSTMBanking1 und MainSTMBanking2 aus. Was können Sie beobachten? Inwiefern unterscheiden sich die Ergebnisse zu den `MVar`s?
Hint (optional!): Mittels `stack exec -- MainBanking1 +RTS -ls` können sie ein eventlog ausgeben lassen, welches sie mittels `threadscope` (`stack install threadscope`) ansehen können. Hint (optional!): Mittels `stack exec -- MainBanking1 +RTS -ls` können Sie ein eventlog ausgeben lassen, welches Sie mittels `threadscope` (`stack install threadscope`) ansehen können.
Was passiert, wenn sie dies mit `-N1` ausführen? Wieso? Was passiert, wenn Sie dies mit `-N1` ausführen? Wieso?
Wo sind die Unterschiede zu `MVar`s (Performance, Einfachheit der Programmierung, Resistenz gegen Programmierfehler, ..)? Beschreiben sie kurz wie sich ihre Probleme mit Wo sind die Unterschiede zu `MVar`s (Performance, Einfachheit der Programmierung, Resistenz gegen Programmierfehler, ..)? Beschreiben Sie kurz wie sich ihre Probleme mit
der jeweiligen Implementation anfühlten und wieso sie welche Lösung selbst bevorzugen würden. der jeweiligen Implementation anfühlten und wieso Sie welche Lösung selbst bevorzugen würden.