问题标签 [accelerate-haskell]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
996 浏览

arrays - 将 CSV 文件读入 Accelerate(或 Repa)阵列的最有效方法是什么?

我对使用 Accelerate 库很感兴趣,我想对存储在 CSV 文件中的数据执行一些操作。我已经阅读了这篇关于 Accelerate 的精彩介绍,但我不确定如何有效地将 CSV 读入 Accelerate。我考虑过这一点,我唯一能想到的就是将整个 CSV 文件解析成一个长列表,然后将整个列表输入到 Accelerate。

我的数据集将非常大,将 1 gb+ 的文件读入内存并复制到其他地方似乎效率不高。我注意到 Hackage 上有一个CSV Enumerator包,但我不确定如何将它与 Accelerate 的生成功能一起使用。另一个限制是,在使用 Accelerate 生成数组之前,似乎必须知道数组的维度或至少元素的数量。

以前有没有人处理过这种问题?

谢谢!

0 投票
1 回答
259 浏览

opencv - 如何在 Haskell 中使用 fromPtr 正确构造 Accelerate 数组?

我正在尝试使用fromPtr加速 io 将图像从 OpenCV 中舀出并放入 Accelerate 数组中。此功能的文档很迟钝,并且此示例无法编译(由于 Criterion,我无法安装加速示例)。这段代码:

结果是Couldn't match expected type 'BlockPtrs (EltRepr e0)' with actual type '((), Ptr b0)'. The type variables 'e0', 'b0' are ambiguous.

删除castPtr给了我Couldn't match expected type 'BlockPtrs (EltRepr e0)' with actual type '((), Ptr Word8)'. The type variable 'e0' is ambiguous.

查看BlockPtrsand的定义EltRepr只会让我更加困惑。但是,向表达式添加类型签名,如(((), imgPtr) :: BlockPtrs ((), Word8))给出预期类型BlockPtrs (EltRepr e0)和实际类型BlockPtrs ((), Word8)

这里有人有经验fromPtr吗?

编辑:越来越近。我之前尝试过使用构造函数 EltRepr,但我没有想到要导入它的原始模块。哦!但是,既然我已经这样做了,请将类型签名替换为:: BlockPtrs (EltRepr Word8)

编辑:由里德巴顿回答。它现在为我编译,谢谢!“最终”代码:

0 投票
1 回答
148 浏览

haskell - 在加速中调整大小

我一直在试验 Haskell 的 Accelerate,我想知道如何调整向量的大小(数组 DIM1 a)?我注意到重塑,但它的源和结果的大小必须相同,但我想加倍大小。

0 投票
2 回答
1383 浏览

arrays - 编写一次并行数组 Haskell 表达式,在 CPU 和 GPU 上运行 repa 并加速

修复和加速 API 相似性

Haskell repa 库用于在 CPU 上自动进行并行数组计算。加速库是 GPU 上的自动数据并行性。API 非常相似,具有相同的 N 维数组表示。fromRepa甚至可以使用和toRepain在加速和 repa 数组之间切换Data.Array.Accelerate.IO

