我一直在对Data Parallel Haskell进行大量研究,发现了两种单独的并行数组类型.这种[::]类型似乎在研究论文中显得更多,似乎是理想的类型,但PArray似乎无处不在.关于该主题的Wiki页面清楚地表明,[::]无法将类型数组传递给非开发代码.为什么?为什么有这种中间PArray类型?这对我来说似乎完全是多余的.维基称之为"平面阵列",但矢量化的重点是使平行阵列平坦.
更新:阅读更多论文和文档和源代码后,我更加困惑.[::]或者它的同义词PArr似乎在GHC.PArr中作为一个平面数组实现,而PArray在多个地方称为"flat"的中间类型是在Data.Array.Parallel.PArray.Base和从那里导入的其他模块中实现的.数据系列,使用我读过的许多论文中描述的展平变换.为什么扁平阵列不扁平而嵌套扁平?
更新2:经过更多的研究,我发现教学是一个完整的混乱.维基页面在近一年内没有任何内容更新,与hackage文档相矛盾(参见Data.Array.Parallel.Prelude,它明确表示不会导入特殊的前奏),并且通常过时.该GHC Trac的页面也已经过时了,包括,例如,引导到提到包DPH包,至少就Hackage而言(我没有,而且不太不到哪里寻找中其他地方),不存在,并没有提到像dph-lifted-vseg这样的软件包.
更好的说明,我相信我现在理解第一次更新的答案,GHC.PArr中的这部分评论暗示:
-- BIG UGLY HACK: The desugarer special cases this module. Despite the uses of '-XParallelArrays',
-- the desugarer does not load 'Data.Array.Parallel' into its global state. (Hence,
-- the present module may not use any other piece of '-XParallelArray' syntax.)
--
-- This will be …Run Code Online (Sandbox Code Playgroud) 更具体地说,我有以下看似无害的小修复3程序:
{-# LANGUAGE QuasiQuotes #-}
import Prelude hiding (map, zipWith)
import System.Environment (getArgs)
import Data.Word (Word8)
import Data.Array.Repa
import Data.Array.Repa.IO.DevIL
import Data.Array.Repa.Stencil
import Data.Array.Repa.Stencil.Dim2
main = do
[s] <- getArgs
img <- runIL $ readImage s
let out = output x where RGB x = img
runIL . writeImage "out.bmp" . Grey =<< computeP out
output img = map cast . blur . blur $ blur grey
where
grey = traverse img to2D luminance
cast n = floor n :: …Run Code Online (Sandbox Code Playgroud) parallel-processing haskell image-processing repa data-parallel-haskell
我试图使用DPH实现nqueens问题,但我最终得到了无法向量化GHC.Prim.Int#错误.当我搜索错误时,我发现了一个GHC Bug,它讨论了用于模式匹配的矢量化文字(http://haskell.1045720.n5.nabble.com/GHC-5702-Can-t-vectorise-pattern-matching-on -numeric-文字-td5076659.html).我不确定这是不是同一个bug.我的代码如下,
{-# LANGUAGE ParallelArrays #-}
{-# OPTIONS_GHC -fvectorise #-}
module NQueensP (nqueens_wrapper)
where
import qualified Prelude
import Data.Array.Parallel
import Data.Array.Parallel.Prelude
import Data.Array.Parallel.Prelude.Int as I
import qualified Data.Array.Parallel.PArray as P
isSafe i q n = isSafeHelper i (Prelude.zip (P.toList (toPArrayP q)) [n, n I.- 1..1])
where isSafeHelper i [] = True
isSafeHelper i (x:xs) = (i I.== Prelude.fst x) && I.abs(i I.-
(Prelude.fst x)) I./= I.abs(n I.- (Prelude.snd x)) &&
isSafeHelper i xs
nqueens_wrapper::Int -> PArray (PArray Int)
nqueens_wrapper …Run Code Online (Sandbox Code Playgroud) 最近,我读了纸张在即将到来的广义流的融合vector和DPH图书馆.这似乎是非常有趣的发展.我现在开始尝试DPH(从GHC 7.6开始,并计划在它出来时升级到7.8 SIMD版本).我还从Repa库文档中看到它可以执行并行数组工作.Repa似乎是成熟的版本,相比之下DPH,GHC 7.4没有被认为是准备好的.现在,DPH似乎是成熟的,我想知道什么是之间的主要优点和缺点Repa和DPH封装,GHC 7.6.我搜索了StackOverflow和谷歌,但找不到Repa和之间的比较DPH.因此,这个问题.
我正在尝试使用Data Parallel Haskell运行一些简单的实验,但我显然有一些选项错误.即使我尝试的东西非常简单
sumP [:1.0,2.0:]
Run Code Online (Sandbox Code Playgroud)
我得到一个例外
Exception indexParr: out of bounds parallel array index; idx = 0, arr len = 0
Run Code Online (Sandbox Code Playgroud)
假设我错误地设置了一些东西 - 但......
在尝试使用GHCi和运行使用GHC生成的可执行文件时,我都会遇到同样的错误.
我正在编写代码来做一个子集产品:它需要一个元素列表和一个指标变量列表(长度相同).产品在树中计算,这对我们的应用至关重要.每个产品都很昂贵,因此我的目标是并行计算树的每个级别,按顺序评估连续级别.因此,没有任何嵌套并行性发生.
我只在一个函数中修复代码,接近我整个代码的顶层.请注意,subsetProd 不是 monadic .
步骤:
代码:
{-# LANGUAGE TypeOperators, FlexibleContexts, BangPatterns #-}
import System.Random
import System.Environment (getArgs)
import Control.Monad.State
import Control.Monad.Identity (runIdentity)
import Data.Array.Repa as Repa
import Data.Array.Repa.Eval as Eval
import Data.Array.Repa.Repr.Vector
force :: (Shape sh) => Array D sh e -> Array V sh e
force = runIdentity . computeP
chunk :: [a] -> [(a,a)]
chunk [] = []
chunk (x1:x2:xs) = (x1,x2):(chunk xs)
slow_fib :: Int -> Integer
slow_fib 0 …Run Code Online (Sandbox Code Playgroud) parallel-processing monads haskell repa data-parallel-haskell