2012-03-22 8 views
9

http://hilbert-space.de/?p=22शाखा नियॉन intrinsics बनाम हाथ विधानसभा

इस साइट जो काफी यह दिनांकित है पर पता चलता है कि हाथ से लिखा एएसएम एक बहुत बड़ी सुधार तो intrinsics देना होगा। मैं सोच रहा हूं कि 2012 में अब भी यह सच सच है।

तो क्या संकलन अनुकूलन gnu क्रॉस कंपाइलर का उपयोग करके इंट्रिनिक्स के लिए बेहतर है?

+10

अरे, मेरी साइट दिनांकित नहीं है। इस समय मेरे पास अभी करने के लिए अन्य काम है। :-) –

+3

आपकी साइट अद्भुत है। मैंने वहां बहुत समय बिताया है जब मैं इस सामान को समझने की कोशिश कर रहा था। –

उत्तर

11

मेरा अनुभव यह है कि अंतर्निहित वास्तव में परेशानी के लायक नहीं हैं। कंपाइलर के लिए आपके इंट्रिनिक्स के बीच अतिरिक्त रजिस्टर अनलोड/लोड चरणों को इंजेक्ट करना बहुत आसान है। ऐसा करने से रोकने का प्रयास कच्चे नीयन में सामान लिखने से कहीं अधिक जटिल है। मैंने हाल ही के कंपाइलर्स (क्लैंग 3.1 सहित) में इस तरह की चीजें देखी हैं।

इस स्तर पर, मुझे लगता है कि आपको वास्तव में क्या हो रहा है इसे नियंत्रित करने की आवश्यकता है। यदि आप केवल गलत क्रम में चीजें करते हैं तो आपके पास सभी प्रकार के स्टालों हो सकते हैं। इंट्रिनिक्स में ऐसा करना वेल्डर के दस्ताने के साथ सर्जरी की तरह लगता है। यदि कोड इतना महत्वपूर्ण है कि मुझे आंतरिक रूप से इंट्रिनिक्स की आवश्यकता है, तो इंट्रिनिक्स पर्याप्त नहीं हैं। शायद दूसरों के यहां अंतर अनुभव हैं।

+1

यह एआरएम/नियॉन के साथ अपने अनुभव से मेल खाता है। X86/एसएसई और पावरपीसी/अल्टीवीक के लिए कंपेलर पर्याप्त हैं कि इंट्रिनिक्स के साथ लिखे गए सिम कोड को असेंबलर के साथ हरा करना बहुत मुश्किल है, लेकिन नियॉन कोड पीढ़ी (कम से कम जीसीसी के साथ) कहीं भी अच्छे के करीब नहीं लगती है, और यह यदि आप हैंडल कोड असेंबलर के लिए तैयार हैं तो 2x के कारक द्वारा नियॉन इंट्रिनिक्स सिम कोड को हरा करना मुश्किल नहीं है। –

+0

2x मेरे अनुभव से भी मेल खाता है। हम यहां छोटे बदलाव नहीं कर रहे हैं, और मैं उस पर भी अच्छा नहीं हूं। –

+0

डिट्टो - मैंने देखा कि प्रदर्शन में मदद करने के लिए आप असेंबलर में बहुत सी चीजें इंट्रिनिक्स के माध्यम से व्यक्त नहीं की जा सकती हैं, इसलिए जब तक कि संकलक इन चीजों को करने के लिए पर्याप्त स्मार्ट नहीं है (जैसे पता रजिस्टर अपडेट) तो आप भाग्य से बाहर हैं। –

8

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

अद्यतन: ऐप्पल एलएलवीएम संकलक जीसीसी (सबसे खराब) और माइक्रोसॉफ्ट (सर्वश्रेष्ठ) के बीच आता है। यह निर्देश interleaving और न ही इष्टतम रजिस्टर उपयोग के साथ महान नहीं है, लेकिन कम से कम यह उचित कोड उत्पन्न करता है (कुछ स्थितियों में जीसीसी के विपरीत)।

