问题标签 [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.
haskell - 如何在Accelerator-haskell中定义矩阵乘积
我试图在加速之上定义一个类型安全的矩阵计算库,部分是出于教育目的,部分是为了看看这是否是一种实用的方法。
但是在正确定义矩阵的乘积时,我完全陷入了困境——即以 GHC 接受/编译我的代码的方式。
我已经尝试了几次,它们是这个的变体:
Linear.hs
stack build
给我的错误是
我已经查阅了Accelerate的文档,并且我还在阅读具有类似目的但不用于断言数组/向量维度的加速算术。TypeLits
我还尝试制作一个香草版本(即没有我自己的矩阵类型),以防我的类型错误,我认为这与使用slice
. 为了完整起见,我将其包括在内,我可以添加错误消息,但我选择省略它们,因为我相信它们与上述问题无关。
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
数据类型中“解包”值,或者您还建议我做什么?
例子
从图像转换为加速数组的作品..
..但我不知道反之亦然,因为我需要访问表达式值以从宽度/高度/像素生成图像。
任何帮助将不胜感激。
haskell - 如何使用 cuda DevicePtr 作为加速阵列
我正在尝试使用从外部代码返回的 cuda (在 CUDA-land 中称为 a )作为Accelerator - DevicePtr
llvm - ptx。CUdeviceptr
Array
我在下面编写的代码有些工作:
编译并运行该程序时,它正确打印出结果:
但是,通过阅读加速和加速-llvm-ptx 源代码,这似乎不应该工作。
在大多数情况下,加速器似乎Array
带有指向主机内存中数组数据的指针,以及Unique
唯一标识Array
. 在执行Acc
计算时,Acceleration 会根据需要将 HOST 内存中的数组数据加载到 GPU 内存中,并HashMap
使用Unique
.
在上面的代码中,我Array
直接创建了一个指向 GPU 数据的指针。这似乎不应该工作,但它似乎在上面的代码中工作。
然而,有些事情是行不通的。例如,尝试打印xs
(我Array
的带有指向 GPU 数据的指针)会因段错误而失败。这是有道理的,因为Show
for 的实例Array
只是尝试peek
从 HOST 指针获取数据。这失败了,因为它不是 HOST 指针,而是 GPU 指针:
有没有合适的方法来使用 CUDADevicePtr
并直接将其用作加速器Array
?
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 距离邻居:
我们如何创建上述数组neighbors2
和n_neighbors2
?N
假设我们事先知道 2 距离邻居的最大数量 。然后可以修改generateNeighs
为始终返回相同大小的列表,因为我们可以用 (0, 0) 填充剩余的条目。在我看来,这留下了两个问题:
- 我们需要一个填充函数,
neighbors2
它不是对每个单独的索引进行操作,而是对一个切片进行操作,在我们的例子中,它应该一次填充一个单元格。 n_neighbors2
应同时填充为neighbors2
欢迎使用repa
or 或accelerate
数组的解决方案。
haskell - 一次填充 2 行加速数组
假设您有一个 2D 加速阵列:
和一个长度为 4 的一维加速向量(与 的列数相同arr
):
以及从标量到长度为 3 的向量的函数:
您如何arr
通过映射expand
来填充vec
?
常规map
fromPrelude
不适用于加速阵列。map
from仅映射从Data.Array.Accelerate
元素到元素。
haskell - Exp / Acc 中的实复类型转换
我需要将Accelerate 库Exp
的orAcc
类型中的 实数值转换为其对应的值,例如:Complex
我试图像这样进行模式匹配
并怀疑lift
或unlift
在https://www.acceleratehs.org/examples/mandelbrot.html中可能会以某种方式解决此问题,但无法弄清楚这些问题的正确应用。
因为我的尝试ghc
抱怨说
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,但我真的找不到解决这个问题的方法。有谁知道解决方案?
haskell - Haskell Accelerate 中的 Exp a -> a
是否有具有这种类型签名的函数:Exp a -> a
在 Haskell 的加速库中?
例如,我有一个表达式:
在哪里
mat :: Acc (Matrix Int)
然后, max 有 type Exp Int
,但我希望 max 被表达为一个简单的 haskell's Int
。
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
?
haskell - 如何使用光泽加速渲染 mandelbrot
作为一个练习,我正在尝试使用 Haskell 渲染 Mandelbrot 集。我正在使用光泽度来显示结果。到目前为止,我的数学是正确的,并且显示作品。目前,我生成了一个 [[Word8]],它表示每个像素运行到无穷大所需的迭代,并将其转换为 ByteString,我用它来构建光泽图片,并显示出来。它工作得很好,花花公子,分辨率高达 100 像素的宽度和高度,它运行得相当快,但它需要很长时间。因此,为了改变这一点,我现在尝试使用加速来使用 GPU 进行渲染,但我只是不知道该怎么做。它从使用什么库开始。平原加速?光泽加速?光泽光栅加速?我想,我必须使用最后一个。在 Graphics.Gloss.Accelerate.Raster 模块中。
有人可以向我解释 makePicture 功能,或者至少将我指向某个更解释的地方。一个工作示例,我可以根据我的情况进行调整会很好。