有多个用于加速的后端,包括 LLVM、CUDA 和 FPGA(参见http://www.cse.unsw.edu.au/~keller/Papers/acc-cuda.pdf的图 2 )。我发现了一个用于加速的repa 后端,尽管该库似乎没有得到维护。鉴于repa 和Accelerator 编程模型相似,我希望有一种优雅的方式在它们之间切换,即编写一次的函数可以使用repa 的R.computeP 或Accel 的后端之一执行,例如使用CUDA运行函数。

两个非常相似的功能:南瓜上的 Repa 和 Accelerate

取一个简单的图像处理阈值函数。如果灰度像素值小于 50,则将其设置为 0,否则保留其值。这是它对南瓜的作用:

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

问题:我可以只写一次吗?

thresholdAccelerate和的实现thresholdRepa非常相似。是否有一种优雅的方法可以编写一次数组处理函数,然后以编程方式在交换机中选择多核 CPU(repa)或 GPU(加速)?我可以考虑根据我想要 CPU 还是 GPU 来选择我的导入,即导入或者Data.Array.Accelerate.CUDA执行Data.Array.Repa以下类型的操作Acc a

或者,使用类型类,例如大致如下:

或者是这样的情况,对于我希望为 CPU 和 GPU 表达的每个并行数组函数,我必须实现它两次——一次使用 repa 库,另一次使用加速库?

0 投票
1 回答
823 浏览

haskell - GHC - Haskell 中的中缀声明

嗨,我正在构建自己的 GPU 编程 Haskell DSL 版本,称为Accelerate。问题是关于infixl声明:

这是代码片段:

我认为这个片段非常简单明了,但是当我试图将它加载到 ghci 时,它失败了:

据报道:

你对这个问题有任何想法吗?我正在使用的 ghc 版本是:

谢谢!

0 投票
1 回答
1224 浏览

performance - 从 ghci 和 shell 运行的已编译加速代码的性能差异

问题

你好,我正在使用加速库来创建一个应用程序,允许用户交互调用处理图像的函数,这就是我使用 ghc api 基于和扩展 ghci 的原因。

问题是,当从 shell 运行编译后的可执行文件时,计算在 100 毫秒(略小于 80 毫秒)内完成,而在 ghci 中运行相同的编译代码则需要 100 毫秒以上(平均多于 140 毫秒)才能完成。

资源

示例代码+执行日志: https ://gist.github.com/zgredzik/15a437c87d3d8d03b8fc

描述

首先:测试是在编译 CUDA 内核之后运行的(编译本身增加了 2 秒,但事实并非如此)。

从 shell 运行编译后的可执行文件时,计算在 10 毫秒内完成。(shell first runsecond shell run传递不同的参数以确保数据没有缓存在任何地方)。

当尝试从 ghci 运行相同的代码并摆弄输入数据时,计算需要超过 100 毫秒。我知道解释代码比编译代码慢,但我在 ghci 会话中加载相同的编译代码并调用相同的顶级绑定 ( packedFunction)。我已明确键入它以确保它是专用的(与使用 SPECIALIZED pragma 的结果相同)。

main但是,如果我在 ghci 中运行该函数(即使:set args在连续调用之间更改输入数据),计算时间确实不到 10 毫秒。

编译Main.hsghc -o main Main.hs -O2 -dynamic -threaded

我想知道开销来自哪里。有人对为什么会发生这种情况有任何建议吗?


remdezx发布的示例的简化版本:

当我编译并执行它需要0,09 秒才能完成。

但是当我预编译它并在解释器中运行它需要0,25s

0 投票
1 回答
193 浏览

haskell - 如何在加速示例包中的示例上启用 CUDA?

我已经在我的 OSX Yosemite 上安装了 CUDA。我已经下载了加速示例包并使用cabal install. 它编译正确。但是,当我运行这些示例时,我注意到它们没有提供在 CUDA 下运行的选项。例如:

这使它们运行缓慢(并且,显然,达到了目的)。如何在编译的示例上启用 CUDA?

0 投票
1 回答
167 浏览

haskell - 加速代码通过解释器但在 CUDA 下失败

我一直在尝试编写一个函数,该函数将使用加速库获取向量的直方图。我认识到直方图不是 GPU 处理的理想案例,但我正在从一个小种子生成一个相当大的数据集,如果它可以在将其传输回主内存之前减少到几千字节数组,那就太好了。

我想出的代码如下。它需要一些输出箱然后创建一个新数组,其中 a[x] 的值是 x 在 xs 中出现的次数

代码似乎在 Accelerate 解释器下正常运行。但是,如果我尝试通过加速 cuda 调用它,我会收到以下错误消息。

我的问题有两个。首先,我在做什么导致 CUDA 失败?其次,有没有更好的方法通过 Accelerate 获取直方图?

0 投票
1 回答
92 浏览

haskell - 将加速的 A 数组表示转换为 repa 的 U 数组表示

我想将加速数组转换为 repa 数组,然后使用writeImageToBMPfrom repa-io 将数组写入 BMP 文件。忽略加速 io 中存在这样一个功能的事实,我只是将其用作问题的示例。拿:

需要包加速、加速 io、repa 和 repa-io 来编译此代码。

这不会编译,因为writeImageToBmprepa-io 中的类型是:

whereU表示 repa 中的清单数组。GHC 错误是:

的类型repaArr是:

这就是为什么 GHC 抱怨它是writeImageToBMP.

问题:如何将加速数组表示转换A为 repa 清单数组表示U,以便我可以调用writeImageToBMP它?

0 投票
2 回答
489 浏览

haskell - haskell中的查找表加速

我正在使用 Haskell 的加速库做一个有趣的项目。我有一个需要编写的函数,在纯 Haskell 中看起来像这样:

即类似于阶乘函数,但只乘以奇数。我想在加速后端执行这个功能,所以如果我理解正确,它需要变成 type Exp Int -> Exp IntExp但是,出于性能原因,该库不允许在 中评估任意表达式。幸运的是,我只需要为小值评估这个函数,例如 n<=7。我的想法是定义一个预先计算的返回值的列表(或数组),以便简单地对其进行索引将返回适当的值,并且每次评估都将花费相同的时间,而天真的版本则不是这种情况。但是,我还没有找到一种方法来做到这一点。我现在有两个问题:

1) 有没有办法做到这一点,即定义一个硬编码数组,然后对其进行索引以检索类型函数中的适当值Exp a -> Exp b

2) 我是否以有效的方式处理事情?我对这个问题的看法有什么明显的缺陷吗?

更新

以下作品基于@ErikR 的回答和随后的评论: