Párhuzamos programozás Haskellben (folytatás)

Hasonló dokumentumok
Tulajdonságalapú tesztelés

Programozás burritokkal

Funkcionális Nyelvek 2 (MSc)

Tisztán funkcionális adatszerkezetek

2016, Funkcionális programozás

2016, Funkcionális programozás



Az MTA Cloud a tudományos alkalmazások támogatására. Kacsuk Péter MTA SZTAKI

2018, Funkcionális programozás

Tisztán funkcionális adatszerkezetek (folytatás)

2019, Funkcionális programozás. 4. el adás. MÁRTON Gyöngyvér

Feldspar: Nyelv digitális jelfeldolgozáshoz

2018, Funkcionális programozás

Kifejezések. Kozsik Tamás. December 11, 2016

1. Gyakorlat: Telepítés: Windows Server 2008 R2 Enterprise, Core, Windows 7

2018, Funkcionális programozás

Széchenyi István Egyetem

Kifejezések. Kozsik Tamás. December 11, 2016

Lineáris belsőpontos Newton-iteráció

Weblog elemzés Hadoopon 1/39

Tisztán funkcionális adatszerkezetek (folytatás)

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

Útmutató a Computer Setup (F10) segédprogram használatához dx2300 minitorony


Supplementary Table 1. Cystometric parameters in sham-operated wild type and Trpv4 -/- rats during saline infusion and

Ismerkedés a Python programnyelvvel. és annak micropython változatával

Analitikai megoldások IBM Power és FlashSystem alapokon. Mosolygó Ferenc - Avnet

Adatbányászat és Perszonalizáció architektúra

2019, Funkcionális programozás. 5. el adás. MÁRTON Gyöngyvér

Párhuzamos és Grid rendszerek. Hol tartunk? Klaszter. Megismerkedtünk az alapfogalmakkal,

OPERÁCIÓS RENDSZEREK I. BEVEZETÉS Koczka Ferenc -

C#, OOP. Osztályok tervezése C#-ban

S z á m í t ó g é p e s a l a p i s m e r e t e k





























Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

2018, Funkcionális programozás

egy szisztolikus példa

MTA Cloud a tudományos alkalmazások támogatására. Kacsuk Péter MTA SZTAKI

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

ios alkalmazásfejlesztés Koltai Róbert

Az informatika alapjai. 10. elıadás. Operációs rendszer

Gyártórendszerek modellezése: MILP modell PNS feladatokhoz

Szimuláció RICHARD M. KARP és AVI WIGDERSON. (Készítette: Domoszlai László)

PolyVision illesztőprogram Kibocsátási megjegyzések 2.2. változat

9. MPI

Párhuzamos és Grid rendszerek

A Feldspar fordító, illetve Feldspar programok tesztelése

Párhuzamos programok futásának kiértékelése Scalasca profiler segítségével

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Szoftver labor III. Tematika. Gyakorlatok. Dr. Csébfalvi Balázs

Az arrow struktúra. Patai Gergely április 1.

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Programozási nyelvek Java

Debreceni Egyetem Matematikai és Informatikai Intézet. 13. Védelem

Programozási nyelvek és módszerek Java Thread-ek

A TOSHIBA ÚJ SZILÁRDTEST-MEGHAJTÓJA A RUGALMAS VÁLLALATI TÁROLÁSI MEGOLDÁSOKAT SZOLGÁLJA

MVC. Model View Controller

Programozás alapjai óra. Morvai Flórián, 2010 Dr. Dévényi Károly előadásvázlata alapján

ORACLE. SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

Excel ODBC-ADO API. Tevékenységpontok: - DBMS telepítés. - ODBC driver telepítése. - DSN létrehozatala. -Excel-ben ADO bevonása

Szkriptnyelvek. 1. UNIX shell

Hozzunk ki többet abból amink van. Fehér Lajos

Data Integrátorok a gyakorlatban Oracle DI vs. Pentaho DI Fekszi Csaba Ügyvezető Vinnai Péter Adattárház fejlesztő február 20.

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

