शून्य-ओवरहेड लूपिंग
ज़ीरो-ओवरहेड लूपिंग कुछ प्रोसेसर (कंप्यूटिंग) निर्देश समुच्चय की एक विशेषता है, जिसका हार्डवेयर लूप (कंप्यूटिंग) के निकाय को स्वचालित रूप से दोहरा सकता है, इसके बजाय ऐसा करने के लिए निर्देश चक्र (और इसलिए समय) लेने वाले सॉफ़्टवेयर निर्देशों की आवश्यकता होती है।[1][2] डिजिटल सिग्नल प्रोसेसर और कुछ जटिल निर्देश सेट कंप्यूटर इंस्ट्रक्शन सेट में ज़ीरो-ओवरहेड लूप आम हैं।
पृष्ठभूमि
कई निर्देश सेटों में, एक काउंटर को बढ़ाने या घटाने के निर्देशों का उपयोग करके लूप को कार्यान्वित किया जाना चाहिए, जांचें कि क्या लूप का अंत हो गया है, और यदि लूप की शुरुआत में कूद नहीं है तो इसे दोहराया जा सकता है। हालांकि यह आमतौर पर प्रत्येक लूप के लिए लगभग 3–16 बाइट्स स्पेस का प्रतिनिधित्व करता है, यहां तक कि सीपीयू कैश के आकार के आधार पर वह छोटी राशि भी महत्वपूर्ण हो सकती है। अधिक महत्वपूर्ण यह है कि उन निर्देशों में से प्रत्येक को निष्पादित करने में समय लगता है, समय जो उपयोगी कार्य करने में व्यतीत नहीं होता है।
इस तरह के लूप का ओवरहेड पूरी तरह से लूप अनोलिंग की तुलना में स्पष्ट है, जिसमें लूप के निकाय को जितनी बार निष्पादित किया जाएगा, उतनी बार डुप्लिकेट किया जाएगा। उस मामले में, लूप के निकाय को दोहराने के निर्देशों पर कोई स्थान या निष्पादन समय बर्बाद नहीं होता है। हालाँकि, लूप अनोलिंग के कारण होने वाला दोहराव कोड आकार को महत्वपूर्ण रूप से बढ़ा सकता है, और बड़ा आकार कैश मिस के कारण निष्पादन समय को भी प्रभावित कर सकता है। (इस कारण से, लूप को आंशिक रूप से खोलना सामान्य है, जैसे कि इसे एक लूप में बदलना जो दोहराए जाने से पहले एक चरण में चार पुनरावृत्तियों का कार्य करता है। यह लूप को दोहराने के ओवरहेड के साथ अनलॉक करने के लाभों को संतुलित करता है।) इसके अलावा, एक लूप को पूरी तरह से खोलना केवल सीमित संख्या में लूप के लिए ही संभव है: जिनके पुनरावृत्तियों की संख्या संकलन समय पर जानी जाती है।
उदाहरण के लिए, निम्नलिखित सी कोड को निम्नलिखित x86 असेंबली कोड में संकलित और अनुकूलित किया जा सकता है:
C code | Assembly |
---|---|
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
निम्नलिखित निर्देशों की निर्दिष्ट संख्या को दोहराता है।
Blackfin
ब्लैकफिन दो शून्य-ओवरहेड लूप प्रदान करता है।[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.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.