मेरे पास कम्प्यूटेशनल मॉडल का एक संग्रह है जिसे अतुल्यकालिक सेलुलर ऑटोमेटा के रूप में वर्णित किया जा सकता है। ये मॉडल ईज़िंग मॉडल से मिलते जुलते हैं, लेकिन थोड़े अधिक जटिल हैं। ऐसा लगता है जैसे सीपीयू के बजाय ऐसे मॉडल को GPU पर चलाने से लाभ होगा। दुर्भाग्य से यह इस तरह के मॉडल को समानांतर करने के लिए बिल्कुल सीधा नहीं है, और यह मेरे लिए बिल्कुल स्पष्ट नहीं है कि इसके बारे में कैसे जाना जाए। मुझे पता है कि इस विषय पर साहित्य है, लेकिन यह सब कट्टर कंप्यूटर वैज्ञानिकों के उद्देश्य से प्रतीत होता है, जो एल्गोरिदमिक जटिलता के विवरणों में रुचि रखते हैं, मेरे बजाय किसी ऐसे व्यक्ति के लिए जो सिर्फ एक चीज का विवरण चाहता है जिसे मैं लागू कर सकता हूं, और नतीजतन मैं इसे बल्कि inpenetrable लगता है।
स्पष्टता के लिए, मैं एक इष्टतम एल्गोरिथ्म की तलाश नहीं कर रहा हूं, क्योंकि CUDA में कुछ मैं तेजी से लागू कर सकता हूं जो कि मेरे सीपीयू कार्यान्वयन पर एक महत्वपूर्ण गति देने की संभावना है। इस परियोजना में कंप्यूटर समय की तुलना में प्रोग्रामर का समय बहुत सीमित है।
मुझे यह भी स्पष्ट करना चाहिए कि एक अतुल्यकालिक सेलुलर ऑटोमोबोन एक सिंक्रोनस से एक अलग चीज है, और सिंक्रोनस सिंक्रोनस सीए (जैसे कि कॉनवे के जीवन) को आसानी से इस समस्या के लिए अनुकूलित नहीं किया जा सकता है। अंतर यह है कि एक सिंक्रोनस सीए हर सेल को हर समय कदम पर एक साथ अपडेट करता है, जबकि एक एसिंक्रोनस एक यादृच्छिक रूप से चुने गए स्थानीय क्षेत्र को हर बार कदम के रूप में नीचे उल्लिखित अपडेट करता है।
जिन मॉडलों को मैं समांतर करना चाहता हूं, वे एक जाली (आमतौर पर एक हेक्सागोनल एक) पर लागू होते हैं, जिसमें ~ 100000 कोशिकाएं होती हैं (हालांकि मैं अधिक उपयोग करना चाहता हूं), और उन्हें चलाने के लिए गैर-समानांतर एल्गोरिदम इस तरह दिखता है:
यादृच्छिक पर कोशिकाओं की एक पड़ोसी जोड़ी चुनें
इन कोशिकाओं के आसपास के एक स्थानीय पड़ोस पर आधारित "ऊर्जा" फ़ंक्शन गणना करें
प्रायिकता के साथ, जो पर निर्भर करता है (with एक पैरामीटर), या तो दो कोशिकाओं के राज्यों को स्वैप करें या कुछ भी न करें। बीटा
उपरोक्त चरणों को अनिश्चित काल तक दोहराएं।
सीमा की स्थितियों के साथ करने के लिए कुछ जटिलताएं भी हैं, लेकिन मुझे लगता है कि ये समानांतरकरण के लिए बहुत मुश्किल नहीं हैं।
यह ध्यान देने योग्य है कि मैं इन प्रणालियों के क्षणिक गतिकी में दिलचस्पी रखता हूं, न कि केवल संतुलन की स्थिति में, इसलिए मुझे कुछ ऐसी चीज की जरूरत है, जो उपरोक्त समतुल्य गतिकी के बजाय, केवल कुछ ही समान वितरण के लिए दृष्टिकोण करेगी। (चेकरबोर्ड एल्गोरिथ्म की विविधताएं वह नहीं हैं जो मैं खोज रहा हूं।)
उपरोक्त एल्गोरिथ्म को समानांतर करने में मुख्य कठिनाई टकराव है। क्योंकि सभी गणना केवल जाली के एक स्थानीय क्षेत्र पर निर्भर करती हैं, इसलिए कई जाली साइटों को समानांतर में अपडेट किया जाना संभव है, जब तक कि उनके पड़ोस अतिव्यापी नहीं हों। सवाल यह है कि इस तरह के ओवरलैप से कैसे बचा जाए। मैं कई तरीकों के बारे में सोच सकता हूं, लेकिन मुझे नहीं पता कि यदि कोई लागू करने के लिए सबसे अच्छा है। ये इस प्रकार हैं:
यादृच्छिक ग्रिड साइटों की सूची बनाने और टकरावों की जांच करने के लिए सीपीयू का उपयोग करें। जब ग्रिड साइटों की संख्या GPU प्रोसेसर की संख्या के बराबर होती है, या यदि टक्कर का पता लगाया जाता है, तो संबंधित ग्रिड साइट को अपडेट करने के लिए निर्देशांक के प्रत्येक सेट को GPU इकाई में भेजें। यह लागू करना आसान होगा, लेकिन शायद यह बहुत गति नहीं देगा, क्योंकि सीपीयू पर टकराव की जाँच करने पर सीपीयू पर संपूर्ण अपडेट करने की तुलना में यह सब सस्ता नहीं होगा।
जाली को क्षेत्रों में विभाजित करें (एक GPU इकाई), और एक GPU इकाई है जो अपने क्षेत्र के भीतर बेतरतीब ढंग से ग्रिड कोशिकाओं का चयन और अद्यतन करने के लिए जिम्मेदार है। लेकिन इस विचार के साथ कई मुद्दे हैं जिन्हें मैं नहीं जानता कि कैसे हल करना है, सबसे स्पष्ट है कि वास्तव में क्या होना चाहिए जब एक इकाई अपने क्षेत्र के किनारे को ओवरलैप करते हुए पड़ोस चुनती है।
सिस्टम को निम्नानुसार समझें: असतत चरणों में समय दें। जाली को एक अलग में विभाजित करेंपूर्व निर्धारित योजना के अनुसार हर समय कदम पर क्षेत्रों का सेट, और प्रत्येक GPU इकाई को बेतरतीब ढंग से ग्रिड कोशिकाओं की एक जोड़ी का चयन करें और अपडेट करें, जिनके पड़ोस क्षेत्र की सीमा को ओवरलैप नहीं करते हैं। चूंकि सीमाएं हर बार बदलती हैं, इसलिए यह बाधा बहुत अधिक गतिशीलता को प्रभावित नहीं कर सकती है, जब तक कि क्षेत्र अपेक्षाकृत बड़े हैं। यह लागू करना आसान है और तेजी से होने की संभावना है, लेकिन मुझे नहीं पता कि यह गतिशीलता को कितनी अच्छी तरह अनुमानित करेगा, या प्रत्येक समय कदम पर क्षेत्र की सीमाओं को चुनने के लिए सबसे अच्छी योजना क्या है। मुझे "ब्लॉक-सिंक्रोनस सेलुलर ऑटोमेटा" के कुछ संदर्भ मिले, जो इस विचार के समान हो भी सकता है और नहीं भी। (मुझे नहीं पता क्योंकि ऐसा लगता है कि विधि के सभी विवरण या तो रूसी में हैं या उन स्रोतों में हैं जिनमें मेरी पहुंच नहीं है।)
मेरे विशिष्ट प्रश्न इस प्रकार हैं:
उपरोक्त एल्गोरिदम में से कोई भी एक अतुल्यकालिक सीए मॉडल के जीपीयू समांतरता तक पहुंचने का एक समझदार तरीका है?
क्या कोई बेहतर तरीका है?
क्या इस प्रकार की समस्या के लिए मौजूदा लाइब्रेरी कोड है?
मुझे "ब्लॉक-सिंक्रोनस" विधि का स्पष्ट अंग्रेजी-भाषा विवरण कहां मिल सकता है?
प्रगति
मेरा मानना है कि मैं एक अतुल्यकालिक सीए को समानांतर बनाने का एक तरीका लेकर आया हूं जो उपयुक्त हो सकता है। नीचे उल्लिखित एल्गोरिथ्म एक सामान्य एसिंक्रोनस सीए के लिए है जो एक बार में केवल एक सेल को अपडेट करता है, बजाय पड़ोसी जोड़ी के कोशिकाओं के रूप में मेरा करता है। मेरे विशिष्ट मामले में इसे सामान्य करने के साथ कुछ मुद्दे हैं, लेकिन मुझे लगता है कि मेरे पास एक विचार है कि उन्हें कैसे हल किया जाए। हालांकि, मुझे यकीन नहीं है कि नीचे दिए गए कारणों के लिए यह कितना गति लाभ देगा।
यह विचार एक अतुल्यकालिक CA (soforth ACA) को स्टोकेस्टिक सिंक्रोनस CA (SCA) से बदलने का है जो समान व्यवहार करता है। ऐसा करने के लिए हम पहले कल्पना करते हैं कि एसीए एक पॉइसन प्रक्रिया है। यही है, समय लगातार आगे बढ़ता है, और प्रत्येक सेल अपने अद्यतन कार्य को करने के प्रति यूनिट समय की निरंतर संभावना के रूप में, अन्य कोशिकाओं के स्वतंत्र रूप से करता है।
हम एक SCA का निर्माण करते हैं, जिसकी कोशिकाएँ दो चीजों को संग्रहीत करती हैं: कोशिका का राज्य (यानी क्रमिक कार्यान्वयन में प्रत्येक कोशिका में संग्रहीत डेटा), और एक अस्थायी बिंदु संख्या प्रतिनिधित्व करना (निरंतर) ) वह समय जिस पर वह अगली बार अद्यतन करेगा। यह निरंतर समय SCA के अद्यतन चरणों के अनुरूप नहीं है। मैं उत्तरार्द्ध को "तार्किक समय" के रूप में संदर्भित करूंगा। समय मानों को एक घातांक वितरण के अनुसार यादृच्छिक रूप से प्रारंभ किया जाता है: । (जहां " एक पैरामीटर है जिसका मान मनमाने ढंग से चुना जा सकता है।) टी मैं जे टी मैं j ( 0 ) ~ ऍक्स्प ( λ ) λ
प्रत्येक तार्किक समय कदम पर, SCA की कोशिकाओं को निम्नानुसार अद्यतन किया जाता है:
यदि, किसी भी , के समय के पड़ोस में , कुछ भी नहीं करें।i , j t k l < t i j
अन्यथा, (1) राज्य को पड़ोसी एसीए के समान नियम का उपयोग करते हुए, पड़ोसी कोशिकाओं के राज्यों के अनुसार अपडेट करें ; और (2) एक यादृच्छिक मान और को अपडेट । एक्स कश्मीर एल Δ टी ~ ऍक्स्प ( λ ) टी मैं जे टी मैं j + Δ टी
मेरा मानना है कि यह सुनिश्चित करता है कि कोशिकाओं को एक क्रम में अद्यतन किया जाएगा जो मूल एसीए के अनुरूप होने के लिए "डीकोड" कर सकते हैं, जबकि टकराव से बचने और कुछ कोशिकाओं को समानांतर में अपडेट करने की अनुमति देते हैं। हालाँकि, ऊपर दिए गए पहले बुलेट पॉइंट के कारण, इसका मतलब है कि SCA के प्रत्येक समय के कदम पर ज्यादातर GPU प्रोसेसर ज्यादातर निष्क्रिय होंगे, जो आदर्श से कम है।
मुझे कुछ और विचार देने की आवश्यकता है कि क्या इस एल्गोरिथ्म के प्रदर्शन में सुधार किया जा सकता है, और एसीए में एक साथ कई कोशिकाओं को अपडेट किए जाने के मामले से निपटने के लिए इस एल्गोरिथ्म का विस्तार कैसे किया जाए। हालाँकि, यह आशाजनक लग रहा है इसलिए मैंने सोचा कि मैं इसका वर्णन यहाँ करूँगा जब कोई भी (ए) साहित्य में कुछ भी समान जानता है, या (बी) इन शेष मुद्दों पर कोई जानकारी दे सकता है।
exp()
) तो मैंने सोचा नहीं होगा कि यह कई थ्रेड्स पर फैलाने के लिए बहुत समझ में आता है। मुझे लगता है कि यह बेहतर है (और मेरे लिए आसान है) कोशिश करें और समानांतर में कई जोड़े को अद्यतन करने के लिए, एक जोड़ी प्रति धागे के साथ।