Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 编写一次并行数组Haskell表达式,在CPU&;上运行;带有repa和accelerate的GPU Repa和加速API相似性_Arrays_Haskell_Repa_Accelerate Haskell - Fatal编程技术网

Arrays 编写一次并行数组Haskell表达式,在CPU&;上运行;带有repa和accelerate的GPU Repa和加速API相似性

Arrays 编写一次并行数组Haskell表达式,在CPU&;上运行;带有repa和accelerate的GPU Repa和加速API相似性,arrays,haskell,repa,accelerate-haskell,Arrays,Haskell,Repa,Accelerate Haskell,Haskell repa库用于在CPU上自动并行阵列计算。加速库是GPU上的自动数据并行。这些API非常相似,具有相同的N维数组表示形式。您甚至可以使用Data.Array.accelerate.IO中的fromRepa和toRepa在accelerate和repa数组之间切换: fromRepa :: (Shapes sh sh', Elt e) => Array A sh e -> Array sh' e toRepa :: Shapes sh sh' =&

Haskell repa库用于在CPU上自动并行阵列计算。加速库是GPU上的自动数据并行。这些API非常相似,具有相同的N维数组表示形式。您甚至可以使用
Data.Array.accelerate.IO中的
fromRepa
toRepa
在accelerate和repa数组之间切换:

fromRepa :: (Shapes sh sh', Elt e) => Array A sh e -> Array sh' e
toRepa   :: Shapes sh sh'          => Array sh' e  -> Array A sh e
accelerate有多个后端,包括LLVM、CUDA和FPGA(参见的图2)。我已经发现了一个加速库,尽管该库似乎没有得到维护。鉴于repa和accelerate编程模型相似,我希望有一种优雅的方式在它们之间切换,即一次编写的函数可以使用repa的R.computeP或accelerate的一个后端(例如CUDA函数)执行

两个非常相似的功能:Repa和在南瓜上加速 取一个简单的图像处理阈值函数。如果灰度像素值小于50,则将其设置为0,否则将保留其值。以下是它对南瓜的作用:

以下代码介绍了repa和加速实现:

modulemain其中
将限定的Data.Array.Repa作为R导入
将限定的Data.Array.Repa.IO.BMP作为R导入
导入符合条件的Data.Array.Accelerate作为
将符合条件的Data.Array.Accelerate.IO作为
将合格的Data.Array.Accelerate.解释器作为
导入数据.Word
--使用accelerate(解释器)对图像应用阈值
thresholdAccelerate::IO()
阈值加速=do
img A.Exp A.Word32
evalPixel p=如果p>50,则p为0
--使用repa对图像应用阈值
thresholdRepa::IO()
阈值repa=do
让arr::IO(R.Array R.U R.DIM2(Word8,Word8,Word8))
arr=id`fmap`R.readImageFromBMP“pumpkin in.bmp”中的任意一个(error.show)
img 50然后x其他0
数据后端选择=Repa |加速
main::IO()
main=do
让userChoice=Repa——假装这个命令行标志
案例用户选择
Repa->阈值Repa
加速->阈值加速
问题:我可以只写一次吗?
thresholdAccelerate
thresholdRepa
的实现非常相似。是否有一种优雅的方法可以一次性编写数组处理函数,然后以编程方式在交换机中选择多核CPU(repa)或GPU(accelerate)?我可以根据是否需要CPU或GPU来选择导入,即导入
Data.Array.Accelerate.CUDA
Data.Array.Repa
执行类型为
Acc a
的操作,方法如下:

run :: Arrays a => Acc a -> a
或者,使用类型类,例如,大致如下:

main::IO()
main=do
让userChoice=Repa——假设这是一个命令行标志
操作applyThreshold::RepaBackend()
加速->applyThreshold::CudaBackend()
行动

或者,对于我希望为CPU和GPU表达的每个并行阵列函数,我必须实现两次——一次是使用repa库,另一次是使用accelerate库?

我在一年多前设计yarr时考虑过这一点。当时,类型族推断或类似的东西(我不记得很清楚)存在严重问题,这妨碍了实现
向量
repa
yarr
加速
,等等的统一包装。既有效又不允许写入太多显式类型签名,或者原则上实施(我不记得了)


这就是GHC7.6。我不知道GHC 7.8在这一领域是否有意义的改进。理论上我没有看到任何问题,因此我们可以期待有一天,在短时间或长时间内,当GHC准备好的时候会有这样的东西。

简单的回答是,目前,不幸的是,您需要编写两个版本

然而,我们正在研究对Accelerate的CPU支持,这将消除对代码的Repa版本的需求。特别是,Accelerate最近获得了一个新的基于LLVM的后端,它同时针对GPU和CPU:


这个新的后端仍然是不完整的、有缺陷的和实验性的,但我们正计划使它成为当前CUDA后端的可行替代品。

Accelerate有一个repa后端:-从未使用过它,但我很高兴知道这是否是一个足够有趣的后备方案。对,似乎打算使用repa后端并使用
accelerate
编写代码,但我想不管出于什么原因,人们对它都不太感兴趣。是的,但我认为它可能是合适的,因为
加速
允许我们编写一次函数,并根据需要在并行CPU或GPU上运行。这是一个模块开关,而不是翻转构造函数,但是你可以在前者的基础上编写后者。太棒了!accelerate和repa的LLVM后端的长期情况是什么?一个会反对另一个吗?LLVM IR的表达能力是否足以实现类型索引数组表示,例如延迟数组?还是计划保留repa和加速llvm单独的项目?一旦LLVM后端成熟,我想一个明显的基准就是repa?Accelerate也使用延迟数组,但它会自动决定使用什么数组表示。这在Accelerate中比在Repa中更容易,因为Accelerate是一种限制性更强的语言,所以我希望我们可以不使用Repa中所需的类型级表示提示。我们没有计划继续开发accelerate repa后端。在公认的非常有限的基准测试集上,新的LLVM后端已经比普通的Repa代码快。