如何正确实现Foreign.Storable来创建Vector?

时间:2018-08-22 01:55:51

标签: haskell vector repa storable

我一直在一个项目中工作,该项目一直在使用列表来计算人工神经网络操作。现在,我想将其转换为Data.Vector以提高其效率。但是,目前我在为必要的定义实现Foreign.Storable时遇到麻烦。

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

type NTTVU = Array U VShape NTT

然后,我想按如下方式使用Data.Vector

import qualified Data.Vector.Storable as VS
-- ...
trs = createThreshold 3 0 [9,8,7] :: NTTVU

但是,出现以下错误:

$> VS.singleton trs
*** Exception: Prelude.undefined
CallStack (from HasCallStack):
  error, called at libraries/base/GHC/Err.hs:79:14 in base:GHC.Err
  undefined, called at ./Data/Vector/Storable/Mutable.hs:131:22 in vector-0.12.0.1-JlawpRjIcMJIYPJVsWriIA:Data.Vector.Storable.Mutable
CallStack (from -prof):
  Data.Vector.Storable.Mutable.basicUnsafeNew.size (Data/Vector/Storable/Mutable.hs:131:7-36)
  Data.Vector.Storable.Mutable.basicUnsafeNew (Data/Vector/Storable/Mutable.hs:(124,3)-(132,38))
  Data.Vector.Storable.Mutable.CAF:lvl12_r7YZK (<no location info>)

我已经完成了instance Storable NTTVU where的实现,但是仍然抱怨;我启用了性能分析,但是没有告诉我更多信息。尝试逐步调试,但没有成功。希望有人对此有很多了解以及如何解决。

有关更多上下文,the whole project和相关文件:

1 个答案:

答案 0 :(得分:1)

我发现了问题:sizeOf

在实现它的过程中,它依靠vec存在并具有定义的值,但是事实并非如此。 Vector可存储的实现应事先知道内存大小,这就是为什么它会导致错误。

因此,到目前为止,我已将大小固定为“ 4”,但是如果要分配运行时,则不要使用该大小。

这是该解决方案的提交: