2015-07-13 10 views
9

यह Determine cause of segfault when using -O3? से संबंधित है, प्रश्न में, मैं किसी विशेष कार्य में segfault को पकड़ रहा हूं जब -O3 के साथ जीसीसी के एक विशेष संस्करण का उपयोग करके संकलित किया गया है। -O3 पर, वेक्टरनाइज़ेशन निर्देशों का उपयोग किया जाता है (-O2 पर, उनका उपयोग नहीं किया जाता है)।एक फ़ंक्शन के अनुकूलन स्तर को कैसे बदला जाए?

मैं एक कम फ़ंक्शन को कम अनुकूलन स्तर में लपेटना चाहता हूं। Switching off optimization for a specific function in GCC 4.2.2 के अनुसार, मैं इसे कर सकता हूं। हालांकि, प्रश्न और उत्तर के विभिन्न लिंकों के बाद, मुझे "कैसे, बिल्कुल, इसे करने के लिए" का उत्तर नहीं मिला है।

मैं एक अलग अनुकूलन स्तर का उपयोग करने के लिए एक एकल फ़ंक्शन को कैसे चिह्नित करूं?


संबंधित है, मैं एक अलग फाइल करने के लिए इस समारोह के लिए कदम है, और फिर इसके लिए एक अलग makefile नुस्खा प्रदान करने के लिए नहीं करना चाहती। ऐसा करने से वर्म्स की एक और चीज खुलती है, जैसे कि इसे कुछ प्लेटफॉर्म पर जीसीसी 4.9 पर लागू करना।

+3

बस बैक अप लेना कि आप वास्तव में * अलग-अलग फ़ाइल विकल्प नहीं करना चाहते हैं, जैसे कि आप विभिन्न विकल्पों के साथ अलग-अलग इकाइयों को संकलित करते हैं, आप गुर्जुलर के नीचे हैं। –

+0

मुझे [XY-problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) की तरह लगता है। यदि आपका कोड ऑप्टिमाइज़ेशन के साथ मिस्बेव्स करता है, तो यह संभवतः _undefined behaviour_ प्रदर्शित करता है। अगर यह अनुकूलन के बिना दिखाई नहीं देता है तो वास्तव में एक बुरा संकेत है। अनुकूलन के साथ बेवकूफ बनाने की कोशिश करने के बजाय, आप निश्चित रूप से कारण खोजना चाहिए। जब तक आप साबित नहीं कर सकते कि यह संकलक में बग के कारण है, बेशक। इस मामले में सवाल उठता है कि आप इस बग की गारंटी कैसे देते हैं कहीं और नहीं दिखाई देंगे। यहां, एक पैच या नए कंपाइलर का उपयोग करना सही तरीका है। – Olaf

+0

@ ओलाफ - समस्या '-O3' पर दिखाई देती है, लेकिन '-O2' पर मौजूद नहीं है। '-O3' पर, जीसीसी एसएसई निर्देशों का उपयोग करता है। सबसे अच्छा मैं बता सकता हूं, 'vmovdqa' को 128-बिट गठबंधन शब्दों की आवश्यकता है, लेकिन कोड इसकी गारंटी नहीं देता है। जब कोड इस विशेष कोड पथ का उपयोग किया जाता है तो कोड सरणी की गारंटी देता है 64-बिट गठबंधन होता है। कोड क्लैंग और इसके अपरिभाषित व्यवहार sanitizer के साथ भी साफ है।मुझे लगता है कि मैं एक कंपाइलर बग के आसपास काम कर रहा हूँ। – jww

उत्तर

6

यह https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

में वर्णित है, तो आपको इस तरह समारोह की घोषणा के द्वारा स्तर बदल सकते हैं:

void some_func() __attribute__ ((optimize(1))) { 
    .... 
} 

इसके लिए अनुकूलन स्तर 1 बाध्य करने के लिए। , निम्नलिखित की तरह कुछ

#pragma GCC push_options 
#pragma GCC optimize ("-O2") 
void xorbuf(byte *buf, const byte *mask, size_t count) 
{ 
    ... 
} 
#pragma GCC pop_options 

यह पोर्टेबल बनाने के लिए:

+0

क्या कोई पोर्टेबल समाधान है? क्या यह पोर्टेबल है? –

+0

नहीं, यह जीसीसी-विशिष्ट है। क्लैंग में एक अधिक भारी हाथ है [ऑप्टोनोन] (http://clang.llvm.org/docs/AttributeReference.html#optnone-clang-optnone) जो सभी अनुकूलन को मारता है। लेकिन दोनों सिर्फ कस्टम एक्सटेंशन हैं। फ़ंक्शन-स्तरीय ऑप्टिमाइज़ेशन के लिए कोई मानक नहीं है। – viraptor

+0

धन्यवाद वायरैप्टर। मैं एक पोर्टेबल समाधान की उम्मीद कर रहा था क्योंकि यह एक क्रॉस प्लेटफॉर्म लाइब्रेरी है। स्रोतों का एक ही सेट एंड्रॉइड, बीएसडी, आईओएस, लिनक्स, ओएस एक्स, सोलारिस और विंडोज पर उपयोग किया जाता है। – jww

1

यहाँ कैसे pragmas साथ यह करने के लिए है।

#define GCC_OPTIMIZE_AWARE (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) || defined(__clang__) 

#if GCC_OPTIMIZE_AWARE 
# pragma GCC push_options 
# pragma GCC optimize ("-O2") 
#endif 

यह जरूरत है क्योंकि -Wall साथ लिपटे होने के लिए, जीसीसी के पुराने संस्करण -Wno-unknown-pragma समझ में नहीं आता है, और वे एक शोर संकलन का कारण होगा। ओपनबीएसडी पर जीसीसी 4.2.1 जैसे क्षेत्र में पुराने संस्करण का सामना किया जाएगा।

लेकिन When did 'pragma optimize' become available? जीसीसी मेलिंग सूची से पर मार्कस Trippelsdorf के अनुसार:

यह सामान्य रूप से एक बुरा विचार है, क्योंकि "pragma जीसीसी अनुकूलन" केवल एक संकलक डिबगिंग सहायता के रूप में होती है। यह उत्पादन कोड में उपयोग किया जाना चाहिए।

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