शून्य-ओवरहेड लूपिंग

From Vigyanwiki

ज़ीरो-ओवरहेड लूपिंग कुछ प्रोसेसर (कंप्यूटिंग) निर्देश समुच्चय की एक विशेषता है, जिसका हार्डवेयर लूप (कंप्यूटिंग) के निकाय को स्वचालित रूप से दोहरा सकता है इसके अतिरिक्त ऐसा करने के लिए निर्देश चक्र (और इसलिए समय) लेने वाले सॉफ़्टवेयर निर्देशों की आवश्यकता होती है।[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]. इसका उपयोग नल-टर्मिनेटेड स्ट्रिंग्स पर कुछ प्रकार की खोजों और संचालन को प्रयुक्त करने के लिए किया जा सकता है।

संदर्भ

  1. 1.0 1.1 "शून्य ओवरहेड लूप्स". Retrieved 2020-08-18.
  2. "उन्नत प्रोसेसर सुविधाओं को समझना कुशल कोडिंग को बढ़ावा देता है" (PDF). Analog Devices. Retrieved 2020-08-18.
  3. "Blackfin Processor Programming Reference, Revision 2.2" (PDF). Analog Devices. February 2013. Retrieved 2020-08-18.
  4. "REP/REPE/REPZ/REPNE/REPNZ: Repeat String Operation Prefix (x86 Instruction Set Reference)". c9x.me. Retrieved 2020-08-18.