A felhőről általában. Kacsuk Péter MTA SZTAKI

Using the CW-Net in a user defined IP network

JAVA PROGRAMOZÁS 2.ELŐADÁS

SQL Server High Availability

DSL-eket kétféleképpen szoktak megvalósítani:

Átírás:

Párhuzamos programozás Haskellben (folytatás)

Mit tudtunk meg eddig a párhuzamos programokról? Párhuzamos programozással gyorsíthatunk a programon, miközben megőrizzük a determinisztikusságát. Teljesen különálló lehetőség, de keverhető konkurenciával. Nem automatikus, de annotációkkal és egy intelligens futtató rendszerrel könnyebb, mint manuálisan. Nem a programozónak kell megoldania a szinkronizációt és a kommunikációt. Fontos, miként bontjuk fel a problémát. Leggyakoribb szempontok: szemcsézettség (granularity) és az adatfüggőségek (data dependencies). [2..26]

Emlékeztető: Weak Head Normal Form (WHNF) > let xs = map (+1) [1..10] :: [Int] > :sprint xs xs = _ > seq xs () () > :sprint xs xs = _ : _ > length xs 10 > :sprint xs xs = [_,_,_,_,_,_,_,_,_,_] > sum xs 65 > :sprint xs xs = [2,3,4,5,6,7,8,9,10,11] [3..26]

Emlékeztető: az Eval monád -- cabal install parallel import Control.Parallel.Strategies -- Van "run" függvény, nincs IO, kompozicionális parparseqseqaction f x y = runeval $ do x 1 rpar (f x) -- WHNF párhuzamosan y 1 rpar (f y) -- thunk (másképp nincs hatása) rseq x 1 -- megvárja a WHNF-et rseq y 1 return (x 1, y 1 ) [4..26]

Esettanulmány: Egy Sudoku megoldó -- http://www.haskell.org/haskellwiki/sudoku import Sudoku import System.Environment main :: IO () main = do [f ] getargs file readfile f let puzzles = lines file let solutions = map solve puzzles print $ length [ s Just s solutions ] [5..26]

