सीधे सी या विधानसभा में डीएसपी एल्गोरिदम लिखना? [बन्द है]


18

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

मेरा प्रश्न इस विशेष एप्लिकेशन से उठता है, लेकिन मुझे लगा कि एक सर्वोत्तम प्रथा है जो डीएसपी डेवलपर्स का अनुसरण करती है। इसलिए मैं इसे सामान्य तरीके से तैयार करूंगा:

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


17
मैंने ADSP-21xx के लिए असेंबली लिखने के लिए कई साल बिताए (और बाद में ब्लैकफिन के लिए असेंबली और सी।) आप जो भी इस्तेमाल कर रहे हैं, उसका खुलासा नहीं करते हैं, इसलिए किसी भी उत्तर में किसी भी चीज की तुलना में अधिक अनुमान और राय होगी। लेकिन एडी के डीएसपी प्रोसेसर अच्छे सामान से भरे हुए हैं और सी कंपाइलर लेखकों के लिए पाइप को ठीक से भरना बहुत मुश्किल है, इसलिए बोलना है। मेरे पास इस क्षेत्र में दो दशक का अनुभव है (कुछ बहुत मामूली अनुभव सहित सी कंपाइलर लिखना) और उस समय तक जब तक मैंने कोड लिखना बंद नहीं कर दिया (कुछ साल पहले) सी कंपाइलर्स हाथ से कोडिंग के करीब नहीं आ सके। लेकिन आप क्या करते हैं यह आपके लक्ष्यों पर निर्भर करता है।
जोंक

1
@ जोंक को उम्मीद है कि आप इस पर एक उत्तर लिखने जा रहे हैं - मैंने कभी केवल एक कट्टर डीएसपी ब्लैकफिन प्रोजेक्ट किया था, लेकिन मुझे कुछ प्रदर्शन हैक की यादों की शौकीन है जो इसे ज़रूरत है :)
पेरीसिनेशन

6
@pericynthion नहीं, मैं इसका उत्तर लिखने की कल्पना नहीं कर सकता जब तक कि ओपी किसी विशेष डीएसपी और परियोजना के लक्ष्यों के बारे में अधिक बात नहीं करता। अन्यथा, यह अस्पष्ट, अभद्र राय होगी जो कि ओपी ने इसके बारे में लिखा था उसके आधार पर बहुत सही या बहुत गलत हो सकता है। इसलिए मैं अभी इंतजार करूंगा।
जोंक

1
यदि आप इसे सबसे तेज़ चलाना चाहते हैं, तो आप इसे असेंबली में ऑप्टिमाइज़ करते हैं। यह एक टाइम \ मनी ट्रेडऑफ है। यदि आप जानते हैं कि अच्छा C कैसे लिखा जाए तो आप वहां से अधिकतर रास्ते निकाल सकते हैं।
वोल्टेज स्पिक

2
मुझे डीएसपी के बारे में निश्चित नहीं है लेकिन अधिकांश माइक्रोप्रोसेसरों के लिए आप इंट्रिंसिक्स का उपयोग कर सकते हैं जो कोडांतरक और सी कोड लिखने के बीच आधा है।
मैकीज पीचोटका

जवाबों:


20

हमेशा अपने एल्गोरिथ्म को उच्च-स्तरीय भाषा (जिसे सी असेंबली से तुलना की जाती है) में लागू करना बेहतर होता है, भले ही आप अंत में असेंबली में सब कुछ लागू करने की योजना बनाते हों।

  • संभावना है, आपको विधानसभा की भी आवश्यकता नहीं होगी । यदि आपके कंपाइलर द्वारा तैयार किया गया कोड आपके डिज़ाइन लक्ष्यों को पूरा करता है, तो आपका काम पूरा हो गया है।

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

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

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


23

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

अन्य विकल्पों में शामिल हैं:

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

