पॉलीटॉप मॉडल: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(11 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{for|physical models of polyhedra|बहुफलकीय प्रारूप}}
पॉलीटॉप मॉडल जिसे बहुफलकीय प्रारूप भी कहा जाता है, एक गणितीय ढांचा है, जिन्हे गणना करने के लिए स्पष्ट रूप से अत्यधिक सघन प्रतिनिधित्व की आवश्यकता होती है। नेस्टेड लूप प्रोग्राम विशिष्ट प्रयोगों के लिए उपयोगी हैं, परंतु इसके लिए ये एकमात्र उदाहरण नहीं है, और इस प्रारूप का सबसे सरल उपयोग प्रोग्राम अनुकूलन में लूप नेस्ट अनुकूलन के लिए है। बहुफलकीय विधि नेस्टेड लूप के भीतर प्रत्येक लूप पुनरावृत्ति को बहुकोणीय आकृति नामक गणितीय वस्तुओं के अंदर नेस्टेड बिंदुओं के रूप में प्रदर्शित करती है, और सजातीय रूपान्तरण या अधिक सामान्य, गैर- सजातीय रूपान्तरण करती है। जैसे कि बहुतलों पर टाइलिंग, और तत्पश्चात रूपांतरित बहुतलों को समतुल्य बहुफलनों में परिवर्तित करती है, परंतु अनुकूलित, बहुफलकीय प्रारूप स्कैनिंग के माध्यम से लूप नेस्ट करता है।  
 
बहुफलकीय प्रारूप उन कार्यक्रमों के लिए एक गणितीय ढांचा है जो बड़ी संख्या में संचालन करते हैं  स्पष्ट रूप से गणना करने के लिए बहुत बड़े सुसम्बद्ध प्रतिनिधित्व की आवश्यकता होती है। नीड़ित प्रविष्ट पाश कार्यक्रमों मे यह विशिष्ट हैं, और यह प्रारूप का सबसे सरल उपयोग कार्यक्रमों में पाश नीड अनुकूलीकरण के लिए है। बहुफलकीय विधि नीड़ित प्रविष्ट पाश के भीतर प्रत्येक पाश पुनरावृत्ति को बहुफलकीय नामक गणितीय वस्तुओं के अंदर जाली बिंदुओं के रूप में मानती है,यह [[affine परिवर्तन|सजातीय परिवर्तन]] या अधिक सामान्य गैर- सजातीय मे रूपांतरित करती है जैसे कि बहुफलकीय पर [[लूप टाइलिंग|पाश टाइलिंग]], और फिर रूपांतरित बहुतलीय को समतुल्य में परिवर्तित करती है, लेकिन बहुफलकीय रेखाचित्रण के माध्यम से पाश नीड अनुकूलित लक्षित अनुकूलन लक्ष्य पर निर्भर करती है।


== सरल उदाहरण ==
== सरल उदाहरण ==


[[सी (प्रोग्रामिंग भाषा)]] में लिखे गए निम्नलिखित उदाहरण पर विचार करें:
[[सी (प्रोग्रामिंग भाषा)|सी प्रोग्रामिंग भाषा]] में लिखे गए निम्नलिखित उदाहरण पर विचार करें:


   const int n = 100;
   const int n = 100;
