तुम एक 2 डी boids सिमुलेशन कैसे समानांतर सकता है


16

आप इस तरह से 2 डी बॉयलर सिमुलेशन कैसे कर सकते हैं ताकि यह विभिन्न स्रोतों (क्लस्टर, जीपीयू) से प्रसंस्करण शक्ति का उपयोग कर सके।

उदहारण देता है

उपर्युक्त उदाहरण में, गैर-रंगीन कण तब तक घूमते रहते हैं, जब तक वे क्लस्टर (पीले) नहीं हो जाते हैं और बढ़ना बंद कर देते हैं।

समस्या यह है कि सभी संस्थाएं एक-दूसरे के साथ संभावित रूप से बातचीत कर सकती हैं, हालांकि बाईं ओर स्थित एक इकाई नीचे दाएं में एक के साथ बातचीत करने की संभावना नहीं है। यदि डोमेन को अलग-अलग खंडों में विभाजित किया गया था, तो यह पूरी चीज़ को गति दे सकता है, लेकिन यदि कोई इकाई दूसरे खंड में पार करना चाहती है, तो समस्याएं हो सकती हैं।

फिलहाल यह सिमुलेशन 5000 फ्रेमवर्क के साथ एक अच्छे फ्रेम रेट के साथ काम करता है, मैं अगर संभव हो तो लाखों लोगों के साथ यह कोशिश करना चाहूंगा।

क्या इसे अनुकूलित करने के लिए क्वाड पेड़ों का उपयोग करना संभव होगा? कोई अन्य सुझाव?


आप अनुकूलन के लिए पूछ रहे हैं या कैसे समानांतर करने के लिए? ये अलग चीजें हैं।
बंमज़ैक

@bummzack समानांतर कैसे करें, मैंने अभी और स्पष्टीकरण जोड़ा है, क्या यह मदद करता है?
साइक्रेन जूल

जवाबों:


7

मास्टर की थीसिस पार्टिकल तरल पदार्थ के समानांतर सिमुलेशनमाटियास लिंडे द्वारा बड़े पैमाने पर सिमुलेशन के लिए डेटा विभाजन और एल्गोरिदम में कुछ अंतर्दृष्टि प्रदान कर सकता है।

उनका पेपर स्मूथेड-पार्टिकल हाइड्रोडायनामिक्स की ओर तैयार है , जो भोले घोल के लिए सिमुलेशन में कणों के कर्नेल पदचिह्न के आकार के चारों ओर एक बाल्टी आकार के साथ स्थानिक हाशिंग का उपयोग करता है।

चूंकि विशिष्ट SPH गुठली में अंतःक्रिया की दूरी कठिन होती है, ऐसे विभाजन अनुकूलन प्रणाली को बढ़ाने में लगभग आवश्यक होते हैं।


अच्छा कागज है, लेकिन इस प्रश्न के बारे में आंशिक हिस्सा @Fxlll उत्तर की तरह एक सा लगता है।
अली

मैं कहता हूं कि कागज का वास्तविक हिस्सा यह है कि यह कैसे संचार प्रोटोकॉल की शुरुआत करके किनारे के मामलों को हल करता है, कठिन भाग को हल करता है, क्वाड विभाजन बहुत स्पष्ट है और इसके द्वारा किनारे के मामले को हल नहीं किया जाता है।
माईक सेमर

4

जिस शब्द को मैंने बहुत पहले सीखा था वह एक गेम की जानकारी की गति थी।

यदि आपके फोड़े की गति 1 है और वे केवल अपने पड़ोसियों की परवाह करते हैं, तो जानकारी की गति 3 है, अर्थात, एक फोड़ा जो आपसे दो वर्ग दूर है वह उस सीमा के भीतर हो सकता है जिसकी आप एक फ्रेम में देखभाल करते हैं:

बातचीत में प्रति वर्ग 1 वर्ग आंदोलन (1 + 1) प्लस वह दूरी जिसे आप चीजों को नोटिस कर सकते हैं (1) 3 के बराबर है।

इसे देखते हुए, हम सीखते हैं कि हम एक नक्शे को टुकड़ों में काट सकते हैं, जैसा हम चाहते हैं, उतना छोटा आकार दें, लेकिन जानकारी की इस गति के साथ किसी भी पड़ोसी भाग में ओवरलैप हो सकता है।

