Haskell中的INLINE_FUSED编译指示

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联各种定义的阶段.第一它想要的功能所有用途streamunstream被暴露,以使得(上述全部)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)

会改写.