Line 12: Line 10:
   
   
  for (i = 1; i < n; i++) {
  for (i = 1; i < n; i++) {
  for (j = 1; j < (i + 2) && j < n; j++) {
  for (j = 1; j < (i + 2) && j < n; j++) {


    a[i][j] = a[i - 1][j] + a[i][j - 1];
  a[i][j] = a[i - 1][j] + a[i][j - 1];
    
    
इस कोड के साथ आवश्यक समस्या यह है कि [i] [j] पर आंतरिक पाश के प्रत्येक पुनरावृत्ति के लिए आवश्यक है कि पिछले पुनरावृत्ति का परिणाम, [i] [j - 1], पहले से ही उपलब्ध हो। इसलिए, इस कूट को समानांतर या पाइपलाइन नहीं किया जा सकता जैसा कि वर्तमान में लिखा गया है।
इस कूट के साथ आवश्यक समस्या यह है कि [i] [j] पर आंतरिक लूप के प्रत्येक पुनरावृत्ति के लिए आवश्यक है, कि पिछले पुनरावृत्ति का परिणाम, [i] [j - 1], पहले से ही उपलब्ध हो। इसलिए, इस कूट को समानांतर या पाइपलाइन नहीं किया जा सकता जैसा कि वर्तमान में लिखा गया है।


सजातीय परिवर्तन के साथ बहुतलीय प्रारूप का एक अनुप्रयोग <math>(i',\, j') = (i+j,\, j)</math> और सीमाओं में उपयुक्त परिवर्तन, नीड़ित प्रविष्ट छोरों को ऊपर में बदल देगा:
सजातीय परिवर्तन के साथ बहुतलीय प्रारूप का एक अनुप्रयोग <math>(i',\, j') = (i+j,\, j)</math> और सीमाओं में उपयुक्त परिवर्तन, ऊपर नेस्टेड लूप को रूपांतरित कर देगा-


a[i - j][j] = a[i - j - 1][j] + a[i - j][j - 1];
a[i - j][j] = a[i - j - 1][j] + a[i - j][j - 1];


इस स्थिति में, आंतरिक पाश का कोई पुनरावृत्ति पिछले पुनरावृत्ति के परिणामों पर निर्भर नहीं करता है; पूरे आंतरिक पाश को समानांतर में निष्पादित किया जा सकता है।,यद्यपि बाहरी पाश का प्रत्येक पुनरावृत्ति पिछले पुनरावृत्तियों पर निर्भर करता है।
इस स्थिति में, आंतरिक लूप का कोई पुनरावृत्ति पिछले पुनरावृत्ति के परिणामों पर निर्भर नहीं करता है; पूरे आंतरिक लूप को समानांतर में निष्पादित किया जा सकता है, यद्यपि बाहरी लूप का प्रत्येक पुनरावृत्ति पिछले पुनरावृत्तियों पर निर्भर करता है


== विस्तृत उदाहरण ==
== विस्तृत उदाहरण ==


[[File:Polytope model unskewed.svg|thumb|right|की निर्भरताएँ <code>src</code>,  पाश  अनुकूलीकरण से पहले # कॉमन  पाश  रूपांतरण। लाल बिंदु से मेल खाता है <code>src[1][0]</code>; गुलाबी बिंदु से मेल खाता है <code>src[2][2]</code>.]]निम्नलिखित सी कूट फ़्लॉइड-स्टाइनबर्ग कटौती के समान त्रुटि-वितरण कटौती  के एक रूप को लागू करता है, लेकिन शैक्षणिक कारणों के लिए संशोधित किया गया है। द्वि-आयामी सरणी src में w पिक्सेल की h पंक्तियाँ होती हैं, प्रत्येक पिक्सेल में 0 और 255 के मध्य ग्रेस्केल मान होता है। दिनचर्या समाप्त होने के बाद, आउटपुट त्रुटि dst में मात्र 0 मान या 255 मान वाले पिक्सेल होंगे। गणना के समय, प्रत्येक पिक्सेल की डाइटिंग त्रुटि को वापस src सरणी में जोड़कर एकत्र किया जाता है। ध्यान दें कि गणना के दौरान src और dst दोनों पढ़े और लिखे जाते हैं; src मात्र पढ़ने के लिए नहीं है, और dst मात्र  लिखने के लिए नहीं है।
[[File:Polytope model unskewed.svg|thumb|right|लूप तिरछा करने से पहले, एसआरसी की निर्भरता। लाल बिंदु एसआरसी[1][0]; गुलाबी बिंदु एसआरसी[2] से मेल खाता है.]]निम्नलिखित सी कूट फ़्लॉइड-स्टाइनबर्ग डाइथरिंग के समान त्रुटि-वितरण डिथरिंग के एक रूप को अनुबंधित करता है, परंतु शैक्षणिक कारणों से इन्हे संशोधित किया गया है। द्वि-आयामी सरणी एसआरसी में डब्ल्यू पिक्सेल की एच पंक्तियाँ होती हैं, प्रत्येक पिक्सेल में 0 और 255 के मध्य ग्रेस्केल मान होता है। रूटीन समाप्त होने के उपरांत, निर्गत त्रुटि डीएसटीमें मात्र 0 मान या 255 मान वाले पिक्सेल उपस्थित होंगे। गणना के समय, प्रत्येक पिक्सेल की डाइटिंग त्रुटि को वापस एसआरसी सरणी में जोड़कर एकत्र किया जाता है। ध्यान दें कि गणना के समय, एसआरसी और डीएसटीदोनों पढ़े और लिखे जाते हैं; एसआरसी मात्र पढ़ने के लिए नहीं है, और डीएसटीमात्र लिखने के लिए नहीं है।


आंतरिक पाश का प्रत्येक पुनरावृत्ति src[i][j] के मानों के आधार पर src[i-1][j], src[i][j-1], और src[i+1] के मानों को संशोधित करता है। जे -1]। (समान निर्भरताएँ dst[i][j] पर लागू होती हैं। पाश  विषमन के प्रयोजनों के लिए, हम src[i][j] और dst[i][j] को एक ही तत्व के रूप में सोच सकते हैं। हम उदाहरण दे सकते हैं src[i][j] रेखांकन की निर्भरता, जैसा कि दाईं ओर आरेख में है
आंतरिक लूप का प्रत्येक पुनरावृत्ति एसआरसी[i][j] के मानों के आधार पर एसआरसी [i-1] [j], एसआरसी [i] [j-1], और एसआरसी[i+1] के मानों को संशोधित करता है। [j-1]] वाली समान निर्भरताएँ डीएसटी [i] [j] पर लागू होती हैं।


<!-- This table nonsense makes the page look slightly better in Firefox on Windows XP. Is there a more portable and self-explanatory way to get the code and images not to overlap with each other? --~~~~ -->
लूप विषमन के प्रयोजनों के लिए, हम एसआरसी[i][j] और डीएसटी [i] [j] को एक ही तत्व के रूप में मान सकते हैं। हम उदाहरण दे सकते हैं एसआरसी[i][j] रेखांकन की निर्भरता, जैसा कि दाईं ओर आरेख में दर्शाया गया है ।
{|
{|
|-
|-
Line 57: Line 55:
|}
|}


[[File:Polytope model skewed.svg|thumb|right|की निर्भरताएँ <code>src</code>, पाश तिरछा करने के बाद। सरणी तत्वों को ग्रे, लाल, हरा, नीला, पीला ... क्रम में संसाधित किया जाएगा।]]एफ़िन परिवर्तन करना <math>(p,\, t) = (i,\, 2j+i)</math> मूल निर्भरता आरेख पर हमें एक नया आरेख मिलता है, जो अगली छवि में दिखाया गया है। फिर हम कोड को   पाश ऑन करने के लिए फिर से लिख सकते हैं <code>p</code> और <code>t</code> के अतिरिक्त <code>i</code> और <code>j</code>, निम्नलिखित तिरछी दिनचर्या प्राप्त करना।
[[File:Polytope model skewed.svg|thumb|right|की निर्भरताएँ <code>एसआरसी</code>,लूप तिरछा करने के बाद। सरणी तत्वों को ग्रे, लाल, हरा, नीला, पीला क्रम में संसाधित किया जाएगा।]]सजातीय परिवर्तन करना <math>(p,\, t) = (i,\, 2j+i)</math> मूल निर्भरता आरेख पर हमें एक नया आरेख मिलता है, जो अगली छवि में दिखाया गया है। फिर हम कूट को लूप प्रारंभ करने के लिए पुनः लिख सकते हैं <code>p</code> और <code>t</code> के अतिरिक्त <code>i</code> और <code>j</code>, निम्नलिखित तिरछी रूटीन प्राप्त करते है ।


<!-- Please don't break this code. Test before committing! -->
<!-- Please don't break this code. Test before committing! -->
Line 89: Line 87:


== यह भी देखें ==
== यह भी देखें ==
* बहुफलकीय प्रारूप   का समर्थन करने वाले ढांचे
* बहुफलकीय प्रारूप का समर्थन करने वाले ढांचे
* पाश  नीड   अनुकूलीकरण
* लूप नीड अनुकूलीकरण
*  [[लूप अनुकूलन|पाश अनुकूलन]]
*  [[लूप अनुकूलन]]
*  [[लूप अनोलिंग|पाश अनोलिंग]]
*  [[लूप अनोलिंग]]
* पाश टाइलिंग
* लूप टाइलिंग


== बाहरी लिंक और संदर्भ ==
== बाहरी लिंक और संदर्भ ==
*[https://www.infosun.fim.uni-passau.de/cl/loopo/doc/loopo_doc/node3.html बुनियादी बहुफलकीय विधि], मार्टिन ग्रिब्ल द्वारा ट्यूटोरियल जिसमें उपरोक्त स्यूडोकोड उदाहरण के आरेख शामिल हैं
*[https://www.infosun.fim.uni-passau.de/cl/loopo/doc/loopo_doc/node3.html बुनियादी बहुफलकीय विधि], मार्टिन ग्रिब्ल द्वारा ट्यूटोरियल जिसमें उपरोक्त स्यूडोकूट उदाहरण के आरेख शामिल हैं
*[http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.5675 बहुफलकीय प्रारूप   में कोड जनरेशन] (1998)। मार्टिन ग्रीब्ल, क्रिश्चियन लेंगौएर और सबाइन वेटज़ेल
*[http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.5675 बहुफलकीय प्रारूप में कूट जनरेशन] (1998)। मार्टिन ग्रीब्ल, क्रिश्चियन लेंगौएर और सबाइन वेटज़ेल
*[http://www.cloog.org/ सीएलओओजी पॉलीहेड्रल कोड जेनरेटर]
*[http://www.cloog.org/ सीएलओओजी बहुफलकीय कूट जेनरेटर]
*[http://www.chunchen.info/omega CodeGen+: Z-पॉलीहेड्रा स्कैनिंग]{{dead link|date=March 2018 |bot=InternetArchiveBot |fix-attempted=yes }}
*[http://www.chunchen.info/omega CodeGen+: Z-पॉलीहेड्रा स्कैनिंग]{{dead link|date=March 2018 |bot=InternetArchiveBot |fix-attempted=yes }}
*[http://web.cs.ucla.edu/~pouchet/software/pocc/ PoCC: बहुफलकीय संकलक संग्रह]
*[http://web.cs.ucla.edu/~pouchet/software/pocc/ PoCC: बहुफलकीय संकलक संग्रह]
*[http://pluto-compiler.sourceforge.net/ PLUTO - affine   पाश  नीड के लिए एक स्वचालित पैरेललाइज़र और स्थानीयता अनुकूलक]
*[http://pluto-compiler.sourceforge.net/ PLUTO - affine लूप नीड के लिए एक स्वचालित पैरेललाइज़र और स्थानीयता अनुकूलक]
**{{Cite book|last1=Bondhugula|first1=Uday|last2=Hartono|first2=Albert|last3=Ramanujam|first3=J.|last4=Sadayappan|first4=P.|date=2008-01-01|title=एक व्यावहारिक स्वचालित पॉलीहेड्रल समानांतर और स्थानीयता अनुकूलक|journal=Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation|series=PLDI '08|location=New York, NY, USA|publisher=ACM|pages=101–113|doi=10.1145/1375581.1375595|isbn=9781595938602|s2cid=7086982}}
**{{Cite book|last1=Bondhugula|first1=Uday|last2=Hartono|first2=Albert|last3=Ramanujam|first3=J.|last4=Sadayappan|first4=P.|date=2008-01-01|title=एक व्यावहारिक स्वचालित पॉलीहेड्रल समानांतर और स्थानीयता अनुकूलक|journal=Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation|series=PLDI '08|location=New York, NY, USA|publisher=ACM|pages=101–113|doi=10.1145/1375581.1375595|isbn=9781595938602|s2cid=7086982}}
*[http://polyhedral.info/ polyhedral.info] - एक वेबसाइट जो बहुफलकीय संकलन के बारे में जानकारी एकत्र करती है
*[http://polyhedral.info/ polyhedral.info] - एक वेबसाइट जो बहुफलकीय संकलन के बारे में जानकारी एकत्र करती है
*[http://polly.llvm.org/ पोली - हाई-लेवल   पाश और डेटा-लोकलिटी ऑप्टिमाइजेशन के लिए एलएलवीएम फ्रेमवर्क]
*[http://polly.llvm.org/ पोली - हाई-लेवल लूप और डेटा-लोकलिटी ऑप्टिमाइजेशन के लिए एलएलवीएम फ्रेमवर्क]
* एमआईटी [http://tiramisu-compiler.org/ Tiramisu Polyhedral] फ्रेमवर्क।
* एमआईटी [http://tiramisu-compiler.org/ Tiramisu Polyhedral] फ्रेमवर्क।


श्रेणी:संकलक अनुकूलन
[[Category:All articles with dead external links]]
श्रेणी:सूडोकोड के उदाहरण वाले लेख
[[Category:Articles with dead external links from March 2018]]
श्रेणी:उदाहरण सी कोड वाले लेख
[[Category:Articles with permanently dead external links]]
 
 
[[Category: Machine Translated Page]]
[[Category:Created On 18/02/2023]]
[[Category:Created On 18/02/2023]]
[[Category:Machine Translated Page]]
[[Category:Templates Vigyan Ready]]

Latest revision as of 15:47, 27 April 2023

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

सरल उदाहरण

सी प्रोग्रामिंग भाषा में लिखे गए निम्नलिखित उदाहरण पर विचार करें:

 const int n = 100;
int i, j, a[n][n];

for (i = 1; i < n; i++) {
 for (j = 1; j < (i + 2) && j < n; j++) {
 a[i][j] = a[i - 1][j] + a[i][j - 1];
 

इस कूट के साथ आवश्यक समस्या यह है कि [i] [j] पर आंतरिक लूप के प्रत्येक पुनरावृत्ति के लिए आवश्यक है, कि पिछले पुनरावृत्ति का परिणाम, [i] [j - 1], पहले से ही उपलब्ध हो। इसलिए, इस कूट को समानांतर या पाइपलाइन नहीं किया जा सकता जैसा कि वर्तमान में लिखा गया है।

सजातीय परिवर्तन के साथ बहुतलीय प्रारूप का एक अनुप्रयोग और सीमाओं में उपयुक्त परिवर्तन, ऊपर नेस्टेड लूप को रूपांतरित कर देगा-

a[i - j][j] = a[i - j - 1][j] + a[i - j][j - 1];

इस स्थिति में, आंतरिक लूप का कोई पुनरावृत्ति पिछले पुनरावृत्ति के परिणामों पर निर्भर नहीं करता है; पूरे आंतरिक लूप को समानांतर में निष्पादित किया जा सकता है, यद्यपि बाहरी लूप का प्रत्येक पुनरावृत्ति पिछले पुनरावृत्तियों पर निर्भर करता है

विस्तृत उदाहरण

लूप तिरछा करने से पहले, एसआरसी की निर्भरता। लाल बिंदु एसआरसी[1][0]; गुलाबी बिंदु एसआरसी[2] से मेल खाता है.

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

आंतरिक लूप का प्रत्येक पुनरावृत्ति एसआरसी[i][j] के मानों के आधार पर एसआरसी [i-1] [j], एसआरसी [i] [j-1], और एसआरसी[i+1] के मानों को संशोधित करता है। [j-1]] वाली समान निर्भरताएँ डीएसटी [i] [j] पर लागू होती हैं।

लूप विषमन के प्रयोजनों के लिए, हम एसआरसी[i][j] और डीएसटी [i] [j] को एक ही तत्व के रूप में मान सकते हैं। हम उदाहरण दे सकते हैं एसआरसी[i][j] रेखांकन की निर्भरता, जैसा कि दाईं ओर आरेख में दर्शाया गया है ।

#define ERR(x, y) (dst[x][y] - src[x][y])

void dither(unsigned char** src, unsigned char** dst, int w, int h)
{
    int i, j;
    for (j = 0; j < h; ++j) {
        for (i = 0; i < w; ++i) {
            int v = src[i][j];
            if (i > 0)
                v -= ERR(i - 1, j) / 2;
            if (j > 0) {
                v -= ERR(i, j - 1) / 4;
                if (i < w - 1)
                    v -= ERR(i + 1, j - 1) / 4;
            }
            dst[i][j] = (v < 128) ? 0 : 255;
            src[i][j] = (v < 0) ? 0 : (v < 255) ? v : 255;
        }
    }
}
की निर्भरताएँ एसआरसी,लूप तिरछा करने के बाद। सरणी तत्वों को ग्रे, लाल, हरा, नीला, पीला क्रम में संसाधित किया जाएगा।

सजातीय परिवर्तन करना मूल निर्भरता आरेख पर हमें एक नया आरेख मिलता है, जो अगली छवि में दिखाया गया है। फिर हम कूट को लूप प्रारंभ करने के लिए पुनः लिख सकते हैं p और t के अतिरिक्त i और j, निम्नलिखित तिरछी रूटीन प्राप्त करते है ।

 void dither_skewed(unsigned char **src, unsigned char **dst, int w, int h)  
 {
     int t, p;
     for (t = 0; t < (w + (2 * h)); ++t) {
         int pmin = max(t % 2, t - (2 * h) + 2);
         int pmax = min(t, w - 1);
         for (p = pmin; p <= pmax; p += 2) {
             int i = p;
             int j = (t - p) / 2;
             int v = src[i][j];
             if (i > 0)
               v -= ERR(i - 1, j) / 2;
             if (j > 0)
               v -= ERR(i, j - 1) / 4;
             if (j > 0 && i < w - 1)
               v -= ERR(i + 1, j - 1) / 4;
             dst[i][j] = (v < 128) ? 0 : 255;
             src[i][j] = (v < 0) ? 0 : (v < 255) ? v : 255;
         }
     }
 }


यह भी देखें

बाहरी लिंक और संदर्भ