2011-09-09 20 views
27

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

我已经把一些简单的精简测试代码为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 

该代码被编译不同作为一个独立的.hs文件,而不是当我建立main.hs使用--make

我的命令行是:

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 

干杯

+2

如果我理解正确,那么您将比较两个不同的GHC调用的输出。如果这是正确的,你应该包括你正在比较的另一个GHC调用的命令行。 –

+1

如果你在代码中加入了{{##INLINE addVec# - }',你会得到相同的代码吗?或者,如果你在矢量的字段上使用了“{ - #UNPACK# - }”?在某些情况下,GHC可能不会跨越模块边界。 –

+0

只是为了解释一点。我使用相同的ghc命令行选项来编译这两个选项。所以,我会用相同的选项来调用GHC来编译main.hs,它会间接编译vector.hs,但我也使用相同的命令行直接编译vector.hs。我得到不同的结果。我会更新主要问题以包含核心输出。 –

回答

1

主模块中添加

{-# INLINE addVeC#-} 

如果invokator/invokated不在同一个模块中,GHC需要在进行优化之前指示该可能性。