आमतौर पर, डीएसपी विक्रेता सामान्य कार्यों के लिए स्रोत कोड की आपूर्ति करेंगे। यदि उनका कोड "काफी अच्छा" है, तो आप इसे सही तरीके से छोड़ सकते हैं। यदि यह बिल्कुल सही नहीं है, तो आपको इसे ट्विक करना होगा। मुझे कुछ साल पहले एक एफएफटी परत करनी थी, एक आवृत्ति-केवल वास्तविक एफएफटी प्राप्त करने के लिए। एक ट्रिक है जो आपको एन-पॉइंट कॉम्प्लेक्स एफएफटी के रूप में 2N-पॉइंट वास्तविक FFT करने की अनुमति देता है, लेकिन फिर आपको वास्तविक आवृत्ति डेटा को पुनर्प्राप्त करने के लिए जटिल आउटपुट पर एक अंतिम पास करना होगा। एनालॉग डिवाइसेस में उनके उदाहरण कोड में वह विशेष मामला नहीं था।
जॉन आर। स्ट्रोह्म

21

सभी बुराईयो की जड़ समयपूर्व इष्टतमीकरण है। - डोनाल्ड नथ

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

मेरा सवाल यह है कि अगर मैं सी में सिर्फ कार्यक्रम करता हूं, तो संकलक (जो डीएसपी चिप कंपनी से भी आता है) उसे उस डीएसपी के लिए अनुकूलित नहीं करेगा और अपनी क्षमताओं का उपयोग करेगा?

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

या क्या मुझे वास्तव में विधानसभा में सीधे डीएसपी दिनचर्या लिखने की आवश्यकता है?

पहले सी में लिखें, फिर प्रोफाइल, फिर तय करें कि आपको असेंबली में लिखना है या नहीं। उम्मीद है, आपको विधानसभा की आवश्यकता नहीं होगी।


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

11
आपका निष्कर्ष कथन अच्छी सामान्य सलाह है। लेकिन AD DSP ALUs के विशिष्ट विवरणों पर विचार करते समय यह एक प्रकार का पीला है। मुझे नहीं लगता कि आपने कभी उनकी जांच की है।
जोंक

18

आपके DSP को अधिकतम निरंतर एमएसीएस के साथ विज्ञापित किया जाएगा, यह मानते हुए कि सभी पाइप भरे हुए हैं। जाहिर है कि जो हासिल किया जा सकता है, उसकी ऊपरी सीमा है। आप जानते हैं कि आपके विश्लेषण से आपके फ़िल्टर और अन्य प्रसंस्करण में कितने मैक होंगे। कम से कम दो बार पहले का लक्ष्य रखें, क्योंकि आप डीएसपी कोर को अधिकतम नहीं रख पाएंगे। जैसे आप 70% संसाधन से ऊपर FPGA भरने की कोशिश नहीं करेंगे (PAR बहुत धीमी गति से ऊपर हो जाता है), विकास एक DSP से बाहर पिछले कुछ सैद्धांतिक एमएसीएस को निचोड़ने की बहुत धीमी गति से हो सकता है।

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

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

आप एक उपकरण श्रृंखला के लिए एक डीएसपी के लिए प्रतिबद्ध करने से पहले यह सब किया है।

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


7

हालांकि मैंने पहले ही इस प्रश्न का उत्तर दे दिया है, मैं एक अलग दृष्टिकोण को दर्शाने के लिए एक और उत्तर दूंगा:

सी में लिखें, विधानसभा में पढ़ें!

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

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

बेशक, यह अच्छा सी कंपाइलर उपलब्ध होने पर निर्भर करता है। X86 के लिए ऐसे कंपाइलर उपलब्ध हैं (आपको अक्सर डिफ़ॉल्ट से उच्च अनुकूलन स्तर निर्दिष्ट करना पड़ता है)। DSPs के लिए, मैं स्पष्ट रूप से नहीं जानता कि क्या कंपाइलर अच्छे हैं।

इस दृष्टिकोण का लाभ यह है कि आपके पास एक एकल पोर्टेबल कोडबेस है, जो किसी दिए गए डीएसपी के लिए इष्टतम विधानसभा में परिणाम के लिए अनुकूलित है, लेकिन यह काम भी करता है अगर डीएसपी को कुछ और के लिए बदल दिया जाए। बेशक, आपको नए डीएसपी पर सर्वोत्तम संभव प्रदर्शन प्राप्त करने के लिए सी कोड को थोड़ा समायोजित करना पड़ सकता है।


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

2
@FlorentEcochard: यदि कंपाइलर के असेंबलर को किसी प्रोग्रामर द्वारा नहीं समझा जा सकता है, तो शायद यह असेंबलर से बेहतर है जिसे यह प्रोग्रामर लिख सकता है। अपने प्रश्न के सीधे उत्तर के रूप में: कोडांतरक के अधिकतम अनुकूलन और मैनुअल विश्लेषण का उपयोग करें, कठिन भागों शिक्षाप्रद हो सकते हैं।
पसबा पोर एक्वी

