शून्य-ओवरहेड लूपिंग: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
ज़ीरो-ओवरहेड लूपिंग कुछ [[प्रोसेसर (कंप्यूटिंग)]] [[ निर्देश समुच्चय |निर्देश समुच्चय]] की एक विशेषता है, जिसका हार्डवेयर [[लूप (कंप्यूटिंग)]] के निकाय को स्वचालित रूप से दोहरा सकता है, इसके | ज़ीरो-ओवरहेड लूपिंग कुछ [[प्रोसेसर (कंप्यूटिंग)]] [[ निर्देश समुच्चय |निर्देश समुच्चय]] की एक विशेषता है, जिसका हार्डवेयर [[लूप (कंप्यूटिंग)]] के निकाय को स्वचालित रूप से दोहरा सकता है, इसके अतिरिक्त ऐसा करने के लिए [[निर्देश चक्र]] (और इसलिए समय) लेने वाले सॉफ़्टवेयर निर्देशों की आवश्यकता होती है।<ref name="microchip">{{cite web | url=https://microchipdeveloper.com/dsp0201:zero-overhead-loops | title=शून्य ओवरहेड लूप्स| access-date=2020-08-18}}</ref><ref name="adi">{{cite web | url=https://www.analog.com/media/en/technical-documentation/technical-articles/350395352047424547665311ProgrammingTechniquesForDSPs.pdf | title=उन्नत प्रोसेसर सुविधाओं को समझना कुशल कोडिंग को बढ़ावा देता है| publisher=Analog Devices | access-date=2020-08-18}}</ref> [[डिजिटल सिग्नल प्रोसेसर]] और कुछ [[ जटिल निर्देश सेट कंप्यूटर |जटिल निर्देश समूह कंप्यूटर]] निर्देश समूह में शून्य-ओवरहेड लूप समान्य हैं। | ||
== पृष्ठभूमि == | == पृष्ठभूमि == | ||
कई निर्देश | कई निर्देश समूहों में, एक काउंटर को बढ़ाने या घटाने के निर्देशों का उपयोग करके लूप को कार्यान्वित किया जाना चाहिए, जांचें कि क्या लूप का अंत हो गया है, और यदि लूप की प्रारंभ में कूद नहीं है तो इसे दोहराया जा सकता है। चूँकि यह सामान्यतः प्रत्येक लूप के लिए लगभग 3–16 बाइट्स स्पेस का प्रतिनिधित्व करता है, यहां तक कि [[सीपीयू कैश]] के आकार के आधार पर वह छोटी राशि भी महत्वपूर्ण हो सकती है। अधिक महत्वपूर्ण यह है कि उन निर्देशों में से प्रत्येक को निष्पादित करने में समय लगता है, समय जो उपयोगी कार्य करने में व्यतीत नहीं होता है। | ||
इस तरह के लूप का ओवरहेड पूरी तरह से [[लूप अनोलिंग]] की तुलना में स्पष्ट है, जिसमें लूप के निकाय को जितनी बार निष्पादित किया जाएगा, उतनी बार डुप्लिकेट किया जाएगा। उस | इस तरह के लूप का ओवरहेड पूरी तरह से [[लूप अनोलिंग]] की तुलना में स्पष्ट है, जिसमें लूप के निकाय को जितनी बार निष्पादित किया जाएगा, उतनी बार डुप्लिकेट किया जाएगा। उस स्थिति में, लूप के निकाय को दोहराने के निर्देशों पर कोई स्थान या निष्पादन समय बर्बाद नहीं होता है। चूँकि, लूप अनोलिंग के कारण होने वाला दोहराव कोड आकार को महत्वपूर्ण रूप से बढ़ा सकता है, और बड़ा आकार [[कैश मिस]] के कारण निष्पादन समय को भी प्रभावित कर सकता है। (इस कारण से, लूप को आंशिक रूप से खोलना सामान्य है, जैसे कि इसे एक लूप में बदलना जो दोहराए जाने से पहले एक चरण में चार पुनरावृत्तियों का कार्य करता है। यह लूप को दोहराने के ओवरहेड के साथ अनलॉक करने के लाभों को संतुलित करता है।) इसके अतिरिक्त, एक लूप को पूरी तरह से खोलना केवल सीमित संख्या में लूप के लिए ही संभव है: जिनके पुनरावृत्तियों की संख्या [[संकलन समय]] पर जानी जाती है। | ||
उदाहरण के लिए, निम्नलिखित सी कोड को निम्नलिखित x86 असेंबली कोड में संकलित और अनुकूलित किया जा सकता है: | उदाहरण के लिए, निम्नलिखित सी कोड को निम्नलिखित x86 असेंबली कोड में संकलित और अनुकूलित किया जा सकता है: | ||
{| class="wikitable" | {| class="wikitable" | ||
! | ! सी कोड !! असेंबली | ||
|- valign="top" | |- valign="top" | ||
| <syntaxhighlight lang="C"> | | <syntaxhighlight lang="C"> | ||
Line 39: | Line 39: | ||
== कार्यान्वयन == | == कार्यान्वयन == | ||
शून्य-ओवरहेड लूपिंग वाले प्रोसेसर में मशीन निर्देश होते हैं और एक या अधिक निर्देशों को स्वचालित रूप से दोहराने के लिए रजिस्टर होते हैं। उपलब्ध निर्देशों के आधार पर, ये केवल काउंट-नियंत्रित लूप (लूप के लिए) के लिए उपयुक्त हो सकते हैं, जिसमें पुनरावृत्तियों की संख्या की अग्रिम गणना की जा सकती है, या केवल स्थिति-नियंत्रित लूप (जबकि लूप) के लिए उपयुक्त हो सकता है, जैसे [[अशक्त-समाप्त स्ट्रिंग]] संचालन | शून्य-ओवरहेड लूपिंग वाले प्रोसेसर में मशीन निर्देश होते हैं और एक या अधिक निर्देशों को स्वचालित रूप से दोहराने के लिए रजिस्टर होते हैं। उपलब्ध निर्देशों के आधार पर, ये केवल काउंट-नियंत्रित लूप (लूप के लिए) के लिए उपयुक्त हो सकते हैं, जिसमें पुनरावृत्तियों की संख्या की अग्रिम गणना की जा सकती है, या केवल स्थिति-नियंत्रित लूप (जबकि लूप) के लिए उपयुक्त हो सकता है, जैसे [[अशक्त-समाप्त स्ट्रिंग]] संचालन तार है । | ||
=== उदाहरण === | === उदाहरण === | ||
==== | ====छवि ==== | ||
पीआईसी निर्देश सूची में, {{code|REPEAT}} और {{code|DO}} निर्देश शून्य-ओवरहेड लूप | पीआईसी निर्देश सूची में, {{code|REPEAT}} और {{code|DO}} निर्देश शून्य-ओवरहेड लूप प्रयुक्त करते हैं।<ref name="microchip"/> {{code|REPEAT}} केवल एक ही निर्देश दोहराता है, जबकि {{code|DO}} निम्नलिखित निर्देशों की निर्दिष्ट संख्या को दोहराता है। | ||
==== [[ Blackfin ]] ==== | ==== [[ Blackfin | ब्लैकफिन]] ==== | ||
ब्लैकफिन दो शून्य-ओवरहेड लूप प्रदान करता है।<ref>{{cite web | url=https://www.analog.com/media/en/dsp-documentation/processor-manuals/Blackfin_pgr_rev2.2.pdf | title=Blackfin Processor Programming Reference, Revision 2.2 | publisher=Analog Devices | date=February 2013 | access-date=2020-08-18}}</ref> छोरों को नेस्टेड किया जा सकता है; यदि दोनों हार्डवेयर लूप एक ही लूप | ब्लैकफिन दो शून्य-ओवरहेड लूप प्रदान करता है।<ref>{{cite web | url=https://www.analog.com/media/en/dsp-documentation/processor-manuals/Blackfin_pgr_rev2.2.pdf | title=Blackfin Processor Programming Reference, Revision 2.2 | publisher=Analog Devices | date=February 2013 | access-date=2020-08-18}}</ref> छोरों को नेस्टेड किया जा सकता है; यदि दोनों हार्डवेयर लूप एक ही लूप और एड्रेस से कॉन्फ़िगर किए गए हैं, तो लूप 1 आंतरिक लूप के रूप में व्यवहार करेगा और दोहराएगा, और लूप 0 बाहरी लूप के रूप में व्यवहार करेगा और केवल तभी दोहराएगा जब 1 लूप नहीं दोहराएगा। | ||
लूप्स का उपयोग करके नियंत्रित किया जाता है {{code|LTx}} और {{code|LBx}} रजिस्टर ({{code|x}} या तो 0 से 1) लूप के ऊपर और नीचे | लूप्स का उपयोग करके नियंत्रित किया जाता है {{code|LTx}} और {{code|LBx}} रजिस्टर ({{code|x}} या तो 0 से 1) लूप के ऊपर और नीचे समूह करने के लिए - जिससे , निष्पादित करने के लिए पहला और आखिरी निर्देश, जो केवल एक निर्देश के साथ लूप के लिए समान हो सकता है - और {{code|LCx}} लूप काउंट के लिए लूप दोहराता है यदि {{code|LCx}} लूप के अंत में शून्य नहीं है, इस स्थिति में {{code|LCx}} घट गया है। | ||
लूप रजिस्टरों को मैन्युअल रूप से | लूप रजिस्टरों को मैन्युअल रूप से समूह किया जा सकता है, किंतु यह सामान्यतः रजिस्टरों को लोड करने के लिए 6 बाइट्स और लोड किए जाने वाले मानों को समूह करने के लिए 8-16 बाइट्स का उपभोग करेगा। लूप सेटअप निर्देश का उपयोग करना अधिक सामान्य है (असेंबली में या तो प्रतिनिधित्व किया गया है {{code|LOOP}} छद्म निर्देश के साथ {{code|LOOP_BEGIN}} और {{code|LOOP_END}}, या एक पंक्ति में {{code|LSETUP}}), जो वैकल्पिक रूप से प्रारंभ होता है {{code|LCx}} और समूह {{code|LTx}} और {{code|LBx}} वांछित मानो के लिए इसके लिए केवल 4-6 बाइट्स की आवश्यकता होती है, किंतु लूप सेटअप निर्देश स्थित होने के सापेक्ष केवल एक सीमित सीमा के अंदर {{code|LTx}} और {{code|LBx}} समूह कर सकते हैं | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
Line 68: | Line 68: | ||
=x86 | =x86= | ||
X86 असेंबली भाषा {{code|REP}} उपसर्ग कुछ निर्देशों के लिए शून्य-ओवरहेड लूप | X86 असेंबली भाषा {{code|REP}} उपसर्ग कुछ निर्देशों के लिए शून्य-ओवरहेड लूप प्रयुक्त करते हैं (अर्थात् {{code|MOVS/STOS/CMPS/LODS/SCAS}}).<ref>{{cite web | url=https://c9x.me/x86/html/file_module_x86_id_279.html | title=REP/REPE/REPZ/REPNE/REPNZ: Repeat String Operation Prefix (x86 Instruction Set Reference) | website=c9x.me | access-date=2020-08-18}}</ref> उपसर्ग और निर्देश के आधार पर, निर्देश को कई बार दोहराया जाएगा {{code|(E)CX}} रिपीट काउंट रोकना , या जब तक कोई मैच (या नॉन-मैच) नहीं मिल जाता {{code|AL/AX/EAX}} या साथ {{code|DS:[(E)SI]}}. इसका उपयोग नल-टर्मिनेटेड स्ट्रिंग्स पर कुछ प्रकार की खोजों और संचालन को प्रयुक्त करने के लिए किया जा सकता है। | ||
'''उंट रोकना , या जब तक कोई मैच (या नॉन-मैच) नहीं मिल जाता {{code|AL/AX/EAX}} या साथ {{code|DS:[(E)SI]}}. इसका उपयोग नल-टर्मिनेटेड स्ट्रिंग्स पर कुछ प्रकार की खोजों और संचा''' | |||
==संदर्भ== | ==संदर्भ== |
Revision as of 11:16, 6 May 2023
ज़ीरो-ओवरहेड लूपिंग कुछ प्रोसेसर (कंप्यूटिंग) निर्देश समुच्चय की एक विशेषता है, जिसका हार्डवेयर लूप (कंप्यूटिंग) के निकाय को स्वचालित रूप से दोहरा सकता है, इसके अतिरिक्त ऐसा करने के लिए निर्देश चक्र (और इसलिए समय) लेने वाले सॉफ़्टवेयर निर्देशों की आवश्यकता होती है।[1][2] डिजिटल सिग्नल प्रोसेसर और कुछ जटिल निर्देश समूह कंप्यूटर निर्देश समूह में शून्य-ओवरहेड लूप समान्य हैं।
पृष्ठभूमि
कई निर्देश समूहों में, एक काउंटर को बढ़ाने या घटाने के निर्देशों का उपयोग करके लूप को कार्यान्वित किया जाना चाहिए, जांचें कि क्या लूप का अंत हो गया है, और यदि लूप की प्रारंभ में कूद नहीं है तो इसे दोहराया जा सकता है। चूँकि यह सामान्यतः प्रत्येक लूप के लिए लगभग 3–16 बाइट्स स्पेस का प्रतिनिधित्व करता है, यहां तक कि सीपीयू कैश के आकार के आधार पर वह छोटी राशि भी महत्वपूर्ण हो सकती है। अधिक महत्वपूर्ण यह है कि उन निर्देशों में से प्रत्येक को निष्पादित करने में समय लगता है, समय जो उपयोगी कार्य करने में व्यतीत नहीं होता है।
इस तरह के लूप का ओवरहेड पूरी तरह से लूप अनोलिंग की तुलना में स्पष्ट है, जिसमें लूप के निकाय को जितनी बार निष्पादित किया जाएगा, उतनी बार डुप्लिकेट किया जाएगा। उस स्थिति में, लूप के निकाय को दोहराने के निर्देशों पर कोई स्थान या निष्पादन समय बर्बाद नहीं होता है। चूँकि, लूप अनोलिंग के कारण होने वाला दोहराव कोड आकार को महत्वपूर्ण रूप से बढ़ा सकता है, और बड़ा आकार कैश मिस के कारण निष्पादन समय को भी प्रभावित कर सकता है। (इस कारण से, लूप को आंशिक रूप से खोलना सामान्य है, जैसे कि इसे एक लूप में बदलना जो दोहराए जाने से पहले एक चरण में चार पुनरावृत्तियों का कार्य करता है। यह लूप को दोहराने के ओवरहेड के साथ अनलॉक करने के लाभों को संतुलित करता है।) इसके अतिरिक्त, एक लूप को पूरी तरह से खोलना केवल सीमित संख्या में लूप के लिए ही संभव है: जिनके पुनरावृत्तियों की संख्या संकलन समय पर जानी जाती है।
उदाहरण के लिए, निम्नलिखित सी कोड को निम्नलिखित x86 असेंबली कोड में संकलित और अनुकूलित किया जा सकता है:
सी कोड | असेंबली |
---|---|
unsigned int array[100];
unsigned int i;
for (i = 0; i < 100; i++) {
array[i] = i;
}
|
; Set up number of loop iterations.
; Note that the compiler has reversed the loop
; so that it counts backwards from 99 to 0,
; rather than up from 0 to 99.
mov eax, 99
.LABEL:
; array[i] = i
mov DWORD PTR array[0+eax*4], eax
; Decrement i
sub eax, 1
; Check i >= 0. If true, repeat the loop.
jnb .LABEL
|
कार्यान्वयन
शून्य-ओवरहेड लूपिंग वाले प्रोसेसर में मशीन निर्देश होते हैं और एक या अधिक निर्देशों को स्वचालित रूप से दोहराने के लिए रजिस्टर होते हैं। उपलब्ध निर्देशों के आधार पर, ये केवल काउंट-नियंत्रित लूप (लूप के लिए) के लिए उपयुक्त हो सकते हैं, जिसमें पुनरावृत्तियों की संख्या की अग्रिम गणना की जा सकती है, या केवल स्थिति-नियंत्रित लूप (जबकि लूप) के लिए उपयुक्त हो सकता है, जैसे अशक्त-समाप्त स्ट्रिंग संचालन तार है ।
उदाहरण
छवि
पीआईसी निर्देश सूची में, REPEAT
और DO
निर्देश शून्य-ओवरहेड लूप प्रयुक्त करते हैं।[1] REPEAT
केवल एक ही निर्देश दोहराता है, जबकि DO
निम्नलिखित निर्देशों की निर्दिष्ट संख्या को दोहराता है।
ब्लैकफिन
ब्लैकफिन दो शून्य-ओवरहेड लूप प्रदान करता है।[3] छोरों को नेस्टेड किया जा सकता है; यदि दोनों हार्डवेयर लूप एक ही लूप और एड्रेस से कॉन्फ़िगर किए गए हैं, तो लूप 1 आंतरिक लूप के रूप में व्यवहार करेगा और दोहराएगा, और लूप 0 बाहरी लूप के रूप में व्यवहार करेगा और केवल तभी दोहराएगा जब 1 लूप नहीं दोहराएगा।
लूप्स का उपयोग करके नियंत्रित किया जाता है LTx
और LBx
रजिस्टर (x
या तो 0 से 1) लूप के ऊपर और नीचे समूह करने के लिए - जिससे , निष्पादित करने के लिए पहला और आखिरी निर्देश, जो केवल एक निर्देश के साथ लूप के लिए समान हो सकता है - और LCx
लूप काउंट के लिए लूप दोहराता है यदि LCx
लूप के अंत में शून्य नहीं है, इस स्थिति में LCx
घट गया है।
लूप रजिस्टरों को मैन्युअल रूप से समूह किया जा सकता है, किंतु यह सामान्यतः रजिस्टरों को लोड करने के लिए 6 बाइट्स और लोड किए जाने वाले मानों को समूह करने के लिए 8-16 बाइट्स का उपभोग करेगा। लूप सेटअप निर्देश का उपयोग करना अधिक सामान्य है (असेंबली में या तो प्रतिनिधित्व किया गया है LOOP
छद्म निर्देश के साथ LOOP_BEGIN
और LOOP_END
, या एक पंक्ति में LSETUP
), जो वैकल्पिक रूप से प्रारंभ होता है LCx
और समूह LTx
और LBx
वांछित मानो के लिए इसके लिए केवल 4-6 बाइट्स की आवश्यकता होती है, किंतु लूप सेटअप निर्देश स्थित होने के सापेक्ष केवल एक सीमित सीमा के अंदर LTx
और LBx
समूह कर सकते हैं
P0 = array + 396;
R0 = 100;
LC0 = R0;
LOOP my_loop LC0; // sets LT0 and LB0
LOOP_BEGIN my_loop; // pseudo-instruction; generates a label used to compute LT0
// LC0 cannot be written directly to memory,
// so we must use a temporary register.
R0 += -1; // equally fast and small would be R0 = LC0
[P0--] = R0;
LOOP_END my_loop; // pseudo-instruction; generates a label used to compute LB0
x86
X86 असेंबली भाषा REP
उपसर्ग कुछ निर्देशों के लिए शून्य-ओवरहेड लूप प्रयुक्त करते हैं (अर्थात् MOVS/STOS/CMPS/LODS/SCAS
).[4] उपसर्ग और निर्देश के आधार पर, निर्देश को कई बार दोहराया जाएगा (E)CX
रिपीट काउंट रोकना , या जब तक कोई मैच (या नॉन-मैच) नहीं मिल जाता AL/AX/EAX
या साथ DS:[(E)SI]
. इसका उपयोग नल-टर्मिनेटेड स्ट्रिंग्स पर कुछ प्रकार की खोजों और संचालन को प्रयुक्त करने के लिए किया जा सकता है।
उंट रोकना , या जब तक कोई मैच (या नॉन-मैच) नहीं मिल जाता AL/AX/EAX
या साथ DS:[(E)SI]
. इसका उपयोग नल-टर्मिनेटेड स्ट्रिंग्स पर कुछ प्रकार की खोजों और संचा
संदर्भ
- ↑ 1.0 1.1 "शून्य ओवरहेड लूप्स". Retrieved 2020-08-18.
- ↑ "उन्नत प्रोसेसर सुविधाओं को समझना कुशल कोडिंग को बढ़ावा देता है" (PDF). Analog Devices. Retrieved 2020-08-18.
- ↑ "Blackfin Processor Programming Reference, Revision 2.2" (PDF). Analog Devices. February 2013. Retrieved 2020-08-18.
- ↑ "REP/REPE/REPZ/REPNE/REPNZ: Repeat String Operation Prefix (x86 Instruction Set Reference)". c9x.me. Retrieved 2020-08-18.