Adatpárhuzamos kiértékelés

Adatpárhuzamos kiértékelés

Akkor használható ha ugyanazt a műveletet akarjuk elvégezni sok elemen.

Előnyök:

Példa

Párhuzamos négyzetösszeg számolás:

-- sumsq :: [: Float :] → Float
-- sumsq a = sumP [: x*x | x ← a :]

Mindezt automatikusan elkészíti a fordító!

Példa

-- dotp :: Num a => [:a:] -> [:a:] -> a
-- dotp xs ys = sumP [:x * y | (x, y) <- zipP xs ys:]

És még mapP, appendP, filterP, lengthP, …

Egymásba ágyazhatóság

Komponálható, nem csak egysíkú adatokra működik:

-- type Vector = [: Float :]
-- type Matrix = [: Vector :]
-- matMul :: Matrix → Vector → Vector
-- matMul m v = [: vecMul r v | r ← m :]

A fordító elvégez egy vektorizáció nevű transzformációt: Az egymásba ágyazott adatpárhuzamos számításokat kilapítja.

Vektorizáció

A technológia bemutatása egy példán:

-- g :: [:Float:] -> [:Float:]
-- g xs = mapP f xs

mapP f-hez speciális kód készül: mapP_f

-- g :: [:Float:] -> [:Float:]
-- g xs = mapP_f xs

Vektorizáció (folytatás)

Tegyük fel, hogy máshol mapP_g-re is szükség van!

-- mapP_g :: [:[:Float:]:] -> [:[:Float:]:]
-- mapP_g xs = mapP_mapP_f xs

Ez így megy a végtelenségig? Nem! Ugyanis mapP_mapP_f kifejezhető mapP_f-fel:

-- mapP_mapP_f :: [:[:Float:]:] -> [:[:Float:]:]
-- mapP_mapP_f xss = unconcatP xss (mapP_f (concatP xss))

Emiatt rekurzív függvényeket is leírhatunk adatpárhuzamosan (például Barnes-Hut n-test szimuláció).

Hatékony tömb reprezentáció

  1. [:[:a:]:] reprezentációja:
    egy lapos vektor, és egy szegmens leíró (kezdőpozíció, hossz párok :: [:(Int,Int):]).

    concatP és unconcatP konstans idejű (majdnem nulla) műveletek!

  2. [:(a,b):]-et ([:a:],[:b:])-re transzformálja a fordító, és az összes műveletet utánaállítja.

Ez a kettő egymást kiegészíti.

Példa

-- [:[:(0,15),(2,9),(3,20):], [::], [:(3,46):]:] 

reprezentációja:

Adatok (első elemek, második elemek):

-- [#0,2,3,3#], [#15,9,20,46#]

Szegmens leíró kezdőpozíció (kezdőpozíció, hossz):

-- [#0,3,3#], [#3,0,1#]

Adatpárhuzamos kiértékelés összefoglalása

Ajánlott olvasmány: Harnessing the Multicores: Nested Data Parallelism in Haskell, Simon Peyton Jones, Roman Leshchinskiy, Gabriele Keller, Manuel M. T. Chakravarty