2011-03-03 27 views
5

के साथ आंशिक मूल्यांकन/विशेषज्ञता सी/सी ++ के लिए आंशिक) संकलन-समय मूल्यांकन (सी ++ में टेम्पलेट पैरामीटर के साथ नहीं) में दिलचस्पी है।एलएलवीएम-जीसीसी या जीसीसी

double mypower(double x, int n) { 
    int i; 
    double ret = x; 
    for (i = 1; i < n; i++) { 
    ret *= x; 
    } 
    return ret; 
} 

तो फिर तुम फोन इस समारोह कहीं कोड में साथ: निम्नलिखित मामले पर विचार करने देता है (से [1] ले जाया)

mypower(x,3); // y varies all the time, 

फिर संकलक इस (जैसे पाश unrolling) का अनुकूलन कर सकते हैं। कुछ अक्सर उपयोग किए जाने वाले फ़ंक्शन का उपयोग उस ऑप्टिमाइज़ेशन से वास्तव में लाभ हो सकता है (मैन्युअल रूप से विशेष फ़ंक्शन बनाने के द्वारा परीक्षण किया जाता है)। प्रेजेंटेशन [1] एक प्रक्रिया को descibes जहां समारोह की खोज की जाती है और समारोह के एक विशेष संस्करण द्वारा प्रतिस्थापित किया जाता है। ऐसा लगता है कि काम करता है। लेकिन यह बहुत सार्वभौमिक प्रतीत नहीं होता है, कोड को उन कार्यों के लिए लिखा जाना चाहिए जिन्हें प्रतिस्थापित किया जाना चाहिए।

प्रस्तुति 2008 से प्रतीत होती है, मुझे इस स्रोत की तुलना में पर्याप्त जानकारी नहीं मिली। तब से कुछ भी सुधार हुआ है? मैं किसी प्रकार का automatism पसंद करूंगा, जो संभवत: विशेषता वाक्यविन्यास द्वारा नियंत्रित सभी कार्यों के लिए समान होता है (उदा। __attribute__(peval) ...)। इसके अलावा मैं ऑब्जेक्ट उन्मुख कोड के लिए काम करना चाहता हूं, विभिन्न वस्तुओं के लिए विशेष कक्षाएं बनाना ([2] ऐसा लगता है कि यह संभव नहीं है)।

इसके अतिरिक्त, मैं यह विशेषज्ञता न केवल कोड में पाए गए स्थिरांक के लिए काम करना चाहूंगा। मैं LLVM आईआर (बाईटकोड) को संकलित एक कार्यक्रम के बारे में सोच रहा हूँ निम्नलिखित कर सकता है:

  1. , एक दुभाषिया में एक आरंभीकरण चरण के दौरान programm चल रहा है कि प्रारंभ चरण के दौरान कार्यक्रम के लिए फ़ाइल से कुछ विन्यास पढ़ सकते हैं। प्रारंभ करने के बाद दुभाषिया बंद कर दिया गया है।

  2. कुछ चर (सदस्य चर सहित) उस बिंदु से तय किए गए हैं। इन चरों को निकालें (उदा। संकलन के दौरान विशेषता द्वारा चिह्नित)।

  3. विशिष्ट कार्य और कक्षाएं बनाएं। इन्हें बाइटकोड में क्लोन करें।

  4. देशी मशीन कोड बनाने के लिए जेआईटी चलाएं।

यह बहुत कुछ है जिसे मैं पूछता हूं और केवल कुछ गणना गहन कार्यक्रम इस तरह के अनुकूलन से लाभान्वित होंगे। लेकिन कुछ लोगों को उस पर काम करना चाहिए। मैं शायद Google को खिलाने के लिए सही खोज शब्द नहीं जानता हूं।

नोट: कृपया गैर-प्रकार के पैरामीटर या मैन्युअल विशेषज्ञता वाले टेम्पलेट वर्गों का सुझाव न दें, मैं पहले से ही ऐसा करता हूं। मैं बस मेरे लिए काम कर संकलक पसंद करेंगे।

लिंक:

[1] Presentation how to partial evaluate in LLVM

[2] Forum message about partial evaluation

+0

कुछ हद तक संबंधित: http://stackoverflow.com/questions/2940367/what-is-more- कुशल-using-pow-to-square-or-just-multiply-it-with-itself/2940800#2940800 –

उत्तर

1