मुझे लगता है कि आप केवल एक वर्ग को स्थानांतरित करने की अनुमति दे रहे हैं, लेकिन वे तीन देख सकते हैं

यदि आप एक बड़े पैमाने पर समानांतर सिम चलाना चाहते हैं, तो आप 10x10 ग्रिड में बंद कर देते हैं, लेकिन प्रत्येक किनारे पर 5 वर्गों द्वारा ओवरलैप करते हैं। जब भी आपका कोई सिरा स्थानीय चंक के किनारे से सूचना की दूरी के भीतर हो, तो आपको पड़ोसी को अपडेट करना चाहिए, और एक बार सीमा पार करने के बाद, वे आपके पास नहीं हैं। यदि कोई पड़ोसी कहता है कि जिस फोड़े को वे नियंत्रित कर रहे हैं, वह आपके चुंगल में चला गया है, तो आपको इसे AI पर लेना होगा।

इसका मतलब यह है कि संचार पड़ोसी चंक प्रबंधकों के लिए स्थानीय है, और यातायात कम से कम हो जाता है। जितने अधिक कार्य आप चलाते हैं, उतने अधिक सीपीयू आप सिमुलेशन को शक्ति देने के लिए उपयोग कर सकते हैं, लेकिन जितने अधिक कार्य आप चलाते हैं, उतने ही अधिक ओवरलैप होते हैं, और इसलिए सिमुलेशन के रूप में नौकरियों / विखंडू के बीच गुजरने वाली अधिक जानकारी। यह वह जगह है जहां आपको भारी हाथ मिलाना है और एआई जटिलता के आधार पर चंक आकार को ट्यून करना है और आपके पास क्या हार्डवेयर उपलब्ध है।


कल्पना करें कि दुनिया 1,000,000x1,000,000 ग्रिड की है, और दुनिया में 10,000,000 बॉयलर हैं, और प्रत्येक फोड़ा प्रत्येक मोड़ को बिल्कुल एक वर्ग में ले जा सकता है, क्या आप बता सकते हैं कि किसी दूसरे के पड़ोस में अगर कोई फोड़ा है तो कैसे जांचें?
अली

Im अनुमान लगा रहा है कि हम इसे 2000 500x500 वर्ग या उससे अधिक में विभाजित कर सकते हैं। प्रत्येक वर्ग में बॉयलर की सूची के साथ-साथ पड़ोसियों की सूची भी होती है। यदि एक फोड़ा एक वर्ग से बाहर निकलता है तो उसे बॉयलर की सूची से हटा दिया जाता है और दूसरे वर्ग में जोड़ा जाता है। इस विधि के साथ समस्या जो मैं देख सकता हूं, यदि आप किसी ऐसी चीज को जोड़ते हैं जो वर्ग से बड़ी है। चतुष्कोणीय समाधान गतिशील होना होगा, लेकिन मुझे यकीन नहीं है कि कितना महंगा होगा
साइक्रेन

@ गज़ेट: आपको केवल अपने चंक या पड़ोसी प्रबंधित बॉर्डर्स में उल्लुओं की जांच करने की आवश्यकता है। याद रखें, बॉर्डर को डिज़ाइन द्वारा इस बात की गारंटी दी जाती है कि कोई भी इकाई कितनी दूर तक ले जा सकती है और वह दूरी जिसे इकाइयां देख सकती हैं। @ साइक्रेन: झुंड, भले ही यह हमें एक बड़ी इकाई लगता है, अभी भी केवल एक छोटे पैमाने पर प्रभाव है। मछली का एक स्कूल स्कूल का पालन नहीं करता है, वे अपने पालन योग्य पड़ोसियों का पालन करते हैं।
रिचर्ड फेबियन

2

अपने quesiton को पढ़कर ऐसा लगता है कि आप क्वाड ट्री का लाभ ले सकते हैं, एक क्वाड ट्री बना सकते हैं और एक अलग प्रोसेसिंग यूनिट पर प्रत्येक सेगमेंट के लिए सिमुलेशन चला सकते हैं। यह केवल एक दूसरे के पास की वस्तुओं की जाँच का कारण होगा। लेकिन आपको हर चक्र को थ्रेड सिंक करने की आवश्यकता होगी। जिसका अर्थ है कि उन कुछ उल्लुओं को एक प्रसंस्करण समूह से दूसरे में स्थानांतरित करना। सामान्य तौर पर हर चक्र में 3 चरण होंगे:

  1. सभी boids को एक इकाई द्वारा स्थानांतरित करें। (जिसे कई सूत्र का उपयोग करके आसानी से संसाधित किया जा सकता है)
  2. प्रत्येक समूह को एक समूह * को सौंपना। इसका अर्थ है O (n) के एल्गोरिथ्म का उपयोग करके आपको यह चुनना होगा कि टकराव की संभावना सबसे अधिक है। यह भी कई धागे का उपयोग कर संभाला जा सकता है।
  3. अंत में आपको यह जांचना होगा कि क्या एक ही समूह में दो बॉयलर टकरा गए हैं।

