Skip to main content
 首页 » 编程设计

optimization之GHC 没有优化除主模块以外的模块

2024年10月25日40mfrbuaa

我目前正在用 Haskell 编写一个多模块程序。我发现了一个奇怪的问题,即我的文件没有得到正确优化,即使我传入了 -O2等等。有问题的文件是共享的 3D 矢量数学模块。当单独编译为 .o 时,这些模块已正确优化。当使用 --make 编译为较大程序的一部分时,它们未正确优化。核心完全不同。

我已将一些简单的精简测试代码放入 vector.hs 文件中:

data TestVector = TestVector !Double !Double !Double !Double 
 
addVec :: TestVector -> TestVector -> TestVector 
 
addVec (TestVector x1 y1 z1 w1) (TestVector x2 y2 z2 w2) = 
  TestVector (x1 + x2) (y1 + y2) (z1 + z2) (w1 + w2) 

并从主...
import Vector 

与我使用 --make 构建 main.hs 时相比,此代码作为独立 .hs 文件的编译方式不同。

我的命令行是:
ghc -tmpdir tmp -hidir hi -odir obj -fext-core -fexcess-precision -funbox-strict-fields -threaded -rtsopts -fwarn-missing-signatures -Wall -O2 Main.hs -o main 

干杯

请您参考如下方法:

添加

{-# INLINE addVec #-} 

在主模块中。

如果调用者/被调用者不在同一个模块中,GHC 需要在进行优化之前指出这种可能性。