2012-05-29 10 views
16

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

1- उच्च लागत निर्देश से बचें: विभाजन, वर्गमूल, पाप,

  • उपयोग तार्किक बदलाव क्योंकि विभाजित या जब संभव उलटा द्वारा 2.
  • गुणा से गुणा करने के लिए।

2- अनुकूलन भीतरी "के लिए" लूप: वे एक botleneck तो हम अंदर विशेष रूप से विभाजन, वर्ग जड़ों कई गणना करने, से बचना चाहिए रहे हैं ..

3 उपयोग लुक-अप टेबल कुछ गणितीय कार्य (sin, cos, ...)

उपयोगी उपकरणों के लिए

  • objdump: संकलित कार्यक्रम के असेंबली कोड हो जाता है। यह दो कार्यों की तुलना करने की अनुमति देता है और जांचता है कि यह वास्तव में अनुकूलित है या नहीं।
+8

** खबरदार **: आजकल टोंटी स्मृति अधिक बार नहीं है (और इसलिए इस lut इतना महान नहीं कर रहे हैं ...)। यह एआरएम पर भरोसा कर सकता है, स्वीकार्य रूप से, लेकिन ... बेहतर जांच करें कि कुछ भी नहीं निवेश करें। –

+0

हाँ। लेकिन रीयल-टाइम अनुप्रयोगों में, प्रति फ्रेम की बहुत सारी गणनाएं करते हैं, मेरा मानना ​​है कि अनुकूलन "प्रति सेकंड कुछ फ्रेम" को बचा सकता है। कहें "कुछ" 8fps हैं, मेरे मामले के साथ, यही कारण है कि मुझे लगता है कि यह सवाल महत्वपूर्ण है। –

+3

क्या आपके पास विभिन्न मीट्रिक जांचने की संभावना है, जैसे कैश मिस, मेमोरी बस एक्सेस इत्यादि? यह जानना भी बहुत उपयोगी है कि आपकी मेम बस एक बाधा है या नहीं। बीटीडब्ल्यू, ऑफ-विषय, (डोनोस्टिया == सैन सेबेस्टियन)? यदि हां, तो मुझे वास्तव में वह शहर पसंद है! – Brady

उत्तर

17

सामान्य नियम के बारे में आपके प्रश्न का उत्तर के लिए, यहाँ कुछ सुझाव हैं:

1) आप उल्लेख किया है , कोई विभाजन निर्देश नहीं है। तार्किक बदलावों का उपयोग करें या जब संभव हो तो उलटा करके गुणा करें।
2) सीपीयू निष्पादन की तुलना में मेमोरी बहुत धीमी है; छोटी लुकअप टेबल से बचने के लिए लॉजिकल ऑपरेशंस का उपयोग करें।
3) लिखने वाले बफर का सर्वोत्तम उपयोग करने के लिए एक समय में 32-बिट्स लिखने का प्रयास करें। शॉर्ट्स या वर्ण लिखना कोड को धीमा कर देगा। दूसरे शब्दों में, यह तार्किक के लिए तेज़ है- या छोटे बिट्स एक साथ और उन्हें DWORDS के रूप में लिखें।
4) अपने एल 1/एल 2 कैश आकार से अवगत रहें। एक सामान्य नियम के रूप में, एआरएम चिप्स में इंटेल की तुलना में बहुत छोटे कैश होते हैं।
5) जब संभव हो तो सिमड (एनईओएन) का उपयोग करें।नीयन निर्देश काफी शक्तिशाली हैं और "वेक्टरिजेबल" कोड के लिए, काफी तेज़ हो सकते हैं। नीयन इंट्रिनिक्स अधिकांश सी ++ वातावरण में उपलब्ध हैं और हाथ से ट्यून किए गए एएसएम कोड लिखने के लगभग तेज़ हो सकते हैं।
6) लूपिंग पढ़ने को गति देने के लिए कैश प्रीफेच संकेत (पीएलडी) का उपयोग करें। एआरएम में स्मार्ट इंटेल चिप्स के तरीके से स्मार्ट सटीक तर्क नहीं है।
7) अच्छे कोड उत्पन्न करने के लिए कंपाइलर पर भरोसा न करें। एएसएम आउटपुट को देखें और एएसएम में हॉटस्पॉट को फिर से लिखें। बिट/बाइट मैनिपुलेशन के लिए, सी भाषा चीजों को कुशलता से निर्दिष्ट नहीं कर सकती क्योंकि उन्हें एएसएम में पूरा किया जा सकता है। एआरएम में शक्तिशाली 3-ऑपरेंड निर्देश, मल्टी-लोड/स्टोर और "फ्री" शिफ्ट हैं जो संकलक को उत्पन्न करने में सक्षम हैं जो बेहतर प्रदर्शन कर सकते हैं।

+0

मुझे व्यस्त और तार्किक बदलावों से गुणा करना पसंद है। मैं नीयन के बिना उपकरणों पर निश्चित बिंदु का उपयोग करने का भी प्रयास करता हूं। मैं आपकी युक्तियों के साथ पोस्ट अपडेट करूंगा, धन्यवाद! –

+0

5 के संबंध में): मैंने नीयन इंट्रिनिक्स का उपयोग करने के बारे में कुछ SO चर्चाएं देखी हैं। इसे समेटने के लिए, ऐसा लगता है कि बहुत से लोग यह खोज रहे हैं कि कंपाइलर आंतरिक असेंबली कोड में इंट्रिनिक्स का अनुवाद करने का बहुत अच्छा काम नहीं कर रहा है। सर्वसम्मति यह प्रतीत होती है कि यदि आप नीयन का उपयोग करना चाहते हैं, तो आप इसे सीधे असेंबली कोड के रूप में लिखने से बेहतर हैं। – Leo

+0

@ लियो - यह कंपाइलर पर निर्भर करता है। एनईओएन इंट्रिनिक्स संकलित करने में जीसीसी बहुत खराब है। ऐप्पल का एलएलवीएम इतना है और माइक्रोसॉफ्ट के कंपाइलर्स काफी अच्छे हैं। – BitBank

15

किसी एप्लिकेशन को अनुकूलित करने का सबसे अच्छा तरीका एक अच्छा प्रोफाइलर का उपयोग करना है। दक्षता के बारे में सोचने के लिए कोड लिखना हमेशा अच्छा विचार है, लेकिन आप उन परिवर्तनों से बचना भी चाहते हैं जहां आप "सोचते हैं" कोड धीमा हो सकता है, यदि आप 100% सुनिश्चित नहीं हैं तो यह संभवतः चीजों को और खराब कर सकता है।

पता लगाएं कि बाधाएं कहां हैं और उन पर ध्यान केंद्रित करें।

मेरे लिए प्रोफाइलिंग एक पुनरावृत्ति प्रक्रिया है, क्योंकि आमतौर पर जब आप एक बाधा को ठीक करते हैं, तो अन्य कम महत्वपूर्ण लोग खुद को प्रकट करते हैं।

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

मैं हाल ही में इस समान प्रश्न पूछा और कुछ अच्छा जवाब मिला: जब एआरएम के लिए सी ++ कोड के अनुकूलन Looking for a low impact c++ profiler