* समूह बनाने के लिए आप नीचे दिए गए पैटर्न का उपयोग कर सकते हैं:

यहाँ छवि विवरण दर्ज करें

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

--edit--

विभाजन के बारे में एक और विचार है जिसे पेपर @LarsViklund में वर्णित किया गया है, इस तरह से बहुत कम दोहरी जाँच हुई है और चरणों के बीच थ्रेड की संख्या को बढ़ाने / घटाने की कोई आवश्यकता नहीं है:

यहाँ छवि विवरण दर्ज करें

ध्यान दें कि कुछ क्षेत्र अभी भी दो समूहों का हिस्सा हैं। और क्षेत्र की चौड़ाई दोनों समूह कवर बिल्कुल है 2*maximum speed। आपके मामले में अगर बॉडी एक पिक्सेल प्रति सिमुलेशन कदम पर चलती है तो आपको प्रत्येक 2 समूह के बीच 2 पिक्सेल चौड़ाई क्षेत्र साझा करने की आवश्यकता होती है। और एक छोटा सा क्षेत्र है जो 4 समूहों का एक हिस्सा है। लेकिन सामान्य तौर पर इस पद्धति को लागू करना आसान है और यदि सही तरीके से लागू किया जाए तो यह कहीं अधिक तेज है। और इस तरह से कोई उल्टा कदम नहीं है, अगर कोई वस्तु आगे बढ़ सकती है तो वह आगे नहीं बढ़ सकती है।


एक अच्छे विचार की तरह लगता है, लेकिन चरण 1 में जाने से पहले, मुझे यह देखने के लिए टकराव का पता लगाने की आवश्यकता होगी कि क्या वे स्थानांतरित कर सकते हैं या नहीं?
साइक्रेन जूल

आप उन्हें स्थानांतरित कर सकते हैं, अगर कोई टक्कर उस चाल के लिए उल्टी हो जाती है (उस सटीक फोड़े के लिए), अगर सिमुलेशन को जारी न रखने दें।
अली

धन्यवाद, यह अधिक समझ में आता है। Quadtrees के अलावा, क्या आप वर्कलोड को विभाजित करने के लिए किसी अन्य तरीके के बारे में सोच सकते हैं?
साइक्रेन जूल

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

@ गजीत अगर मैं आपकी तस्वीर को सही समझ रहा हूं, तो बहुत सी दोहरी गणना होगी, क्योंकि समूहों के अतिव्यापी क्षेत्र बहुत बड़े हैं। यह देखते हुए कि प्रश्न कुछ लाखों अंकों तक अनुकरण करने के लिए कहता है, यह एक बहुत बड़ा बेकार होगा।
माईक सेमर

2

मैंने हाल ही में इनमें से कुछ उत्तरों को शुरुआती बिंदु के रूप में उपयोग करते हुए इस समस्या से निपटा। ध्यान रखने योग्य सबसे उपयोगी बात यह है कि बॉयलर एक प्रकार का सरल एन-बॉडी सिमुलेशन है: प्रत्येक बोइड एक कण है जो अपने पड़ोसियों पर एक बल लगाता है।

मुझे लिंडे का पेपर पढ़ने में मुश्किल लगा; मैं इसके बजाय एसजे प्लाम्पटन के "शॉर्ट-रेंज आणविक गतिशीलता के लिए फास्ट समानांतर एल्गोरिदम" को देखने का सुझाव देता हूं। , जिसे लिंडे ने संदर्भित किया था। प्लिम्पटन का पेपर बेहतर आंकड़ों के साथ कहीं अधिक पठनीय और विस्तृत है:

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