4

सामान्य तौर पर, कोडांतरक स्रोतों को लिखना आवश्यक नहीं है यदि:

  • आप महत्वपूर्ण अनुभागों में C का अनुकूलन करते हैं: "रजिस्टर" कीवर्ड, इनलाइन फ़ंक्शन, ... का एक अच्छा उपयोग
  • asm ब्लॉक्स का उपयोग करके C प्रोग्राम के कुछ कार्य हो सकते हैं

इसका मतलब है कि सी कंपाइलर (महत्वपूर्ण भागों के लिए) द्वारा तैयार किए गए कोडांतरक की समीक्षा करें और पर्याप्त स्तर के अनुकूलन तक स्रोत को संशोधित करें।


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

@ केफिशर: न केवल वे रजिस्टर हिंट को ध्यान में रखते हैं, आजकल वे उपयोग किए जाने वाले रजिस्टर का चयन करने की अनुमति भी देते हैं: gcc.gnu.org/oniltocs/gcc-6.1.0/gcc/…
padaba por aqui

1
@KefSchecter: एम्बेडेड उपकरणों के लिए लिखे गए कंपाइलरों को छोड़कर, जहां यह बहुत महत्वपूर्ण कीवर्ड है यदि आप नंगे धातु पर प्रोग्रामिंग कर रहे हैं।
vsz

@pasabaporaqui: मैं सिंटैक्स के उस बिट के बारे में भूल गया। लेकिन अगर आप एक रजिस्टर नाम निर्दिष्ट नहीं करते हैं - दूसरे शब्दों में, यदि आप इसे आईएसओ मानक तरीके से उपयोग करते हैं - मैं शर्त लगाता हूं कि जीसीसी इसे अनदेखा करेगा।
केफ शेक्टर 21

3

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

क्या मैं विधानसभा में एफएफटी लिखूंगा? शायद ऩही।

क्या मैं खुद एफएफटी लिखूंगा? इसका उत्तर भी शायद नहीं है, क्योंकि एफएफटी को पहले ही कई बार लागू किया जा चुका है। तो संभावना है कि आपको कुछ पुस्तकालय मिलेंगे जिनमें एफएफटी पहले से ही लागू है। यह देखते हुए कि C एक पोर्टेबल भाषा है जबकि असेंबली नहीं है, आप C में पहले से लागू मौजूदा पुस्तकालयों को ढूंढने की अधिक संभावना रखेंगे।

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


2

मेरा अपना विचार FWIW यह है कि किसी भी समय आप अधिकतम गति / दक्षता / थ्रूपुट / जो भी चाहते हैं, कोडांतरक आपका मित्र है, जब तक आप कुशल हैं। एक संकलक गूंगा है; यह "जानता है" केवल इसके लेखक ने इसमें क्या प्रोग्राम करने के लिए सोचा था, और इसके लेखक को आपके आवेदन का बिल्कुल भी पता नहीं था।

मुझे स्वीकार करना चाहिए, मैं 80 के दशक के शुरुआती दिनों से 8 बिट माइक्रो (कई मामलों में आधुनिक MCUs के प्रति असंतुष्ट नहीं) के बाद से असेंबलर से प्यार करता था, जहां "मशीन कोड" सीखना उनमें से किसी भी उपयोगी प्रदर्शन को प्राप्त करने के लिए एक शर्त थी, लेकिन मुझे लगता है कि इसकी भूमिका बनी हुई है के रूप में अधिकतम दक्षता के लिए कार्यक्रम के लिए रास्ता। इसके अलावा, यह बहुत फायदेमंद है क्योंकि आप सभी प्रकार के अनुकूलन शॉर्टकट में फेंक सकते हैं जो एक संकलक के बारे में नहीं सोचेंगे, क्योंकि एक संकलक बिल्कुल नहीं सोच सकता है।

सी ठीक है मुझे लगता है। लेकिन अगर आप वास्तव में जानते हैं कि आप अपनी मशीन को हार्डवेयर स्तर पर क्या करना चाहते हैं, तो कोडांतरक जाएं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.