Esettanulmány: Egy Sudoku megoldó (profil) $ ghc -O Solver1.hs -rtsopts -main-is Solver1... $./Solver1 sudoku17.1000.txt +RTS -s 1000 2,362,886,904 bytes allocated in the heap 38,757,536 bytes copied during GC 239,376 bytes maximum residency (15 sample(s)) 81,232 bytes maximum slop 2 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 4573 colls, 0 par 1.56s 0.06s 0.0000s 0.0004s Gen 1 15 colls, 0 par 0.01s 0.00s 0.0002s 0.0005s INIT time 0.00s ( 0.00s elapsed) MUT time 0.01s ( 1.52s elapsed) GC time 1.57s ( 0.06s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 1.58s ( 1.58s elapsed) %GC time 99.2% (4.1% elapsed) Alloc rate Productivity 186,730,433,380 bytes per MUT second 0.8% of total user, 0.8% of total elapsed [6..26]

Sudoku megoldó: párhuzamosított verzió main :: IO () main = do [f ] getargs file readfile f let puzzles = lines file let solutions = parallelmap solve puzzles print $ length [ s Just s solutions ] where parallelmap f input = runeval $ do let (xs, ys) = splitat (length input div 2) input xs 1 rpar $ force $ map f xs ys 1 rpar $ force $ map f ys rseq xs 1 rseq ys 1 return $ xs 1 ++ ys 1 [7..26]

Feltámad az erő: mi az a force? import Control.DeepSeq -- "Normal Form Data" class NFData α where rnf :: α () -- "reduce to normal form" rnf x = x seq () instance NFData α NFData [α] where rnf [] = () rnf (x : xs) = rnf x seq rnf xs deepseq :: NFData α α β β deepseq x y = rnf x seq y force :: NFData α α α force x = x deepseq x [8..26]

Sudoku megoldó: párhuzamosított verzió (profil) $ ghc -O Solver2.hs -rtsopts -threaded -main-is Solver2... $./Solver2 sudoku17.1000.txt +RTS -N2 -s 1000 2,370,896,032 bytes allocated in the heap 48,743,968 bytes copied during GC 2,644,144 bytes maximum residency (8 sample(s)) 327,552 bytes maximum slop 9 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 2990 colls, 2990 par 0.42s 0.05s 0.0000s 0.0002s Gen 1 8 colls, 7 par 0.01s 0.01s 0.0007s 0.0013s Parallel GC work balance: 49.78% (serial 0%, perfect 100%) TASKS: 4 (1 bound, 3 peak workers (3 total), using -N2) SPARKS: 2 (1 converted, 0 overflowed, 0 dud, 0 GC d, 1 fizzled) INIT time 0.00s ( 0.00s elapsed) MUT time 1.00s ( 0.81s elapsed) GC time 0.43s ( 0.05s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 1.44s ( 0.86s elapsed) Alloc rate Productivity 2,369,438,827 bytes per MUT second 69.7% of total user, 116.0% of total elapsed [9..26]

Sudoku megoldó: párhuzamosított verzió (profil) $ rm Solver2 $ ghc -O Solver2.hs -rtsopts -threaded -eventlog -main-is Solver2... $./Solver2 sudoku17.1000.txt +RTS -N2 -l 1000 $ cabal install ghc-events... $ ghc-events show Solver2.eventlog... Vagy ThreadScope (Windows, Mac OS X, Linux és Unix): $ cabal install threadscope... $ threadscope Solver2.eventlog [10..26]

Sudoku: párhuzamosított verzió (ThreadScope) [11..26]

Nincs meg a szikra? A fordító nem korlátozza az rpar hívásokat ezeket mindig elosztja a rendelkezésre álló feldolgozó egységek közt. Az rpar paramétere egy szikra spark, egy kiértékelésre beütemezett kifejezés. A sparkokat egységenként egy-egy konténerbe spark pool tesszük, ahonnan a szálak válogathatnak, habár át is vehetnek egymástól: "work stealing". Egy spark állapotai: converted: kiértékelt overflowed: nem fért bele a spark poolba dud: duplán kiértékelt garbage-collected: nem használt fizzled: időközben kiértékelt Haskell Execution Context (HEC) vagy capability [12..26]

Sudoku: dinamikus párhuzamosítás main :: IO () main = do [f ] getargs file readfile f let puzzles = lines file let solutions = parallelmap solve puzzles print $ length [ s Just s solutions ] where parallelmap f input = runeval $ parmap f input parmap f [] = return [] parmap f (x : xs) = do x 1 rpar (f x) xs 1 parmap f xs return (x 1 : xs 1 ) [13..26]

Sudoku: dinamikus párhuzamosítás (profil) $ ghc -O Solver3.hs -rtsopts -threaded -main-is Solver3... $./Solver3 sudoku17.1000.txt +RTS -N2 -s 1000 2,389,659,224 bytes allocated in the heap 63,520,136 bytes copied during GC 2,163,224 bytes maximum residency (29 sample(s)) 88,008 bytes maximum slop 8 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 2450 colls, 2450 par 0.49s 0.05s 0.0000s 0.0002s Gen 1 29 colls, 28 par 0.03s 0.01s 0.0004s 0.0013s Parallel GC work balance: 67.15% (serial 0%, perfect 100%) TASKS: 4 (1 bound, 3 peak workers (3 total), using -N2) SPARKS: 1000 (1000 converted, 0 overflowed, 0 dud, 0 GC d, 0 fizzled) INIT time 0.00s ( 0.00s elapsed) MUT time 0.96s ( 0.68s elapsed) GC time 0.52s ( 0.06s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 1.48s ( 0.75s elapsed) Alloc rate Productivity 2,487,207,502 bytes per MUT second 64.9% of total user, 128.7% of total elapsed [14..26]

Sudoku: dinamikus párhuzamosítás (ThreadScope) [15..26]

Meddig fokozható? Mennyire lehet párhuzamosítani? A választ Amdhal törvénye adja meg: S = 1 (1 P) + P N ahol: S: a gyorsulás mértéke ( speedup ) N: a feldolgozó egységek száma P: a program párhuzamosítható részeinek aránya (0 P 1) [16..26]

Annotációk absztrakciója: stratégiák type Strategy α = α Eval α parallelpair :: Strategy (α, β) parallelpair (x, y) = do x 1 rpar x y 1 rpar y return (x 1, y 1 ) > runeval (parallelpair (f x, f y)) infixl 0 using using :: α Strategy α α x using s = runeval (s x) > (f x, f y) using parallelpair [17..26]

Identikusság Elméletileg az annotáció tetszőlegesen elhagyható: x using s --> x Gyakorlatilag ehhez viszont a stratégiának identikusnak kell lennie: x using s == x Ez a felhasználók által definiált, tetszőleges stratégiák esetében nem feltétlenül garantálható (akárcsak a monádtörvényeknél). Óvatosan kell bánni a lustasággal: snd ((1 div 0, "Hello!") using rdeepseq) [18..26]

Paraméterezett stratégiák import Control.Parallel.Strategies evallist :: Strategy α Strategy [α] evallist _ [] = return [] evallist s (x : xs) = do x 1 rpar (x using s) xs 1 evallist s xs return (x 1 : xs 1 ) parallelmap f xs = map f xs using evallist rseq [19..26]

Párhuzamos adatfolyamok, a Par monád A stratégiák és az Eval számítások nem mindig megfelelőek a párhuzamosítás kifejezésére. A Par monád lehetőséget ad arra, hogy pontosabban meg tudjuk adni a szemcsézettséget és az adatfüggőségeket, nem függ a lusta kiértékeléstől. Továbbra is determinisztikus modell! [20..26]

Par monád: primitívek -- cabal install monad-par import Control.Monad.Par -- runpar :: Par α α runpar $ do -- new :: Par (IVar α) i new j new -- fork :: Par () Par () fork $ put i (f n) -- put :: NFData α IVar α α Par () fork $ put j (f m) -- get :: IVar α Par α a get i b get j return (a + b) [21..26]

Par kombinátorok put_ :: IVar α α Par () spawn :: NFData α Par α Par (IVar a) spawn p = do i new fork $ do x p put i x return i spawn_ :: Par α Par (IVar α) spawnp :: NFData α α Par (IVar α) spawnp = spawn return [22..26]

Párhuzamos leképezés au Par parmapm :: NFData β (α Par β) [α] Par [β] parmapm f as = do ibs mapm (spawn f ) as mapm get ibs [23..26]

Sudoku: adatfolyam párhuzamosítás main :: IO () main = do [f ] getargs file readfile f let puzzles = lines file let solutions = parallelmap solve puzzles print $ length [ s Just s solutions ] where parallelmap f input = runpar $ do ibs mapm (spawnp f ) input mapm get ibs [24..26]

Sudoku: adatfolyam párhuzamosítás (profil) $ ghc -O Solver4.hs -rtsopts -threaded -main-is Solver4... $./Solver4 sudoku17.1000.txt +RTS -N2 -s 1000 2,377,124,296 bytes allocated in the heap 51,987,992 bytes copied during GC 2,883,888 bytes maximum residency (11 sample(s)) 245,272 bytes maximum slop 9 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 2480 colls, 2480 par 0.58s 0.05s 0.0000s 0.0001s Gen 1 11 colls, 10 par 0.02s 0.01s 0.0007s 0.0015s Parallel GC work balance: 69.65% (serial 0%, perfect 100%) TASKS: 4 (1 bound, 3 peak workers (3 total), using -N2) SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC d, 0 fizzled) INIT time 0.00s ( 0.00s elapsed) MUT time 0.90s ( 0.70s elapsed) GC time 0.60s ( 0.06s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 1.50s ( 0.76s elapsed) Alloc rate Productivity 2,631,399,014 bytes per MUT second 60.1% of total user, 119.1% of total elapsed [25..26]

Sudoku: adatfolyam párhuzamosítás (ThreadScope) [26..26]