标签: data-parallel-haskell

数据并行Haskell中PArray和[::]之间有什么区别?

我一直在对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)

haskell data-parallel-haskell

33
推荐指数
1
解决办法
649
查看次数

我怎样才能帮助GHC中的SpecConstr?

我正在使用GHC 7.4.1来尝试编译使用Repa的程序.但是在编译过程中,我的内存耗尽了.有了ghc -v,我可以看到它陷入了SpecConstr阶段.

SpecConstr是GHC的Core-to-Core转换之一.西蒙佩顿琼斯有一个很好的描述在这里,而且有一些代码在这里,但它是相当缓慢的去为我,因为我不是很熟悉,GHC的内部运作.

我希望能够以某种方式帮助编译器 - 有没有办法告诉它哪里被困?或者,有没有办法在这个阶段限制内存使用,直到我可以在更大的机器上重新编译?

谢谢,乍得

haskell ghc repa data-parallel-haskell

11
推荐指数
1
解决办法
454
查看次数

Repa 2和3 API之间的主要区别是什么?

更具体地说,我有以下看似无害的小修复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

11
推荐指数
2
解决办法
772
查看次数

为什么湿在DPH程序中得到"无法矢量化表达式GHC.Prim.Int#"错误?

我试图使用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)

haskell data-parallel-haskell

9
推荐指数
1
解决办法
208
查看次数

维修和DPH之间的区别

最近,我读了纸张在即将到来的广义流的融合vectorDPH图书馆.这似乎是非常有趣的发展.我现在开始尝试DPH(从GHC 7.6开始,并计划在它出来时升级到7.8 SIMD版本).我还从Repa库文档中看到它可以执行并行数组工作.Repa似乎是成熟的版本,相比之下DPH,GHC 7.4没有被认为是准备好的.现在,DPH似乎是成熟的,我想知道什么是之间的主要优点和缺点RepaDPH封装,GHC 7.6.我搜索了StackOverflow和谷歌,但找不到Repa和之间的比较DPH.因此,这个问题.

haskell repa data-parallel-haskell

7
推荐指数
1
解决办法
578
查看次数

Data Parallel Haskell/GHC 7.4.2的运行时异常

我正在尝试使用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生成的可执行文件时,我都会遇到同样的错误.

haskell ghc ghci data-parallel-haskell

6
推荐指数
1
解决办法
121
查看次数

并行维修代码不会产生火花

我正在编写代码来做一个子集产品:它需要一个元素列表和一个指标变量列表(长度相同).产品在树中计算,这对我们的应用至关重要.每个产品都很昂贵,因此我的目标是并行计算树的每个级别,按顺序评估连续级别.因此,没有任何嵌套并行性发生.

我只在一个函数中修复代码,接近我整个代码的顶层.请注意,subsetProd 不是 monadic .

步骤:

  1. 将列表分成对(没有并行性)
  2. 压缩分块列表(没有并行性)
  3. 将产品功能映射到此列表(使用Repa map),创建一个Delayed数组
  4. 调用computeP来并行计算地图
  5. 将Repa结果转换回列表
  6. 进行递归调用(在列表的一半大小的输入)

代码:

{-# 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

3
推荐指数
1
解决办法
500
查看次数