यह काफी हद तक interprocedural अनुकूलन के क्षेत्र में है। llvm उनमें से कुछ हैं, खासकर आईपी निरंतर प्रचार जो केवल तभी मदद करेगा जब आपने अनुवाद इकाई में सभी कॉल साइटों पर अपनी शक्ति (x, 3) का उपयोग किया हो। आप जो वर्णन करते हैं वह संभव है, लेकिन वास्तव में अभी तक नहीं किया गया है। आईपीसीपी पास में सुधार करना आप जो करना चाहते हैं वह है - इसे क्लोन करके और किसी विशेष कॉल साइट पर फ़ंक्शन का विशेषज्ञ बनना।यह हो सकता है, यदि आपके पास पर्याप्त अनुवाद इकाइयां हैं, तो कुछ बहुत बड़े कोड ब्लोट का कारण बनता है, यही कारण है कि लोगों ने वास्तव में ऐसा करने में नहीं देखा है।

यह संभवतः एलटीओ स्तर पर कुछ और उपयोग होगा जब आप किसी प्रोग्राम में सभी कॉल देख सकते हैं।

0

आप स्रोत-से-स्रोत परिवर्तनों का उपयोग करके ऐसा कर सकते हैं।

हमारे DMS Software Reengineering Toolkit का उपयोग इसे लागू करने के लिए किया जा सकता है। डीएमएस एएसटी को स्रोत कोड का विश्लेषण करने के लिए स्पष्ट भाषा परिभाषाओं का उपयोग करता है, एएसटी की सोर्स कोड पर सुंदर प्रिंटिंग, विभिन्न प्रकार की प्रतीक तालिका, नियंत्रण/डेटा प्रवाह क्षमताओं को प्रदान करता है, और एक कस्टम स्रोत-कोड ट्रांसफार्मर बनाने में सक्षम बनाने के लिए रूपांतरण क्षमता प्रदान करता है। डीएमएस में many front ends for differenct languages है जिसमें पूर्ण प्रीप्रोसेसरों के साथ सी और सी ++ शामिल हैं।

डीएमएस के साथ अपना काम पूरा करने के लिए, आप अपने सिस्टम के सभी कोड को पार्स करने के लिए सी पार्सर का उपयोग करेंगे (क्योंकि आपको किसी भी आंशिक विशेषज्ञता के लिए सभी कॉल साइट्स का निरीक्षण करना होगा)। आपको आंशिक मूल्यांकन निर्दिष्ट करने के तरीके को परिभाषित करने की आवश्यकता होगी; जैसा कि आपने सुझाव दिया है, वैसे ही, एक फंक्शन कॉल लिखना है जो तर्कों से बंधे तर्कों के साथ है, लेकिन आप इसे मनमाने ढंग से अभिव्यक्तियों के तर्कों के लिए सामान्यीकृत कर सकते हैं। इस तरह के एक विनिर्देश को डीएमएस के पैटर्न पार्सर द्वारा पार्स किया जा सकता है, जो मनमाने ढंग से lnaguage nonterminals को संसाधित कर सकता है, उदाहरण के लिए, एक फ़ंक्शन कॉल: -} आपको इन विनिर्देशों को कहीं कहीं पार्क करना होगा; शायद एक अतिरिक्त बाहरी फ़ाइल के रूप में, या कॉल साइट पर या उसके पास टिप्पणियों के रूप में।

आंशिक-eval विनिर्देश के एक पार्स के साथ, आपको ब्याज के वास्तविक कार्य को निर्धारित करने के लिए फ़ंक्शन कॉल नाम देखने की आवश्यकता है; यह स्रोतों के उस ढेर में कहीं है और प्रतीक तालिका इसे ढूंढना आसान बनाती है। किसी विशेषज्ञता के साथ एक कॉल साइट को देखते हुए, पहचान किए गए फ़ंक्शन के लिए एएसटी को दोहराया जा सकता है और तर्क प्रतिस्थापित किए जा सकते हैं; संभवतः केवल कुछ ही बदलावों का उपयोग करके, लेकिन आपको विशेष रूप से कार्य के अंदर एक व्याख्यात्मक दायरे द्वारा तर्क के कब्जे के लिए देखना होगा। इसके आसपास होने के लिए अतिरिक्त परिवर्तन की आवश्यकता हो सकती है। निर्दिष्ट फ़ंक्शन के लिए एक नया नाम और संक्षिप्त तर्क सूची gensymming के बाद, आप मूल कार्य परिभाषा साइट के पास अपनी एएसटी दोबारा डालेंगे, कॉल साइट को उचित रूप से संशोधित करें, और संशोधित एएसटी को थूक दें। चाहे आप विशेष मामलों के लिए अनलॉक लूप में अतिरिक्त ट्रांसफॉर्म जोड़ना चाहते हैं, या जो कुछ भी आपको रूचि देता है, वह भी व्यावहारिक है।

डीएमएस का उपयोग सी और सी ++ कोड पर बड़े पैमाने पर परिवर्तन करने के लिए किया गया है; यह "तकनीकी रूप से" आसान लगता है। डीएमएस जैसे उपकरण से परिचित होने का छोटा मामला है; वहां एक उचित सीखने की वक्र है।