问题标签 [repa]

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 回答
136 浏览

image - REPA:计算和计算?

我正在尝试这个REPA库,我想以并行和顺序两种方式处理图像。

我可以读取图像(使用其他库,DevIL)并使用computeP(并行)处理它。这是代码(来自haskell wiki上的一个示例)。

现在我想用"computeS"顺序改变"computeP " 。但是,当我尝试编译它时,会出现此错误:

正如您可能猜到的,我是函数式编程的新手。我不知道为什么会发生这个错误。任何帮助都会很棒。

提前致谢。

0 投票
0 回答
103 浏览

arrays - REPA:调整图像大小

我正在尝试,给定一个图像,生成一个具有原始宽度和高度两倍的新图像。

我正在使用 haskell 的 REPA 库(https://hackage.haskell.org/package/repa-3.4.1.2/docs/Data-Array-Repa.html),并遵循本教程(https://wiki.haskell. org/Numeric_Haskell:_A_Repa_Tutorial)。

现在,这些是我的想法:

  • 1)获取原始图像宽度和高度

  • 2) 生成一个大小合适的新数组:

  • 3)用原始数组填充新数组,并具有一些功能。

问题是,我真的不知道如何达到第 2) 和第 3) 点。" something"函数需要做什么才能填充新数组?我应该使用地图newImage吗?

提前致谢。

0 投票
1 回答
320 浏览

haskell - 写入文件,但如果存在 DevIL 和 REPA 则覆盖它

我正在使用 DevIL 库来读取和写入图像。问题是如果文件已经存在,我想覆盖它。

这是我的代码:

我怎样才能做到这一点?我可以这样做还是必须考虑其他方式?它是操作系统的东西吗?

我将该文件用作临时图像,直到用户决定保存它(经过一些更改,如旋转、扩展等)。

0 投票
1 回答
293 浏览

haskell - 为什么(Haskell)Repa 只使用一个 CPU?

我一直在使用该Repa库开发路径跟踪器。我最近通过使用 monadic 重构了它以合并并行性computeP。但是,我发现性能提升可以忽略不计。而且,监控htop,似乎程序仍然只使用一个CPU。为了深入研究这个问题,我打开ghci并运行了以下命令:

没有骰子。repa似乎仍然只使用一个 CPU 内核,如下所示htop

在此处输入图像描述

sumP此外,执行团队在和之间几乎没有变化sumS,略偏向于sumS

我错过了什么?万一这很重要,我使用的是 Arch Linux:

更新

一些评论表明我应该使用文档中指示的-threaded选项。我处于默认使用的(错误?)印象之下。无论如何,我的程序已经在使用这些标志——这是文件中的片段:ghcirepaghci-threaded.cabal

此外,我在ghci使用(我认为)正确的 ghci 选项时重新运行了命令:

仍然没有骰子:

在此处输入图像描述

对于此事,我深表感谢任何进一步的帮助。

0 投票
1 回答
92 浏览

arrays - 从 ByteString 重新创建

最初我有一个 ByteString,然后我将其解压缩并转换为 Int16,这部分过程花费的时间相对较少。然后,我使用以下行将 Int16s 列表转换为 Repa 数组,

根据分析器的说法,这条线占用了大约 40% 的 CPU 时间,这可能只是表明我正在执行的计算不保证使用 Repa。从 ByteString 到 Repa 数组时,是否有更有效的路线?

我已经尝试了 Repa fromByteString 函数,虽然转换

很慢。我通过首先将数组重新整形为 Word8s 的二维数组,然后折叠到 Int16s 来执行此操作。也许字节数组是正确的方法,而我的转换方法是错误的。

在某些情况下,该程序正在针对用 C/C++ 编写的同一程序进行基准测试。

0 投票
1 回答
117 浏览

haskell - 如何正确实现 Foreign.Storable 以创建向量?

我一直在一个项目中工作,该项目一直在使用列表来计算人工神经网络操作。现在,我想对其进行改造Data.Vector以提高其效率。Foreign.Storable但是,目前我在实施一个必不可少的定义时遇到了麻烦。

好的,首先,我使用Data.Array.Repa了类似以下的类型同义词 ( CAMTypes.hs) 进行计算:

然后后来我想使用Data.Vector如下:

但是,我收到以下错误:

我已经完成了 的实现instance Storable NTTVU where,但仍然抱怨;我启用了分析,但没有告诉我更多信息;尝试按步骤调试,但也没有成功。希望有人知道很多关于它以及如何解决它。

有关更多上下文,整个项目和相关文件:

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 投票
1 回答
195 浏览

arrays - 是否有类似于 Vector 和其他语言的 Haskell Repa 切片函数的使用?

我试图在 Haskell 中获得一个可用版本的多维数组,与numpyPython 和其他语言中的数组相当。我发现了其他关于如何为特定维度的数组编写自定义函数的问题,但我的目标更重要的是,得到Data.Vector'sslice函数的类似行为,这很直观并且可以完成其他语言的括号索引数组的工作。

Vectorslice函数有类型 V.slice :: Int -> Int -> V.Vector a -> V.Vector a

所以切片向量v很简单

Repaslice另一方面有类型

R.slice :: (R.Slice sl, R.Shape (R.FullShape sl), R.Source r e) => R.Array r (R.FullShape sl) e -> sl -> R.Array R.D (R.SliceShape sl) e

所以它需要一个 Repa 数组和一个形状并返回一个延迟数组。我知道 Repa 不将整数作为索引,但我正在寻找slice任意维度的函数的一般用途,无论是使用Repa's(Z :. i)还是ixn维度规范。

我不是在使用 寻找与维度相关的函数traverse,并且不希望进入任何模板 haskell 来概括它,尽管如果slice通常无法使用该函数,它就是它。

那么问题是:是否可以使用Repa'slice函数来获取多维数组的任意切片,例如在numpy'sv[x1:x2,y1:y2] 或 C++Eigenmatrix.block<p,q>(i,j)

0 投票
1 回答
239 浏览

haskell - Haskell:并行计算和单子的“顺序属性”

我对为什么 REPA 函数computeP将其结果打包在一个单子中感到困惑。它具有以下类型签名。

本教程中它说

这样做的原因是monad 给出了明确定义的序列概念,因此 computeP 强制在 monad 计算的特定点完成并行评估。

同样,堆栈溢出的这个答案指出

Repa 中的并行计算必须是 monadic 的原因部分与惰性有关,但主要与 Repa 无法处理嵌套并行性有关。Monad 的顺序属性在很大程度上解决了它[.]

问题

  • 拥有这种“顺序属性”究竟意味着什么?
  • monad 如何执行此操作?
  • 例如computeP:没有使用哪个monad的限制,所以我可以使用identity monad。那么使用下面的函数来解包 monad 是否可以,或者这会因为它缺少这个顺序属性而产生意想不到的结果?如果可以的话,是否还需要使用 monad?

    /li>

任何帮助都会很棒。

0 投票
1 回答
73 浏览

haskell - 获取图像的高度和宽度

我对 Haskell 很陌生,所以如果这太基本或者没有什么意义,我深表歉意。我正在尝试阅读图像;我可以使用以下代码将其添加到像素数据列表中:

我或多或少地关注正在发生的事情,但我对 Haskell 的了解仍然有限,所以在理解 api 文档时,我有点挣扎。

我真的希望能够解析像素的位置;如果我知道图像的宽度和高度,我知道该怎么做,但我不知道如何获取图像的宽度/高度。

我正在学习 Haskell 课程,但我也在尝试将其付诸实践,以帮助深入了解这些概念。