2010-03-14 14 views
7

क्या सर्वोत्तम संकलक विकल्प (किसी दिए गए मशीन पर) को स्वचालित रूप से खोजने का कोई तरीका है, जिसके परिणामस्वरूप सबसे तेज़ संभव निष्पादन योग्य है?दिए गए मशीन पर सबसे तेज़ एक्सई के लिए स्वचालित रूप से कंपाइलर विकल्प ढूंढें?

स्वाभाविक रूप से, मैं g++ -O3 का उपयोग करता हूं, लेकिन अतिरिक्त झंडे हैं जो कोड को तेज़ी से चला सकते हैं, उदाहरण के लिए -ffast-math और अन्य, जिनमें से कुछ हार्डवेयर-निर्भर हैं।

क्या किसी को कुछ कोड पता है जो मैं अपने configure.ac फ़ाइल (जीएनयू ऑटोोटूल) में डाल सकता हूं, ताकि ध्वज ./configure कमांड द्वारा स्वचालित रूप से मेकफ़ाइल में जोड़ा जा सके?

स्वचालित झंडे को स्वचालित रूप से निर्धारित करने के अलावा, मुझे कुछ उपयोगी कंपाइलर झंडे में दिलचस्पी होगी जो सबसे अनुकूलित एक्जिक्यूटिव के लिए डिफ़ॉल्ट के रूप में उपयोग करने के लिए अच्छे हैं।

अद्यतन: अधिकांश लोग केवल अलग झंडे का प्रयास करने और अनुभवी सर्वोत्तम विकल्पों का चयन करने का सुझाव देते हैं। उस विधि के लिए, मेरे पास एक फॉलो-अप प्रश्न होगा: क्या ऐसी कोई उपयोगिता है जो उस मशीन के लिए संभव है जो सभी कंपाइलर झंडे सूचीबद्ध करती है (उदाहरण के लिए यदि एसएसई निर्देश उपलब्ध हैं तो परीक्षण करें)?

+5

"सर्वश्रेष्ठ" अनुकूलन विकल्प आपके कोड वास्तव में क्या करता है इस पर निर्भर करता है। केवल आप ही जानते हैं। –

+1

और इसे 'ग्यारह तक जाना' बनाने के लिए आपको इसे प्रोफ़ाइल करना चाहिए। कंपाइलर टॉगल के मामले में कुछ मुफ्त लंच छोड़े गए हैं। –

+1

ठीक है, वास्तव में इसे मेरे कोड में दर्ज़ करने के लिए मुझे हाथों का चयन करना चाहिए और उन्हें प्रोफाइल करना चाहिए। लेकिन यह उस मशीन पर उचित '-march = cpu-type' जोड़ने के लिए चोट नहीं पहुंचा सकता है? और कार्यक्रमों की कुछ श्रेणियां होनी चाहिए जो कुछ अन्य (हार्डवेयर-निर्भर) संकलन झंडे से लाभान्वित हों? उदाहरण के लिए, मेरा प्रोग्राम श्रेणी में आता है "बहुत सारे फ़्लोटिंग-पॉइंट ऑपरेशंस का उपयोग करता है"। – Frank

उत्तर

1

क्या सर्वोत्तम संकलक विकल्प (किसी दिए गए मशीन पर) स्वचालित रूप से खोजने का कोई तरीका है, जिसके परिणामस्वरूप सबसे तेज़ संभव निष्पादन योग्य होता है?

सं

आप संकलक विकल्पों में से एक बड़ी वर्गीकरण के साथ अपने कार्यक्रम संकलन सकता है, तो बेंचमार्क हर संस्करण है, तो एक "सबसे तेज," है कि लेकिन यह है कि शायद ही विश्वसनीय और शायद उपयोगी नहीं है का चयन आपके कार्यक्रम के लिए

+1

कौन सा, बीटीडब्लू, ठीक है अकोवे (@ergosys द्वारा उल्लिखित) क्या करता है: जीसीसी अनुकूलन झंडे के विभिन्न संयोजनों के साथ कार्यक्रम सैकड़ों, यहां तक ​​कि हजारों बार संकलित और बेंचमार्क (यही कारण है कि कार्यक्रम सरल होना चाहिए और बेंचमार्क कम होना चाहिए) और आनुवांशिक एल्गोरिदम का उपयोग करके झंडे का एक अच्छा सेट "विकसित" करें। –

2

कुछ कंपाइलर दिए गए संकलन होस्ट के लिए स्वचालित रूप से सबसे आक्रामक अनुकूलन का चयन करने के लिए "-फास्ट" विकल्प प्रदान करते हैं। http://en.wikipedia.org/wiki/Intel_C%2B%2B_Compiler

