2011-09-09 7 views
27

मैं वर्तमान में हास्केल में एक बहु-मॉड्यूल प्रोग्राम लिख रहा हूं। मुझे एक अजीब समस्या मिली है जहां मेरी फ़ाइलों को ठीक से अनुकूलित नहीं किया जा रहा है, भले ही मैं -O2 में गुजर रहा हूं और इसी तरह। प्रश्न में फाइलें 3 डी वेक्टर गणित मॉड्यूल साझा की जाती हैं। जब एक .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 

इस कोड को अलग ढंग से तैयार की जाती है फ़ाइल .hs एक स्टैंडअलोन के रूप में के रूप में जब मैं --make

मेरे आदेश पंक्ति का उपयोग कर main.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 

चीयर्स

+2

यदि मैं सही ढंग से समझ रहा हूं, तो आप जीएचसी के दो अलग-अलग आमंत्रणों के उत्पादन की तुलना कर रहे हैं। यदि यह सही है, तो आपको जीएचसी के अन्य आमंत्रण की कमांड लाइन शामिल करनी चाहिए जिसका आप तुलना कर रहे हैं। –

+1

क्या आप एक ही कोड प्राप्त करते हैं यदि आप अपने कोड पर '{- # INLINE addVeC# -} 'डालते हैं? या यदि आप अपने वेक्टर के क्षेत्रों में '{- # UNPACK # -} 'का उपयोग करते हैं? कुछ परिस्थितियों में जीएचसी मॉड्यूल सीमाओं में इनलाइन नहीं हो सकता है। –

+0

बस थोड़ा और समझाने के लिए। मैं दोनों को संकलित करने के लिए एक ही ghc कमांड लाइन विकल्प का उपयोग करता हूं। इसलिए, मैं main.hs संकलित करने के लिए एक ही विकल्प के साथ जीएचसी का आह्वान करूंगा, जो अप्रत्यक्ष रूप से vector.hs संकलित करता है, लेकिन मैं vector.hs को संकलित करने के लिए एक ही कमांड लाइन का भी उपयोग करता हूं। मुझे अलग-अलग परिणाम मिलते हैं। कोर आउटपुट को शामिल करने के लिए मैं मुख्य प्रश्न अपडेट करूंगा। –

उत्तर

1

मुख्य मॉड्यूल में

{-# INLINE addVeC#-} 

जोड़ें।

जीएचसी को उस अनुकूलन करने से पहले उस संभावना के संकेत की आवश्यकता है, अगर चालक/आविष्कार एक ही मॉड्यूल में नहीं हैं।

संबंधित मुद्दे