【问题标题】:Generate vector code from Haskell?从 Haskell 生成矢量代码?
【发布时间】:2010-11-29 22:53:04
【问题描述】:

是否有可能让 GHC 为各种 SSE 生成生成 SIMD 代码?

例如。有这样的程序

import Data.Array.Vector
main = print . sumU $ (enumFromToFracU 1 10000000 :: UArr Double)

我可以看到生成的代码(为 64 位 x86 编译)在标量模式下使用 SSE 指令(C 和 asm 后端)。所以addsd而不是addpd。对于我从事的程序类型,向量指令的使用对性能很重要。对于像我这样的新手,有没有一种简单的方法可以让 GHC 使用 SSE 对代码进行 SIMDize?

【问题讨论】:

    标签: loops haskell vector parallel-processing simd


    【解决方案1】:

    是的,可以通过 C 后端实现,但需要反复试验。 我使用的标志:

     gcc -O2 -funbox-strict-fields -fvia-C -optc-O3 -march=native -optc-msse4
    

    然后希望 GCC 发现 GHC 通过 uvector 代码生成的紧密循环,并意识到 SIMD 的潜力。

    【讨论】:

    • 感谢您的提示 - 不能完全让 ghc&gcc 在一些简单的 uvector 调用上进行合作。现在我知道它会继续试验。至少从表面上看,icc 似乎不能用作 C 后端 - 它在 ghc-6.10.4/lib/ghc-6.10.4/include/Regs.h 上出现问题,因为“错误:变量类型”联合 “不适合注册”。
    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多