Akkor használható ha ugyanazt a műveletet akarjuk elvégezni sok elemen.
Előnyök:
par
-ral ellentétben)Párhuzamos négyzetösszeg számolás:
Mindezt automatikusan elkészíti a fordító!
És még mapP
, appendP
, filterP
, lengthP
, …
Komponálható, nem csak egysíkú adatokra működik:
A fordító elvégez egy vektorizáció nevű transzformációt: Az egymásba ágyazott adatpárhuzamos számításokat kilapítja.
A technológia bemutatása egy példán:
mapP f
-hez speciális kód készül: mapP_f
Tegyük fel, hogy máshol mapP_g
-re is szükség van!
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ó).
[:[: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!
[:(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.
reprezentációja:
Adatok (első elemek, második elemek):
Szegmens leíró kezdőpozíció (kezdőpozíció, hossz):
Ajánlott olvasmány: Harnessing the Multicores: Nested Data Parallelism in Haskell, Simon Peyton Jones, Roman Leshchinskiy, Gabriele Keller, Manuel M. T. Chakravarty