问题标签 [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.
arrays - 单精度数组的 deepSeqArray
我有一个由函数Float
创建的元素向量。getVectorFloat
为了进行一些测量,我需要使用deepSeqArray
. 但是,我无法做到。
这是我的例子:
我得到的错误是:
我不明白为什么Array sh0 a0
不能匹配到Array Dim1 Float
.
谢谢您的帮助
arrays - “循环二维数组”的最佳方式,使用 Repa
我发现 Haskell 的数组库 Repa 非常有趣,并想做一个简单的程序,尝试了解如何使用它。我还使用列表做了一个简单的实现,事实证明它要快得多。我的主要问题是如何改进下面的 Repa 代码以使其最有效(并且希望也非常易读)。我是使用 Haskell 的新手,我在 Repa 上找不到任何易于理解的教程 [编辑Haskell Wiki上有一个,我写这篇文章时不知何故忘记了],所以不要以为我什么都知道。:) 例如,我不确定何时使用 force 或 deepSeqArray。
该程序用于通过以下方式近似计算球体的体积:
- 指定了球体的中心点和半径,以及已知包含球体的长方体内的等距坐标。
- 该程序获取每个坐标,计算到球体中心的距离,如果它小于球体的半径,则用于将球体的总(近似)体积相加。
下面显示了两个版本,一个使用列表,一个使用 repa。我知道代码效率低下,尤其是对于这个用例,但我的想法是稍后让它变得更复杂。
对于以下值,并使用“ghc -Odph -fllvm -fforce-recomp -rtsopts -threaded”编译,列表版本需要 1.4 秒,而 repa 版本需要 12 秒 +RTS -N1 和 10 秒 +RTS - N2,虽然没有转换火花(我有一台运行 Windows 7 64、GHC 7.0.2 和 llvm 2.8 的双核 Intel 机器(Core 2 Duo E7400 @ 2.8 GHz))。(在下面的 main 中注释掉正确的行以运行其中一个版本。)
感谢您的任何帮助!
编辑:一些背景解释了为什么我写了上面的代码:
我主要在 Matlab 中编写代码,我的性能改进经验主要来自该领域。在 Matlab 中,您通常希望使用直接在矩阵上操作的函数进行计算,以提高性能。我在 Matlab R2010b 中实现上述问题,使用下面显示的矩阵版本需要 0.9 秒,使用嵌套循环需要 15 秒。虽然我知道 Haskell 与 Matlab 非常不同,但我希望在 Haskell 中从使用列表到使用 Repa 数组会提高代码的性能。列表-> Repa 数组-> 向量的转换在那里,因为我不够熟练,无法用更好的东西替换它们。这就是我要求输入的原因。:) 上面的时间数字因此是主观的,因为它可以衡量我的性能超过语言的能力,但它现在对我来说是一个有效的指标,因为决定我将使用什么取决于我是否可以使它工作。
tl;博士:我知道我上面的 Repa 代码可能是愚蠢或病态的,但这是我现在能做的最好的。我希望能够编写更好的 Haskell 代码,我希望你能在这个方向上帮助我(dons 已经这样做了)。:)
编辑 2:Repa 代码的新的、更快和更简单的版本
我现在已经阅读了更多关于 Repa 的内容,并思考了一下。下面是一个新的 Repa 版本。在这种情况下,我使用 Repa 扩展函数从值列表(类似于 ndgrid 在 Matlab 中的工作方式)将 x、y 和 z 坐标创建为 3-D 数组。然后我映射这些阵列以计算到球形粒子的距离。最后,我折叠生成的 3-D 距离数组,计算球内有多少个坐标,然后将其乘以一个常数因子以获得近似体积。我的算法实现现在更类似于上面的 Matlab 版本,不再有任何转换为向量。
新版本在我的电脑上运行大约 5 秒,比上面有相当大的改进。如果我在编译时使用“线程”,是否与“+RTS -N2”结合使用,时间是相同的,但是线程版本确实最大限度地利用了我计算机的两个内核。然而,我确实看到几滴“-N2”运行到 3.1 秒,但后来无法重现它们。也许它对同时运行的其他进程非常敏感?基准测试时我已经关闭了计算机上的大多数程序,但仍有一些程序在运行,例如后台进程。
如果我们使用“-N2”并添加运行时开关以关闭并行 GC(-qg),时间会持续下降到 ~4.1 秒,并使用 -qa 来“使用操作系统设置线程亲和性(实验性)”,时间缩短到约 3.5 秒。查看使用“+RTS -s”运行程序的输出,使用 -qg 执行的 GC 少得多。
今天下午我会看看我是否可以在8核计算机上运行代码,只是为了好玩。:)
新代码的空间分析
下面与 Don Stewart 制作的配置文件类型相同,但使用的是新的 Repa 代码。
arrays - 如何在一定范围内使用 Repa 获取数组切片
我正在尝试使用 Repa 实现累积和函数以计算积分图像。我当前的实现如下所示:
问题出在 elementSlice 函数中。在 matlab 或说 numpy 中,这可以指定为 array[inner,0:outer]。所以我正在寻找的是类似的东西:
但是,似乎不允许在 Repa 中的当前范围内指定切片。我考虑过使用 Haskell 中的高效并行模板卷积中讨论的分区,但如果每次迭代都会更改它们,这似乎是一种相当重量级的方法。我还考虑过屏蔽切片(乘以二进制向量) - 但这似乎再次在大型矩阵上表现很差,因为我将为矩阵中的每个点分配一个掩码向量......
我的问题 - 有谁知道是否有计划增加对 Repa 范围内切片的支持?或者有没有一种我已经可以解决这个问题的高效方法,也许用不同的方法?
arrays - Haskell Repa --- 选择函数有点混乱
我对 repa 包中的 select 函数有点困惑:
给出结果
我以为我在 0 到 10 或 0 到 9 之间。为什么它在 0 到 8 之间?
修复 2.0.2.1
arrays - Haskell repa --- 索引映射
想象一下,我想将一个函数映射到一个数组上,但该函数不仅有一个类型,
a -> b
而且
a -> Int -> b
该函数还需要一个索引。我怎么做?
haskell - Accelerate 和 Repa 有不同的用例吗?
我一直在玩 Repa 和 Accelerate——它们都很有趣,但我不知道什么时候使用其中一个,什么时候使用另一个。他们是一起成长,是竞争对手,还是只是为了不同的问题?
haskell - Repa 中的转置和累积和性能不佳
我在 Haskell 库 Repa 中开发了一个如下定义的累积求和函数。但是,当将此功能与转置操作结合使用时,我遇到了一个问题。以下所有 3 项操作都需要不到一秒钟的时间:
但是,如果我写:
性能严重下降。虽然在 1920x1080 的图像上,单独的每个操作都需要不到一秒的时间,但现在组合起来需要 30 多秒......
关于可能导致这种情况的任何想法?我的直觉告诉我这与延迟数组有关,不是在正确的时间强制等等……但我还没有足够的经验来追踪这个问题。
haskell - Repa 中的基本顺序数组转换
我想知道 repa 中是否有 (//) 的类似物?
无法并行化的数组转换需要它。例如,如果函数需要整个数组来更改数组的单个条目,然后将其应用于新数组等等(并且它应该按顺序运行)。
haskell - Repa 嵌套数组定义导致“按顺序执行嵌套并行计算...”
作为一个更大问题的一部分,我试图在数组中定义一个数组,如下所示:
该extract
函数正在使用fromFunction
并为其提供了查找函数,但它也可以使用traverse
andarr ! ...
来达到相同的效果。尽管尽可能早地在任何地方使用force
and ,但控制台在这里填充了消息,然后是正确的结果:deepSeqArray
Data.Array.Repa:按顺序执行嵌套并行计算。您可能在另一个实例已经在运行时调用了“强制”函数。如果第二个版本由于延迟评估而暂停,则可能会发生这种情况。使用“deepSeqArray”确保在“强制”下一个数组之前对每个数组进行全面评估。
虽然我还没有构建一个带有列表来比较速度的版本,但在更大的版本中,性能受到了影响。
这仅仅是嵌套数组定义的结果吗,因此我应该重组我的程序以使内部或外部定义成为列表?我的extract
功能是否可怕以及问题的原因?
这个问题的提示对于做到这一点很有用,但我还没有浏览编译的代码。
haskell - Haskell Repa-0.2.0.1 和 vector-0.9
首先,我喜欢 repa 和 repa-devil,但我的大多数库都需要矢量 >= 0.9。因为我们在 GHC 7.0.* 上,所以我们需要使用 repa-0.2.0.*,但是这些对 vector >= 0.7 && < 0.8 有很强的依赖性。我能够让 repa-0.2.0.* 与 vector-0.9 一起编译,但我有点担心表面下可能存在一些问题。
那么,是否可以放宽 repa 0.2.0.1 中向量依赖性的上限?