问题标签 [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.
image - REPA:计算和计算?
我正在尝试这个REPA库,我想以并行和顺序两种方式处理图像。
我可以读取图像(使用其他库,DevIL)并使用computeP(并行)处理它。这是代码(来自haskell wiki上的一个示例)。
现在我想用"computeS"顺序改变"computeP " 。但是,当我尝试编译它时,会出现此错误:
正如您可能猜到的,我是函数式编程的新手。我不知道为什么会发生这个错误。任何帮助都会很棒。
提前致谢。
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
吗?
提前致谢。
haskell - 写入文件,但如果存在 DevIL 和 REPA 则覆盖它
我正在使用 DevIL 库来读取和写入图像。问题是如果文件已经存在,我想覆盖它。
这是我的代码:
我怎样才能做到这一点?我可以这样做还是必须考虑其他方式?它是操作系统的东西吗?
我将该文件用作临时图像,直到用户决定保存它(经过一些更改,如旋转、扩展等)。
haskell - 为什么(Haskell)Repa 只使用一个 CPU?
我一直在使用该Repa
库开发路径跟踪器。我最近通过使用 monadic 重构了它以合并并行性computeP
。但是,我发现性能提升可以忽略不计。而且,监控htop
,似乎程序仍然只使用一个CPU。为了深入研究这个问题,我打开ghci
并运行了以下命令:
没有骰子。repa
似乎仍然只使用一个 CPU 内核,如下所示htop
:
sumP
此外,执行团队在和之间几乎没有变化sumS
,略偏向于sumS
:
我错过了什么?万一这很重要,我使用的是 Arch Linux:
更新
一些评论表明我应该使用文档中指示的-threaded
选项。我处于默认使用的(错误?)印象之下。无论如何,我的程序已经在使用这些标志——这是文件中的片段:ghci
repa
ghci
-threaded
.cabal
此外,我在ghci
使用(我认为)正确的 ghci 选项时重新运行了命令:
仍然没有骰子:
对于此事,我深表感谢任何进一步的帮助。
arrays - 从 ByteString 重新创建
最初我有一个 ByteString,然后我将其解压缩并转换为 Int16,这部分过程花费的时间相对较少。然后,我使用以下行将 Int16s 列表转换为 Repa 数组,
根据分析器的说法,这条线占用了大约 40% 的 CPU 时间,这可能只是表明我正在执行的计算不保证使用 Repa。从 ByteString 到 Repa 数组时,是否有更有效的路线?
我已经尝试了 Repa fromByteString 函数,虽然转换
很慢。我通过首先将数组重新整形为 Word8s 的二维数组,然后折叠到 Int16s 来执行此操作。也许字节数组是正确的方法,而我的转换方法是错误的。
在某些情况下,该程序正在针对用 C/C++ 编写的同一程序进行基准测试。
haskell - 如何正确实现 Foreign.Storable 以创建向量?
我一直在一个项目中工作,该项目一直在使用列表来计算人工神经网络操作。现在,我想对其进行改造Data.Vector
以提高其效率。Foreign.Storable
但是,目前我在实施一个必不可少的定义时遇到了麻烦。
好的,首先,我使用Data.Array.Repa
了类似以下的类型同义词 ( CAMTypes.hs
) 进行计算:
然后后来我想使用Data.Vector
如下:
但是,我收到以下错误:
我已经完成了 的实现instance Storable NTTVU where
,但仍然抱怨;我启用了分析,但没有告诉我更多信息;尝试按步骤调试,但也没有成功。希望有人知道很多关于它以及如何解决它。
有关更多上下文,整个项目和相关文件:
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
数组的解决方案。
arrays - 是否有类似于 Vector 和其他语言的 Haskell Repa 切片函数的使用?
我试图在 Haskell 中获得一个可用版本的多维数组,与numpy
Python 和其他语言中的数组相当。我发现了其他关于如何为特定维度的数组编写自定义函数的问题,但我的目标更重要的是,得到Data.Vector
'sslice
函数的类似行为,这很直观并且可以完成其他语言的括号索引数组的工作。
Vector
的slice
函数有类型
V.slice :: Int -> Int -> V.Vector a -> V.Vector a
所以切片向量v
很简单
Repa
的slice
另一方面有类型
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++Eigen
中matrix.block<p,q>(i,j)
?
haskell - Haskell:并行计算和单子的“顺序属性”
我对为什么 REPA 函数computeP
将其结果打包在一个单子中感到困惑。它具有以下类型签名。
在本教程中它说
这样做的原因是monad 给出了明确定义的序列概念,因此 computeP 强制在 monad 计算的特定点完成并行评估。
同样,堆栈溢出的这个答案指出
Repa 中的并行计算必须是 monadic 的原因部分与惰性有关,但主要与 Repa 无法处理嵌套并行性有关。Monad 的顺序属性在很大程度上解决了它[.]
问题
- 拥有这种“顺序属性”究竟意味着什么?
- monad 如何执行此操作?
例如
/li>computeP
:没有使用哪个monad的限制,所以我可以使用identity monad。那么使用下面的函数来解包 monad 是否可以,或者这会因为它缺少这个顺序属性而产生意想不到的结果?如果可以的话,是否还需要使用 monad?
任何帮助都会很棒。
haskell - 获取图像的高度和宽度
我对 Haskell 很陌生,所以如果这太基本或者没有什么意义,我深表歉意。我正在尝试阅读图像;我可以使用以下代码将其添加到像素数据列表中:
我或多或少地关注正在发生的事情,但我对 Haskell 的了解仍然有限,所以在理解 api 文档时,我有点挣扎。
我真的希望能够解析像素的位置;如果我知道图像的宽度和高度,我知道该怎么做,但我不知道如何获取图像的宽度/高度。
我正在学习 Haskell 课程,但我也在尝试将其付诸实践,以帮助深入了解这些概念。