पॉलीटॉप मॉडल

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

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

<वाक्यविन्यास प्रकाश लैंग = सी> कॉन्स्टेंट इंट एन = 100; इंट आई, जे, ए [एन] [एन];

के लिए (i = 1; i 

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

एफ़िन परिवर्तन के साथ पॉलीटॉप मॉडल का एक अनुप्रयोग $$(i',\, j') = (i+j,\, j)$$ और सीमाओं में उपयुक्त परिवर्तन, नेस्टेड छोरों को ऊपर में बदल देगा:

<वाक्यविन्यास प्रकाश लैंग = सी> ए [आई - जे] [जे] = ए [आई - जे - 1] [जे] + ए [आई - जे] [जे - 1]; 

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

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

आंतरिक पाश का प्रत्येक पुनरावृत्ति मूल्यों को संशोधित करता है  के मूल्यों पर आधारित है ,  , और. (समान निर्भरताएं लागू होती हैं . लूप ऑप्टिमाइज़ेशन # कॉमन लूप ट्रांसफ़ॉर्मेशन के प्रयोजनों के लिए, हम सोच सकते हैं   और   एक ही तत्व के रूप में।) हम निर्भरताओं को चित्रित कर सकते हैं   ग्राफिक रूप से, जैसा कि दाईं ओर आरेख में है।

एफ़िन परिवर्तन करना $$(p,\, t) = (i,\, 2j+i)$$ मूल निर्भरता आरेख पर हमें एक नया आरेख मिलता है, जो अगली छवि में दिखाया गया है। फिर हम कोड को लूप ऑन करने के लिए फिर से लिख सकते हैं  और   के बजाय   और , निम्नलिखित तिरछी दिनचर्या प्राप्त करना।

यह भी देखें

 * बहुफलकीय मॉडल का समर्थन करने वाले ढांचे
 * लूप नेस्ट ऑप्टिमाइज़ेशन
 * लूप अनुकूलन
 * लूप अनोलिंग
 * लूप टाइलिंग

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

 * बुनियादी पॉलीटॉप विधि, मार्टिन ग्रिब्ल द्वारा ट्यूटोरियल जिसमें उपरोक्त स्यूडोकोड उदाहरण के आरेख शामिल हैं
 * पॉलीटॉप मॉडल में कोड जनरेशन (1998)। मार्टिन ग्रीब्ल, क्रिश्चियन लेंगौएर और सबाइन वेटज़ेल
 * सीएलओओजी पॉलीहेड्रल कोड जेनरेटर
 * CodeGen+: Z-पॉलीहेड्रा स्कैनिंग
 * PoCC: बहुफलकीय संकलक संग्रह
 * PLUTO - affine लूप नेस्ट के लिए एक स्वचालित पैरेललाइज़र और स्थानीयता अनुकूलक
 * polyhedral.info - एक वेबसाइट जो बहुफलकीय संकलन के बारे में जानकारी एकत्र करती है
 * पोली - हाई-लेवल लूप और डेटा-लोकलिटी ऑप्टिमाइजेशन के लिए एलएलवीएम फ्रेमवर्क
 * एमआईटी Tiramisu Polyhedral फ्रेमवर्क।
 * एमआईटी Tiramisu Polyhedral फ्रेमवर्क।

श्रेणी:संकलक अनुकूलन श्रेणी:सूडोकोड के उदाहरण वाले लेख श्रेणी:उदाहरण सी कोड वाले लेख