अद्यतन 2: एआरएमवी 8 के लिए ऐप्पल एलएलवीएम कंपाइलर नाटकीय रूप से सुधार किया गया है। यह अब सी और इंट्रिनिक्स से एआरएमवी 8 कोड उत्पन्न करने वाली एक महान नौकरी करता है।

+0

आपके द्वारा पाई गई कंपाइलर को नाम देने का कोई कारण अच्छी तरह से काम नहीं करता है? RVDS? या कुछ और? –

+3

दूसरी कंपनी माइक्रोसॉफ्ट है। उनका एआरएम कंपाइलर शीर्ष पायदान है। जीएनयू लोग यह नहीं सुनना पसंद करते हैं कि एमएस उपकरण कैसे बेहतर हैं, लेकिन यह सच है। – BitBank

+0

मैं जीसीसी के साथ काम करने के लिए उपयोग करता हूं और इंट्रिनिक्स के अनुकूलन बहुत खराब है। :( मुझे कभी पता नहीं था कि माइक्रोस्कोफ्ट कंपाइलर इतना अच्छा है। मुझे अपने कोड का परीक्षण करने दें और देखें कि यह कैसा है। –

1

तो इस सवाल का चार साल पुराना है, अब, और अभी भी खोज परिणामों में दिखाई देता है ...

2016 में चीजों को ज्यादा बेहतर कर रहे हैं।

कि मैं विधानसभा से intrinsics में बदल दिया गया है सरल कोड का एक बहुत अब मेरे द्वारा की तुलना में compilers द्वारा बेहतर है क्योंकि मैं भी पाइपलाइन काम करने के लिए आलसी हूँ अनुकूलित है (अब कितने अलग अलग पाइपलाइनों के लिए?) , जबकि कंपाइलर्स को मुझे सही --mtune= पास करने की आवश्यकता है।

जटिल कोड के लिए जहां पंजीकरण आवंटन तंग हो सकता है, जीसीसी और क्लैंग दोनों अभी भी हस्तलिखित कोड की तुलना में धीमी गति से उत्पादन कर सकते हैं ... या तीन (आईएसएच)। यह ज्यादातर पंजीकरण स्पिल पर है, इसलिए आपको अपने कोड की संरचना से पता होना चाहिए कि क्या यह जोखिम है।

लेकिन दोनों कभी-कभी निराशाजनक दुर्घटनाएं होती हैं। मैं कहूंगा कि अभी जोखिम के लायक है (हालांकि मुझे जोखिम लेने के लिए भुगतान किया जाता है), और यदि आप किसी चीज़ से हिट करते हैं तो एक बग दर्ज करें। इस तरह चीजें बेहतर हो रही रहेंगी।

+0

शायद आप सही हैं, कंपलर इन दिनों बेहतर हैं। लेकिन यह अभी भी पर्याप्त नहीं है। यह कभी नहीं होगा जैसा कि मैंने उपर्युक्त उल्लेख किया है, आप आंतरिक रूप से निष्पादित दिनचर्या लिख ​​सकते हैं, बशर्ते आप नीयन को जानते हों, और दुर्भाग्यवश, वेब अंतर्निहित एनईओएन उदाहरणों में लिखा गया है, विशेष रूप से एओएसपी नीयन कार्यान्वयन एक बुरा मजाक है। यह गंभीरता से है क्योंकि उन्होंने इन्हें लिखा एआरएम के तकनीकी संदर्भ मैनुअल को पढ़ने के बिना हल्के ढंग से कोड। –

+0

स्थिति अद्यतन 2017: मेरा एएसएम 4x4 फ्लोट मैट्रिक्स गुणा इंट्रिनिक्स संस्करण के रूप में लगभग तीन गुना तेजी से चलता है, जो मेरे द्वारा भी लिखा गया है। (क्लैंग, एंड्रॉइड स्टूडियो 3.01 अंतर्निर्मित, टूल संस्करण 27.0 .1, एआरएम मोड) अभी भी समय की एक शुद्ध अपशिष्ट। –

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