2011-09-09 7 views
27

Tôi hiện đang viết một chương trình đa mô-đun trong Haskell. Tôi đã tìm thấy một vấn đề lạ mà các tập tin của tôi không được tối ưu hóa đúng cách, mặc dù tôi đang đi qua -O2 và cứ tiếp tục như vậy. Các tệp được đề cập là các mô-đun toán học vector 3D chia sẻ. Khi được biên dịch riêng lẻ thành một .o, các mô-đun này được tối ưu hóa chính xác. Khi được biên dịch như là một phần của chương trình lớn hơn bằng cách sử dụng - make, chúng không được tối ưu hóa chính xác. Cốt lõi là khá khác nhau.GHC không tối ưu hóa các mô-đun khác với mô-đun chính

tôi đã đưa vào một số mã kiểm tra rút gọn đơn giản vào một tập tin 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) 

Và nhập khẩu nó từ chính ...

import Vector 

Mã này được biên dịch khác nhau dưới dạng tệp .hs độc lập thay vì khi tôi tạo main.hs bằng cách sử dụng --make

Dòng lệnh của tôi là:

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 

Cheers

+2

Nếu tôi hiểu chính xác, bạn đang so sánh đầu ra của hai lần gọi GHC khác nhau. Nếu đúng, bạn nên bao gồm dòng lệnh của lệnh gọi GHC khác mà bạn đang so sánh. –

+1

Bạn có nhận được cùng một mã nếu bạn đặt '{- # INLINE addVeC# -}' trên mã của bạn không? Hoặc nếu bạn sử dụng '{- # UNPACK # -}' trên các trường của vectơ của bạn? GHC có thể không nằm trong giới hạn mô-đun trong một số trường hợp. –

+0

Chỉ cần giải thích thêm một chút. Tôi sử dụng các tùy chọn dòng lệnh ghc tương tự để biên dịch cả hai. Vì vậy, tôi sẽ gọi GHC với các tùy chọn tương tự để biên dịch main.hs, mà biên dịch vector.hs gián tiếp, nhưng tôi cũng sử dụng cùng một dòng lệnh để biên dịch vectơ.hs trực tiếp. Tôi nhận được kết quả khác nhau. Tôi sẽ cập nhật câu hỏi chính để bao gồm đầu ra cốt lõi. –

Trả lời

1

Thêm

{-# INLINE addVeC#-} 

trong module chính.

GHC cần chỉ báo về khả năng đó trước khi thực hiện tối ưu hóa đó, nếu người invokator/invokated không có trong cùng một mô-đun.