jap*_*jap 13 optimization haskell inline vector vectorization
我正在浏览矢量库并发现了一个{-# INLINE_FUSED transform #-},我想知道它是做什么的?我看到它定义在vector.h其他地方.
Mic*_*ael 12
这些定义意味着INLINE_FUSED与...相同INLINE [1]; INLINE_INNER是一样的INLINE [0].该[1]和[0]对于内联排序的标准阶段GHC.见标题7.13.5.5下的讨论.相位控制在http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/pragmas.html
vector需要控制内ghc联各种定义的阶段.第一它想要的功能所有用途stream和unstream被暴露,以使得(上述全部)stream.unstream可以被替换为id在其他情况下,类似地,根据分布在整个所述(改写)RULE编译指示.
向量函数的典型向量写为unstream . f . stream,其中f是Stream to Stream函数.unstream从a构建内存中的实际向量Stream; stream将真实的矢量读入Stream.游戏的目的是减少构建的实际向量的数量.所以三个向量组成向量函数
f_vector . g_vector . h_vector
Run Code Online (Sandbox Code Playgroud)
是真的
unstream . f_stream . stream . unstream . g_stream . stream . unstream . h_stream . stream
Run Code Online (Sandbox Code Playgroud)
他改写成了
unstream . f_stream . g_stream . h_stream . stream
Run Code Online (Sandbox Code Playgroud)
等等.所以我们写了一个新的向量而不是三个.
规则transform比这更有趣,但属于同一个微妙的排序系统:
transform f g (unstream s) = unstream (Bundle.inplace f g s)
transform f1 g1 (transform f2 g2 p) = transform (f1 . f2) (g1 . g2) p
Run Code Online (Sandbox Code Playgroud)
在https://github.com/haskell/vector/blob/master/Data/Vector/Generic/New.hs#L76
所以你可以看到表格内联的内容:
unstream . h_stream . stream . transform f1 g1 . transform f2 g2
. unstream . j_stream . stream $ input_vector
Run Code Online (Sandbox Code Playgroud)
会改写.
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |