我一直在玩Repa和Accelerate --它们都很有趣,但我不知道什么时候该用一个,什么时候该用另一个。它们是一起成长的,竞争对手,还是只是为了解决不同的问题?
f4t66c6m1#
Repa是一个用于高效数组构造和遍历的库,用Haskell编写并在Haskell运行时中运行。Repa依赖于GHC的优化器和线程来提高性能。您可以将任意Haskell代码与Repa混合使用(Repa函数,如map,以Haskell函数作为参数)。Accelerate是一种用于GPU和多核CPU编程的嵌入式语言。Accelerate依赖于其自身的编译器和GPU/CPU并行性来提高性能。使用Accelerate库的一段代码实际上并不执行数组计算。它会生成一个Accelerate程序,该程序由Accelerate自己的 * 运行时编译器 * 处理,以生成实际处理数组数据的代码。然而,在实践中,您应该不会注意到底层的步骤,只需导入库和CPU.run (A.map f xs)-或GPU.run.API,这与Repa类似,在Repa中您将使用computeP来获取值。一个更值得注意的区别是,如果Accelerate函数的参数是标量,则它们将是Exp a类型,或者Acc a(如果它们是集合的话),确保您坚持使用“flat data-parallelism involving only regular, multi-dimensional arrays“。如果你想在Haskell中支持GPU,Accelerate是主要的选择。如果你只需要你的代码在CPU上运行,Repa和Accelerate都是很好的选择。
map
CPU.run (A.map f xs)
GPU.run
computeP
Exp a
Acc a
1条答案
按热度按时间f4t66c6m1#
Repa是一个用于高效数组构造和遍历的库,用Haskell编写并在Haskell运行时中运行。Repa依赖于GHC的优化器和线程来提高性能。您可以将任意Haskell代码与Repa混合使用(Repa函数,如
map
,以Haskell函数作为参数)。Accelerate是一种用于GPU和多核CPU编程的嵌入式语言。Accelerate依赖于其自身的编译器和GPU/CPU并行性来提高性能。使用Accelerate库的一段代码实际上并不执行数组计算。它会生成一个Accelerate程序,该程序由Accelerate自己的 * 运行时编译器 * 处理,以生成实际处理数组数据的代码。然而,在实践中,您应该不会注意到底层的步骤,只需导入库和
CPU.run (A.map f xs)
-或GPU.run
.API,这与Repa类似,在Repa中您将使用computeP
来获取值。一个更值得注意的区别是,如果Accelerate函数的参数是标量,则它们将是Exp a
类型,或者Acc a
(如果它们是集合的话),确保您坚持使用“flat data-parallelism involving only regular, multi-dimensional arrays“。如果你想在Haskell中支持GPU,Accelerate是主要的选择。如果你只需要你的代码在CPU上运行,Repa和Accelerate都是很好的选择。