दुर्भाग्य से, g ++ समान झंडे प्रदान नहीं करता है।

आपके अगले प्रश्न के अनुवर्ती अनुवर्ती रूप में, जी ++ के लिए आप -mtune विकल्प -O3 के साथ एक साथ उपयोग कर सकते हैं जो आपको उचित तेज़ डिफ़ॉल्ट देगा। चुनौती तब आपके संकलन मेजबान के प्रोसेसर प्रकार को ढूंढना है। किसी को आवश्यक परीक्षण लिखने के लिए आप autoconf मैक्रो संग्रह को देखना चाह सकते हैं। अन्यथा, लिनक्स मानते हुए, आपको प्रोसेसर प्रकार

4

प्राप्त करने के लिए /proc/cpuinfo को पार्स करना होगा, मुझे नहीं लगता कि आप इसे कॉन्फ़िगर-टाइम पर कर सकते हैं, लेकिन कम से कम एक प्रोग्राम है जो एक विशेष निष्पादन योग्य जीसीसी विकल्प झंडे को अनुकूलित करने का प्रयास करता है और मशीन। उदाहरण के लिए http://www.coyotegulch.com/products/acovea/ देखें।

आप अपने कोड के लिए विकल्पों का एक अच्छा सेट खोजने के लिए अपने लक्ष्य मशीन के कुछ ज्ञान के साथ इसका उपयोग करने में सक्षम हो सकते हैं।

+0

एटीएलएएस (स्वचालित रूप से ट्यूनेड लीनियर बीजगणित सॉफ्टवेयर) के लिए डिट्टो, बीएलएएस/लैपैक का कार्यान्वयन। Http://math-atlas.sourceforge.net/ – celion

+0

देखें अकोवे का लिंक टूटा हुआ है। यहां विकल्प है: http: //stderr.org/doc/acovea/html/acoveaga.html – OutputLogic

2

कुछ googling के बाद, मुझे यह स्क्रिप्ट मिली: gcccpuopt

मेरी मशीनों (32 बिट) में से एक पर, यह आउटपुट:

-march=pentium4 -mfpmath=sse 

किसी अन्य मशीन (64 बिट) यह आउटपुट पर:

$ ./gcccpuopt 
Warning: The optimum *32 bit* architecture is reported 
-m32 -march=core2 -mfpmath=sse 

इसलिए, यह सही नहीं है, लेकिन उपयोगी हो सकता है।

2

-mcpu=native/-mtune=native जीसीसी विकल्प भी देखें।

+0

कूल, मैं कोशिश करूँगा। यह जीसीसी 4.2 में नया है, इसलिए मुझे अपडेट करना होगा ... – Frank

0

यह एक ऐसा समाधान है जो मेरे लिए काम करता है, लेकिन इसे स्थापित करने में थोड़ा समय लगता है। हंस पेटटर लैंगटैंगन (मेरी राय में एक उत्कृष्ट पुस्तक) द्वारा "कम्प्यूटेशनल साइंस फॉर कम्प्यूटेशनल साइंस" में, एक उदाहरण को आपके सी/फोरट्रान/के लिए सर्वोत्तम कंपाइलर विकल्पों को निर्धारित करने के लिए संख्यात्मक प्रयोग करने के लिए एक छोटी पायथन लिपि का उपयोग करने के लिए दिया गया है ... कार्यक्रम। यह "नेस्टेड विषम डेटा संरचनाओं" पर अध्याय 1.1.11 में वर्णित है।

पुस्तक से उदाहरणों के लिए स्रोत कोड http://folk.uio.no/hpl/scripting/index.html पर स्वतंत्र रूप से उपलब्ध है (मुझे लाइसेंस का यकीन नहीं है, इसलिए यहां कोई कोड पुन: उत्पन्न नहीं होगा), और विशेष रूप से आप कोड में समान संख्यात्मक परीक्षण के लिए कोड पा सकते हैं फ़ाइल src/app/waveim2D/F77/compile.py में TCSE3-3rd-example.tar.gz में, जिसे आप एक स्क्रिप्ट लिखने के लिए आधार के रूप में उपयोग कर सकते हैं जो एक विशेष सिस्टम/भाषा के लिए उपयुक्त है (आपके मामले में C++)।

-2

आपके ऐप को अनुकूलित करना मुख्य रूप से आपका काम है, संकलक नहीं।

Here's an example of what I'm talking about.

बार जब आप अपने कोड (पुस्तकालय कोड में नहीं) में है कि किया है, यदि आपके ऐप गणना बाध्य है, हॉटस्पॉट के साथ तो गति के लिए संकलक अनुकूलन कुछ फर्क होगा, ताकि आप कोशिश कर सकते हैं विभिन्न ध्वज संयोजन।

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