मैं आपको AD की कोशिश करने की सलाह देता हूं। इसे समझना और लागू करना सबसे आसान है। एफडी बहुत समान है। यहाँ एफवी का उपयोग करके CVA के साथ nVidia का एन-बॉडी सिमुलेशन है, जो आपको एक मोटा विचार देना चाहिए कि कैसे टाइलिंग और कटौती धारावाहिक प्रदर्शन को काफी हद तक पार करने में मदद कर सकती है।

एसडी कार्यान्वयन आमतौर पर तकनीकों का अनुकूलन कर रहे हैं, और लागू करने के लिए कोरियोग्राफी की कुछ डिग्री की आवश्यकता होती है। वे लगभग हमेशा तेज और बेहतर पैमाने पर हैं।

ऐसा इसलिए है क्योंकि AD / FD को प्रत्येक फोड़े के लिए "पड़ोसी सूची" बनाने की आवश्यकता होती है। यदि प्रत्येक नाव को अपने पड़ोसियों की स्थिति जानने की आवश्यकता है, तो उनके बीच संचार O ( n ²) है। आप प्रत्येक बोइल चेक के क्षेत्र के आकार को कम करने के लिए वेरलेट पड़ोसी सूचियों का उपयोग कर सकते हैं, जो आपको हर चरण के बजाय हर कुछ टाइमस्टेप्स की सूची को फिर से बनाने की अनुमति देता है, लेकिन यह अभी भी ओ ( एन ²) है। एसडी में, प्रत्येक सेल एक पड़ोसी सूची रखता है, जबकि ईडी / एफडी में प्रत्येक बोद की पड़ोसी सूची होती है। इसलिए एक-दूसरे के साथ संवाद करने वाले हर उब के बजाय, हर कोशिका एक-दूसरे के साथ संचार करती है। संचार में यह कमी है कि गति में वृद्धि कहां से होती है।

दुर्भाग्य से boids समस्या SD को थोड़ा तोड़ देती है। प्रत्येक प्रोसेसर का एक सेल पर नज़र रखना सबसे अधिक फायदेमंद है जब पूरे क्षेत्र में कुछ हद तक समान रूप से वितरित होते हैं। लेकिन आप एक साथ क्लस्टर करना चाहते हैं! यदि आपका झुंड ठीक से व्यवहार कर रहा है, तो आपके प्रोसेसर का अधिकांश हिस्सा दूर टिक जाएगा, एक दूसरे के साथ खाली सूचियों का आदान-प्रदान होगा, और कोशिकाओं का एक छोटा समूह एक ही गणना एडी या एफडी का प्रदर्शन करेगा।

इससे निपटने के लिए, आप या तो गणितीय रूप से कोशिकाओं के आकार (जो स्थिर है) को किसी भी समय खाली कोशिकाओं की संख्या को कम कर सकते हैं, या क्वाड-पेड़ों के लिए बार्न्स-हट एल्गोरिथ्म का उपयोग कर सकते हैं। बीएच एल्गोरिथ्म अविश्वसनीय रूप से शक्तिशाली है। विरोधाभासी रूप से, समानांतर आर्किटेक्चर पर लागू करना बेहद मुश्किल है। ऐसा इसलिए है क्योंकि BH पेड़ अनियमित है, इसलिए समानांतर धागे इसे बेतहाशा अलग-अलग गति से पार करेंगे, जिसके परिणामस्वरूप धागा विचलन होगा। सैल्मन और डबिन्स्की ने ऑर्थोगोनल पुनरावर्ती द्विध्रुव एल्गोरिदम को प्रोसेसर के बीच समान रूप से वितरित करने के लिए प्रस्तुत किया है, जिसे अधिकांश समानांतर आर्किटेक्चरों के लिए पुनरावृत्त होना चाहिए।

जैसा कि आप देख सकते हैं, हम इस बिंदु पर स्पष्ट रूप से अनुकूलन और काले जादू के दायरे में हैं। फिर से, प्लिम्प्टन के पेपर को पढ़ने की कोशिश करें और देखें कि क्या इसका कोई मतलब है।


1

मैं मान रहा हूँ तुम्हारा एक टॉरॉयडल सिस्टम है, तुम स्पेस में विभाजन कर सकते हो इसलिए प्रत्येक यूनिट का उप क्षेत्र है।

प्रत्येक चरण में कणों को स्थानांतरित कर दिया जाता है, जो उप क्षेत्र से बाहर जाते हैं वे कण संबंधित प्रोसेसर को भेजे जाते हैं; एक संचार कदम प्रोसेसर को सिंक्रनाइज़ करेगा और एक अंतिम पोस्टस्टेप को विदेशी कणों की स्थिति (यदि कोई हो) को विस्तृत करने के लिए लिया गया है।

