2014-09-04 10 views
7

में "मान लें" खंड जीसीसी (नवीनतम संस्करण: 4.8, 4.9) में __assume() के समान "अनुमान" खंड है जो आईसीसी द्वारा समर्थित अंतर्निहित है? E.g., __assume(n % 8 == 0);जीसीसी

+3

देखें: '__builtin_expect'? https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html –

+0

ऐसा लगता है कि यह शाखा भविष्यवाणी के लिए है, मुझे वेक्टरिज़र को संकेत देना होगा कि लूप गिनती एक अच्छी संख्या है। – user2052436

+0

मेरे पास आईसीसी तक पहुंच नहीं है, क्या यह विज़ुअल सी __assume() जैसा ही है? (http://msdn.microsoft.com/en-us/library/1b3fsfxw.aspx) –

उत्तर

9

जीसीसी 4.8.2 के अनुसार, जीसीसी में __assume() के बराबर नहीं है। मुझे नहीं पता क्यों - यह बहुत उपयोगी होगा। माफसो ने सुझाव दिया:

#define __assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0) 

यह एक पुरानी चाल है, जिसे कम से कम 2010 तक और शायद अब तक जाना जाता है। संकलक आमतौर पर 'कंड' के मूल्यांकन को अनुकूलित करता है क्योंकि किसी भी मूल्यांकन के लिए जो झूठा झूठा है, वैसे भी अपरिभाषित होगा। हालांकि, अगर यह एक अपारदर्शी (गैर-रेखांकित) फ़ंक्शन पर कॉल करता है तो यह 'cond' को अनुकूलित करने के लिए प्रतीत नहीं होता है। कंपाइलर को यह मानना ​​चाहिए कि अपारदर्शी कॉल का दुष्प्रभाव हो सकता है (उदा।, वैश्विक बदलें) और कॉल को ऑप्टिमाइज़ नहीं कर सकता है, हालांकि यह परिणाम पर किसी भी गणना और शाखाओं को अनुकूलित कर सकता है। इस कारण से, मैक्रो दृष्टिकोण सबसे अच्छा आंशिक समाधान है।

+1

इस मुद्दे पर जीसीसी 5.2 और 6.1 में भी आया। अंतर्निहित अभिव्यक्ति अपारदर्शी होने पर cond को अनुकूलित नहीं किया जाता है। भले ही कंड शुद्ध फ़ंक्शन में लपेटा गया हो, जो आपको लगता है कि कंपाइलर ऑप्टिमाइज़ करने के लिए स्वतंत्र होगा। इसके अलावा मुझे यह पता लगाने का कोई तरीका नहीं मिला है कि संकलक दूर कंडिशन को अनुकूलित करता है या नहीं। जिसका मतलब है कि संकलक चुपचाप अनावश्यक कोड जोड़कर इस मैक्रो का उपयोग करके प्रदर्शन को चोट पहुंचाना संभव है। पारदर्शी अभिव्यक्ति के साथ मैक्रो बहुत अच्छी तरह से काम करता है। – user377178