问题标签 [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 回答
605 浏览

haskell - Repa --- 如何创建一个 Read 实例?

最好的制作方法是什么

读的一个实例?所以后来我可以得出

也是 Read 的一个实例。

0 投票
1 回答
449 浏览

haskell - 没有并行化的 Repa

我真的很喜欢Repa的界面,即使它的并发能力如何。而且我实际上需要 repa 的数组是连续的,因为我的数组是相对较小的数组,并且它们的并行化是无用的,甚至是有害的。

但是,我确实在我的程序中使用并行 io,所以我编译它-threaded并使用+RTS -Nx. 这使repa 的并行化成为可能。有没有办法关闭 repa 的并发功能?

嗯,在写这篇文章时,我明白我不太可能需要其他任何东西DIM1,所以也许我应该切换到Vector. 但尽管如此,这个问题的答案将是有用的。

我通过并行运行收到的警告消息是

我的代码中实际上没有force

0 投票
1 回答
184 浏览

arrays - Haskell:在 Repa 库中......列表不是 Elts,但是“k-tuples”呢

我想编写一个算法,通过 n+1 (比如)遍历大小为 k 的二维矩阵,其中数组中的每个元素都是元素列表。这些列表的大小各不相同,它们的长度可能是 1、2、...、k。我什至可以肯定地说,在第一行,它们都将是长度 1,在第二行:长度 2,...,在第 k 行:长度 k。我想 Haskell 有某种“k-tuples”机制,我只是不知道它是什么。即使该类型是按某个固定大小索引的,那也没关系——这意味着对性能的影响很小,但还不错。

有什么建议么?

0 投票
2 回答
1171 浏览

performance - Repa 3 性能和“现在”的正确用法

这里有一个基本的 monad 问题,与 Repa 无关,还有几个 Repa 特定的问题。

我正在使用 Repa3 开发一个库。我无法获得高效的并行代码。如果我让我的函数返回延迟的数组,我会得到非常慢的代码,可以很好地扩展到 8 个内核。这段代码每个 GHC 分析器占用超过 20GB 的内存,运行速度比基本的 Haskell 未装箱向量慢几个数量级。

或者,如果我让所有函数都返回未装箱清单数组(仍然尝试在函数中使用融合,例如当我执行“映射”时),我会得到更快的代码(仍然比使用 Haskell 未装箱向量慢)根本无法扩展,事实上随着内核的增多,速度会变得稍微慢一些。

基于 Repa-Algorithms 中的 FFT 示例代码,似乎正确的方法是始终返回清单数组。有没有我应该返回延迟数组的情况?

FFT 代码还大量使用了“现在”功能。但是,当我尝试在代码中使用它时出现类型错误:

没有“现在”,代码编译得很好。使用“现在”,我收到以下错误:

无法匹配类型r' with数组 U (Z :. Int) r' `r' 是一个刚性类型变量,受 fromArray :: (BaseRing mr, Unbox r, Repr tr) => Arr tr -> CycRingRepa mr 的类型签名约束在 C:\Users\crockeea\Documents\Code\LatticeLib\CycRingRepa.hs:50:1 预期类型:CycRingRepa mr 实际类型:CycRingRepa m (Array U DIM1 r)

我不认为 是我的问题。如果有人可以解释 Monad 在“现在”中的工作方式,那将会很有帮助。根据我的最佳估计,单子似乎正在创建一个“Arr U (Arr U r)”。我期待一个“Arr U r”,它将匹配数据构造函数模式。发生了什么事,我该如何解决?

类型签名是:

更好地了解何时使用“现在”会有所帮助。

其他几个 Repa 问题:我应该显式调用 computeUnboxedP(如 FFT 示例代码中所示),还是应该使用更通用的 computeP(因为 unbox 部分是由我的数据类型推断的)?我应该将延迟数组或清单数组存储在数据类型 CycRingRepa 中吗?最终,我还希望这段代码与 Haskell Integers 一起使用。这是否需要我编写使用 U 数组以外的东西的新代码,或者我是否可以编写多态代码来为 unbox 类型创建 U 数组和为 Integers/boxed 类型创建其他数组?

我意识到这里有很多问题,我感谢任何/所有答案!

0 投票
2 回答
487 浏览

haskell - 我如何帮助 GHC 中的 SpecConstr?

我正在使用 GHC 7.4.1 尝试编译使用 Repa 的程序。但是在编译过程中,我的内存不足。使用ghc -v,我可以看到它陷入了 SpecConstr 阶段。

SpecConstr 是 GHC 的核心到核心转换之一。Simon Peyton Jones在这里有一个很好的描述,并且这里有一些代码,但是对我来说这很慢,因为我对 GHC 的内部工作不是很熟悉。

我希望能够以某种方式帮助编译器 - 有没有办法告诉它卡在哪里?或者,有没有办法限制这个阶段的内存使用,直到我可以在更大的机器上重新编译?

谢谢,乍得

0 投票
2 回答
798 浏览

haskell - Repa 2 和 3 API 之间的主要区别是什么?

更具体地说,我有以下看起来无害的小 Repa 3 程序:

在我的 2Ghz core 2 duo 笔记本电脑上处理 640x420 图像需要这么多时间:

我知道肯定有什么问题,因为我在使用 Repa 2 的更复杂的算法上获得了更好的性能。在该 API 下,我发现的重大改进来自于在每次数组转换之前添加对“强制”的调用(我理解表示每次调用映射、卷积、遍历等)。我不能完全弄清楚在 Repa 3 中要做的类似事情 - 事实上,我认为新的表现类型参数应该确保在何时需要强制数组时没有歧义?新的一元接口如何适应这个方案?我已阅读 Don S 的精彩教程,但 Repa 2 和 3 API 之间存在一些关键差距,在线 AFAIK 很少讨论。

更简单地说,是否有一种影响最小的方法来解决上述程序的效率问题?

0 投票
2 回答
477 浏览

haskell - 你如何在 Repa 中计算 a[i] = f(a[i-1]) ?

是否可以在 Repa 中计算一个依赖于过去值(即较小的索引)的数组?给出了数组的初始部分(例如,a[0])。(请注意,我使用类似 C 的符号来表示数组的元素;请不要混淆。)

我阅读了教程并快速检查了hackage,但我找不到执行此操作的功能。

(我想在一维数组中进行这种计算在 Repa 中没有意义,因为你不能并行化它。但我认为你可以在二维或更多维的情况下并行化它。)

编辑f:也许我应该更具体地说明我想使用哪种。由于没有办法在 casea[i]是标量的情况下进行并行化,所以让我们关注 casea[i]是 N dim 向量的情况。我不需要a[i]更高维(例如矩阵),因为您可以将其“展开”为向量。因此,f是一个将 R^N 映射到 R^N 的函数。

大多数情况下,它是这样的:

其中b是一个 N 暗向量,M是一个 N × N 矩阵(不假设稀疏性),并且g是一些非线性函数。我想为i=1,..N-1给定a[0]g和计算它M。我希望有一些通用的方法来(1)并行化这种类型的计算和(2)分配中间变量,例如b高效的(在类 C 语言中,你可以重用它,如果 Repa 或类似的库可以像魔术一样做到这一点而不会破坏纯度)。

0 投票
2 回答
2404 浏览

arrays - Repa 数组上的并行 mapM

在我最近的工作Gibbs sampling,我一直在充分利用RVar它,在我看来,它为随机数生成提供了一个近乎理想的接口。遗憾的是,由于无法在地图中使用单子动作,我一直无法使用 Repa。

虽然很明显 monad 映射通常不能并行化,但在我看来,这RVar可能是至少一个可以安全并行化效果的 monad 示例(至少在原则上;我不太熟悉 的内部工作原理RVar) . 即,我想写如下内容,

A.mapM看起来像哪里,

虽然显然这将如何工作在很大程度上取决于 的实现RVar及其底层RandomSource,但原则上人们会认为这将涉及为每个产生的线程绘制一个新的随机种子并照常进行。

直觉上,似乎同样的想法可能会推广到其他一些单子。

所以,我的问题是:是否可以构建一类ParallelMonad单子,其效果可以安全地并行化(可能至少由RVar.

它可能是什么样子?还有哪些其他单子可能居住在这个类中?其他人是否考虑过这在 Repa 中如何发挥作用的可能性?

最后,如果这种并行单子动作的概念不能被推广,有没有人看到任何好的方法可以在特定情况下RVar(这将非常有用)使这项工作?放弃RVar并行性是一个非常困难的权衡。

0 投票
2 回答
312 浏览

haskell - 在 repa-algorithms 函数中观察到意外的性能

我正在使用以下代码测试该mmultP功能repa-algorithms-3.2.1.1(为简洁起见,此处稍作浓缩):

并按此处指定,使用编译

这是线程运行时中的顺序运行:

这是一个使用 4 核的版本(在四核 MacBook Air 上运行):

有人对这里发生的事情有任何直觉吗?-N2对于and ,我也得到了比顺序慢的性能-N3;每个核心似乎都增加了一些额外的时间。

请注意,我确实观察到一些手动 Repa 矩阵乘法代码的并行性带来了一些小的收益。

更新

令人费解;我替换main

并删除了对mwc-random

具有运行时选项的 Criterion 基准测试-N1 -K100M产生:

-N4 -K100M给我:

这是一个可爱的加速。我几乎会认为之前的行为是由于将生成的 1000x1000 数组写入标准输出,但正如我所提到的,如果我交换我自己的矩阵乘法代码,我确实观察到那里的并行性增益。还在挠头。

0 投票
2 回答
218 浏览

haskell - 有没有为 Haskell 的类型族指定返回类型的灵活方法?

最近我开始使用 Haskell 的 Repa 库,它严重依赖于类型族和相关类型。我可以像这样定义一个 Repa 数组:

并像这样操作它:

其中 U 是一个关联的数据类型,它将导致结果被表示为一个未装箱的数组;DIM2 是数组维度。我不喜欢我必须指定一个具体的尺寸,即使它可以被推断出来。相反,我想写这样的东西:

这是无效的,但我的意图是能够通过传递适当的关联数据类型(本例中为 U)来指定数组类型,但保持形状不变。这样的事情可能吗?