यहाँ तीन समस्याएं हैं:

  • 1) उप क्षेत्र का आकार:

कोई भी आयतों का विकल्प चुन सकता है, लेकिन एक छोटे से क्षेत्र / परिधि अनुपात की तुलना में इसे दिखा सकते हैं। जितना बड़ा बॉर्डर उतना अधिक कण निकलेंगे। जबकि पुटी सबसे अच्छा ए / पी अनुपात प्रदर्शित करता है, इसका उपयोग टेसेलेशन के लिए नहीं किया जा सकता है, इसलिए आपको एक अच्छे औसत ए / पी अनुपात के साथ कुछ (possibily सेमी रेगुलर) टेसलेशन के लिए इंडैगेट करना चाहिए। स्पष्ट रूप से सेल कोऑर्डिनेट द्वारा टैसेल इंडेक्स की गणना सरल होनी चाहिए, इसलिए बहुत ही एक्सक्लूसिव टैस्लेशन करने से पहले इस पर विचार करें।

  • 2) संचारप्रणाली:

आपके पास किस प्रकार की संचार अवसंरचना है, इसके आधार पर, आप सोच सकते हैं कि प्रोसेसर के बीच बॉर्डर-क्रॉसिंग informations को कैसे बिखेरें। ब्रॉडकास्टिंग बनाम पीयर-टू-पीयर पुनर्निर्माण बनाम पीयर-टू-पीयर संचार सभी विकल्प हैं।

  • 3) उप-क्षेत्र आवंटन:

आपको अपने विस्तार को संतुलित रखना चाहिए क्योंकि प्रत्येक चरण में एक सिंक्रोनिज़ेशन होता है। आप प्रोसेसर के लिए सांख्यिकीय या गतिशील रूप से आवंटित क्षेत्रों का चयन कर सकते हैं। यह एक बड़ा मुद्दा नहीं है यदि आपका स्थान सक्रिय कणों द्वारा असमान रूप से कवर किया गया है, लेकिन मैं मानता हूं कि यह इस मामले में असत्य हो सकता है क्योंकि टकराव कणों को निष्क्रिय करते हैं। आवंटन को बदलने के लिए एक भारी संचार कदम की आवश्यकता होती है; कुछ शॉर्टकट लिए जा सकते हैं यदि सभी प्रोसेसर क्रॉस-बॉर्डर informations को साझा करते हैं लेकिन आपको इसके बारे में कुछ विचार करना होगा


@Fxlll मैं अनिश्चित हूँ कि आपका क्या मतलब है टौरॉयडल सिस्टम, इसका डोनट के आकार में नहीं। क्या आपका मतलब यह है कि अगर कोई कण दाहिने हाथ की तरफ से जाता है, तो वह बाईं ओर फिर से दिखाई देता है? यदि ऐसा नहीं है, तो यदि कोई कण दाहिने हाथ की तरफ से टकराता है तो वह एक अलग दिशा में जाने की कोशिश करता है।
साइक्रेन जूल

@ इस मामले में ठीक है, आपको कुछ विशेष तरीके से किनारे पर क्षेत्र के उपचार और उपचार के बारे में कुछ विचार करना है
FxIII

-1

सुराग के लिए मेरा अनुकरण आज़माएं https://github.com/wahabjawed/Boids-Simulation

मैंने इसे XNA पर विकसित किया


सिर्फ एक पूरी परियोजना से जोड़ना एक अच्छा जवाब नहीं है। पाठक को आपके स्रोत के माध्यम से खुदाई करने के लिए मजबूर किया जाता है जब तक कि उन्हें वह हिस्सा नहीं मिला जो प्रश्न के लिए प्रासंगिक है और फिर भी यह समझने की आवश्यकता है कि यह समस्या को कैसे हल करता है। क्या आप सीधे सादे अंग्रेजी में वर्णन कर सकते हैं कि आपने समस्या के बारे में क्या बताया है और अन्य उत्तरों में वर्णित समाधानों पर इसके क्या फायदे हैं? यदि वे आपके विवरण को समझने में मदद करते हैं तो आप अपने उत्तर में कुछ छोटे कोड स्निपेट को कॉपी और पेस्ट कर सकते हैं।
फिलीपींस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.