问题标签 [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 投票
1 回答
283 浏览

haskell - 如何在Accelerator-haskell中定义矩阵乘积

我试图在加速之上定义一个类型安全的矩阵计算库,部分是出于教育目的,部分是为了看看这是否是一种实用的方法。

但是在正确定义矩阵的乘积时,我完全陷入了困境——即以 GHC 接受/编译我的代码的方式。

我已经尝试了几次,它们是这个的变体:

Linear.hs

stack build给我的错误是

我已经查阅了Accelerate的文档,并且我还在阅读具有类似目的但不用于断言数组/向量维度的加速算术。TypeLits

我还尝试制作一个香草版本(即没有我自己的矩阵类型),以防我的类型错误,我认为这与使用slice. 为了完整起见,我将其包括在内,我可以添加错误消息,但我选择省略它们,因为我相信它们与上述问题无关。

0 投票
1 回答
133 浏览

arrays - 使用 Accelerate 进行并行编程 (Data.Array.Accelerate)

情况
目前我正在做一个处理边缘检测的项目。因此,我想使用加速数组来计算算法以获得更好的性能。不幸的是,我对函数式编程以及并行编程还是很陌生,我真的不知道什么是正确的方法。

问题
要将给定图像转换为灰度甚至执行边缘检测,我需要访问数组的每个像素/值。

使用非加速数组(Data.Array 包)我可以使用 (!)-operator 来获得所需的值。

使用加速数组(Data.Array.Accelerate 包)有类似的功能,如 ..

(!) :: (Shape ix, Elt e) => Acc (Array ix e) -> Exp ix -> Exp e
描述:从数组中提取标量的表达式形式

(!!) :: (Shape ix, Elt e) => Acc (Array ix e) -> Exp Int -> Exp e
描述:从线性索引处的数组中提取标量的表达式形式

..但他们总是以返回 Accelerates 的表达式值结束,(Exp e)这导致了我的问题..

问题
是否可以从Exp数据类型中“解包”值,或者您还建议我做什么?

例子

从图像转换为加速数组的作品..

..但我不知道反之亦然,因为我需要访问表达式值以从宽度/高度/像素生成图像。

任何帮助将不胜感激。

0 投票
1 回答
501 浏览

haskell - 如何使用 cuda DevicePtr 作为加速阵列

我正在尝试使用从外部代码返回的 cuda (在 CUDA-land 中称为 a )作为Accelerator - DevicePtr llvm - ptxCUdeviceptr Array

我在下面编写的代码有些工作:

编译并运行该程序时,它正确打印出结果:

但是,通过阅读加速和加速-llvm-ptx 源代码,这似乎不应该工作。

在大多数情况下,加速器似乎Array带有指向主机内存中数组数据的指针,以及Unique唯一标识Array. 在执行Acc计算时,Acceleration 会根据需要将 HOST 内存中的数组数据加载到 GPU 内存中,并HashMap使用Unique.

在上面的代码中,我Array直接创建了一个指向 GPU 数据的指针。这似乎不应该工作,但它似乎在上面的代码中工作。

然而,有些事情是行不通的。例如,尝试打印xs(我Array的带有指向 GPU 数据的指针)会因段错误而失败。这是有道理的,因为Showfor 的实例Array只是尝试peek从 HOST 指针获取数据。这失败了,因为它不是 HOST 指针,而是 GPU 指针:


有没有合适的方法来使用 CUDADevicePtr并直接将其用作加速器Array

0 投票
3 回答
234 浏览

haskell - 模拟非矩形阵列

很多时候,您希望数组的性能优于链表,但又不符合矩形数组的要求。

作为一个例子,考虑一个六边形网格,这里用中灰色显示单元格 (3, 3) 的 1 距离邻居和浅灰色的 2 距离邻居。 在此处输入图像描述 假设我们想要一个数组,其中包含每个单元格的每个 1 距离和 2 距离邻居的索引。一个小问题是单元格具有不同数量的 X 距离邻居 - 网格边界上的单元格比靠近网格中心的单元格具有更少的邻居。

(出于性能原因,我们想要一个相邻索引数组——而不是从单元坐标到相邻索引的函数。)

我们可以通过跟踪每个单元格有多少邻居来解决这个问题。neighbors2假设您有一个size数组 R x C x N x 2,其中R是网格行数,C对于列,并且N是网格中任何单元格的最大 2 距离邻居数。然后,通过保留一个额外n_neighbors2的 size数组R x C,我们可以跟踪填充了哪些索引,neighbors2哪些只是零填充。例如,要检索单元格 (2, 5) 的 2 距离邻居,我们只需像这样对数组进行索引:

someNeigh = neighbors2[2, 5, 0..n_neighbors2[2, 5], ..]

someNeigh将是一个n_neighbors2[2, 5] x 2索引数组(或视图),其中someNeigh[0, 0]产生第一个邻居的行,并someNeigh[0, 1]产生第一个邻居的列,依此类推。注意位置的元素

neighbors2[2, 5, n_neighbors2[2, 5]+1.., ..]

无关紧要;这个空间只是填充以保持矩阵矩形。

假设我们有一个函数可以找到任何单元格的 d 距离邻居:

我们如何创建上述数组neighbors2n_neighbors2N假设我们事先知道 2 距离邻居的最大数量 。然后可以修改generateNeighs为始终返回相同大小的列表,因为我们可以用 (0, 0) 填充剩余的条目。在我看来,这留下了两个问题:

  • 我们需要一个填充函数,neighbors2它不是对每个单独的索引进行操作,而是对一个切片进行操作,在我们的例子中,它应该一次填充一个单元格。
  • n_neighbors2应同时填充为neighbors2

欢迎使用repaor 或accelerate数组的解决方案。

0 投票
0 回答
81 浏览

haskell - 一次填充 2 行加速数组

假设您有一个 2D 加速阵列:

和一个长度为 4 的一维加速向量(与 的列数相同arr):

以及从标量到长度为 3 的向量的函数:

您如何arr通过映射expand来填充vec

常规mapfromPrelude不适用于加速阵列。mapfrom仅映射从Data.Array.Accelerate元素到元素。

0 投票
0 回答
85 浏览

haskell - Exp / Acc 中的实复类型转换

我需要将Accelerate 库Exp的orAcc类型中的 实数值转换为其对应的值,例如:Complex

我试图像这样进行模式匹配

并怀疑liftunlifthttps://www.acceleratehs.org/examples/mandelbrot.html中可能会以某种方式解决此问题,但无法弄清楚这些问题的正确应用。

因为我的尝试ghc抱怨说

0 投票
1 回答
181 浏览

haskell - 程序 'llvm-config' 版本 ==9.0.* 是必需的,但找不到

我想用命令安装llvm-hs cabal install llvm-hs -fshared-llvm,根据网站上Accelerate的安装指南:https ://www.acceleratehs.org/get-started.html 。但是有些错误。之后我尝试cabal install llvm-hs了,然后我收到了错误消息:

所以我试图弄清楚如何“安装”llvm-config,但我真的找不到解决这个问题的方法。有谁知道解决方案?

0 投票
1 回答
93 浏览

haskell - Haskell Accelerate 中的 Exp a -> a

是否有具有这种类型签名的函数:Exp a -> a在 Haskell 的加速库中?

例如,我有一个表达式:

在哪里 mat :: Acc (Matrix Int)

然后, max 有 type Exp Int,但我希望 max 被表达为一个简单的 haskell's Int

0 投票
1 回答
56 浏览

haskell - Haskell 加速复制矩阵

如何在 Haskell Accelerate 中复制矩阵?例如,我有一个矩阵mat :: Matrix (Z :. 2 :. 5) ...。我想得到一个 shape 的三维数组Z :. 9 :. 2 :. 5。我尝试使用A.replicate (A.lift (Z :. 9 :. All)) mat,但出现错误

无法将类型“Z”与“DIM0 :.”匹配。Int' 预期类型:Acc (Array (SliceShape ((Z :. Int) :. All)) a) 实际类型:Acc (Matrix a)

这意味着什么?

同样,如果我有一个 shape 矩阵,Z :. 9 :. 5我怎样才能得到一个 shape 的三维数组Z :. 9 :. 2 :. 5

0 投票
1 回答
97 浏览

haskell - 如何使用光泽加速渲染 mandelbrot

作为一个练习,我正在尝试使用 Haskell 渲染 Mandelbrot 集。我正在使用光泽度来显示结果。到目前为止,我的数学是正确的,并且显示作品。目前,我生成了一个 [[Word8]],它表示每个像素运行到无穷大所需的迭代,并将其转换为 ByteString,我用它来构建光泽图片,并显示出来。它工作得很好,花花公子,分辨率高达 100 像素的宽度和高度,它运行得相当快,但它需要很长时间。因此,为了改变这一点,我现在尝试使用加速来使用 GPU 进行渲染,但我只是不知道该怎么做。它从使用什么库开始。平原加速?光泽加速?光泽光栅加速?我想,我必须使用最后一个。在 Graphics.Gloss.Accelerate.Raster 模块中。

有人可以向我解释 makePicture 功能,或者至少将我指向某个更解释的地方。一个工作示例,我可以根据我的情况进行调整会很好。