बहता जीपीयू कंप्यूट पानी


15

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

आप सूत्र का उपयोग करके वर्षा की घटना के दौरान उत्पन्न पानी की मात्रा की गणना कर सकते हैं:
Q (CF/S) = c * I (in/hr) * A (acres)

मुझे पहले क्षेत्र के "एकरेज" की गणना करने से आगे बढ़ने में कठिनाई हो रही है।

वर्तमान कार्यान्वयन अवलोकन:

  1. इलाक़ा 1-यूनिट के अंतराल पर एक नियमित ग्रिड है
  2. एक ऊंचाई पर प्रत्येक शीर्ष के लिए एक R32 ऊंचाई मान होता है
  3. वर्तमान में, मैं केवल 4 कार्डिनल दिशाओं (कोई विकर्ण) में प्रवाह की अनुमति दे रहा हूं
  4. मैं Texture2D का उपयोग कर रहा हूँ [int] वर्टिकल के लिए एक स्टैंसिल के रूप में जिसका मैंने पहले ही विश्लेषण किया है

वर्तमान एल्गोरिथ्म:

  1. जब इलाके का उपकरण सक्रिय हो गया है और अब, नहीं है ...।
  2. "स्टैंसिल" को साफ़ करें।
  3. सबसे कम ऊंचाई के लिए पूरे इलाके को स्कैन करें।
  4. वह एकल बिंदु CS_Flood का प्रारंभिक इनपुट है।
  5. CS_Flood एक X- अक्ष पास बनाती है।
  6. प्रत्येक इनपुट शीर्ष 20- गुना तक X- और X + दिशाओं दोनों में अनुमानित है।
  7. एक OOB समन्वय के साथ एक आसन्न शीर्ष ढूँढना इस दिशा में इलाके के किनारे को इंगित करता है। करंटपॉइंट को बाउंड्रीपॉइंट्स बफर से जोड़ा जाता है और उस दिशा के लिए प्रोजेक्शन लूप को समाप्त कर दिया जाता है। यह आसान था और हर बार बढ़िया काम करता है।
  8. ऊंचाई के साथ समीपस्थ कोने> = वर्तमान वर्टेक्स की ऊँचाई को स्टेंसिल में चिह्नित किया जाता है और नेक्स्टपास बफर में जोड़ा जाता है।
  9. ऊंचाई के साथ आसन्न कोने <वर्तमान वर्टेक्स की ऊंचाई एक रिज के शिखर को इंगित करती है और प्रक्षेपण लूप को समाप्त करती है। बाढ़ भराव का एक भावी पुनरावृत्ति रिज के आधार के चारों ओर बह सकता है, इसके "पीछे" तरफ और दूसरी बार उसी रिज का पता लगा सकता है।
  10. इस उद्देश्य के लिए किसी भी चोटी / रिज बिंदु, जो एक से अधिक बार पता लगाए गए हैं , बाउंड्रीप्वाइंट नहीं होंगे।
  11. किसी भी चोटी / रिज अंक का पता एक बार बाउंड्रीपॉइंट्स पर लगाया जाता है और उस दिशा में प्रोजेक्शन लूप समाप्त हो जाता है।
  12. CS_Flood एक ही कोड के साथ Z- अक्ष पास बनाती है, इनपुट के रूप में X- अक्ष पास द्वारा उत्पन्न बिंदुओं का उपयोग करती है।
  13. अभी, CS_Flood दो दिशाओं के बीच अनिश्चित काल तक बारी-बारी से जारी है। आखिरकार, जब भी CS_Flood पूरी हो जाती है और NextPass बफर खाली हो जाता है, तो मैं कुल लूप को समाप्त कर दूंगा।

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

फिर:

  1. स्टैंसिल को साफ किए बिना, इलाके को निम्नतम, गैर-स्टैंक्ड, वर्टेक्स के लिए फिर से स्कैन करें।
  2. Iterate CS_Flood करें।
  3. स्टैंसिल भरा हुआ है (या कुछ इसी तरह) जब तक दोहराएँ।

इन रंगों के साथ 3 डी का अनुभव करना कठिन है; यह अभिन्न ऊँचाई पर समोच्च रेखाएँ दिखाता है:
(किनारे के पास एक बरम से घिरा हुआ एक छिद्र) बढ़त बरम छेद

एक शीर्ष पर पहुंचने के लिए लगभग 10 अनूठे तरीके हैं; हर एक को एक अनोखा रंग
देता है : (दृश्यमान परिपत्र उपकरण के निशान, "लकीरें" अच्छी तरह से दिखाते हैं) यहाँ छवि विवरण दर्ज करें

यह एक बिंदु के रूप में CS_Flood, सीमा या अन्यथा द्वारा उत्पन्न हर बिंदु को दर्शाता है: यहाँ छवि विवरण दर्ज करें

एल्गोरिथ्म हमेशा लगभग काम करता है । कभी-कभी, यह सही ढंग से काम भी करता है। दूसरी बार, एल्गोरिथ्म स्पष्ट रूप से सही आकार में निहित है लेकिन अनिश्चित काल तक आउटपुट बिंदुओं के लिए जारी रहेगा। जैसा कि 3rd स्क्रीनशॉट में देखा गया है, कभी-कभी यह भ्रमित हो जाता है। एक और स्थिति / कारक होना चाहिए जिसे मैंने अनदेखा कर दिया है। मैं समस्या पर हमला करने के लिए अपने निरीक्षण या सरल और / या अधिक सुरुचिपूर्ण तरीके के सुझावों को खोजने में किसी भी मदद की सराहना करता हूं।

लापता बिंदु

MissingPoint! NextPass बफ़र के लिए खोजे गए हर नए बाउंड्रीप्वाइंट को जोड़ने के लिए एल्गोरिदम को बैंड-ऐड करके शामिल किया जा सकता है। अगले पास के दौरान, उस बैंड-सहायता द्वारा उत्पन्न 99% अंक GPU की थोड़ी मात्रा को निर्धारित करते हुए निर्धारित करेंगे कि वे कहीं भी और कुछ भी नहीं कर सकते हैं। पहले पास के दौरान, अन्य नेक्स्टपास पॉइंट्स के साथ लोवेस्टपॉप भेजने से भी इस विशिष्ट परिदृश्य को संभालना होगा।

मुझे पता है कि यह प्रशंसनीय है और, पर्याप्त समय दिए जाने पर, मैं यह करने के लिए पर्याप्त रूप से बैंड-सहायता कर पाऊंगा कि मुझे क्या चाहिए। यदि संभव हो तो मैं इसे एक बेहतर, होशियार, तेज तरीके से करना चाहता हूं, और मुझे अभी तक बेहतर अनुभव नहीं है।


तो आपका मतलब है कि आप केवल यह गणना करना चाहते हैं कि इलाके का सारा पानी कहां जाता है?
एविलटाक

@EvilTak, मुझे लगता है कि मैं एक अच्छे एल्गोरिथ्म पर बस गया हूं, लेकिन मुझे अभी भी "अजीब सामान" मिल रहा है, जो मुझे समझाने का अनुभव नहीं है। यदि आप समानांतर GPU'ing में अच्छे हैं, तो कृपया देखें: gamedev.stackexchange.com/questions/118556/…
जॉन

जवाबों:


1

जब एक बूंद ने एक शीर्ष पर जाने की "कोशिश" की, तो स्टैंसिल को InterlockedExchange"मूल मूल्य" का उपयोग करके यह निर्धारित करने के लिए चिह्नित किया गया था कि क्या यह पहले से ही स्टैंक्ड था (भले ही मैंने इसे केवल ओवरवोट किया हो)।

सबसे अच्छा एल्गोरिथ्म मैं आया था जिसने बाढ़ को "स्क्रैच पैड" और एक ही नियम दिया: "डाउन-हिल न करें" (ऊंचाइयों के बराबर या उससे अधिक)। इसने लगभग सभी जटिल परीक्षणों को समाप्त कर दिया। हालांकि यह आमतौर पर चोटियों / लकीरों पर नहीं बहने के लिए अच्छा है , यह उनके साथ बहता है क्योंकि आसन्न कोने "सपाट" हैं। यह कभी-कभी बूंदों को पिछली रिज-लाइनों को छलनी करने की अनुमति देता है।

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

"बहुत दूर" बिंदुओं में से प्रत्येक, तब, "प्रवाहित" है और "जल निकासी क्षेत्र" में बह जाएगा (1 पर रुक जाता है) या नहीं (0 पर रुकता है)। "नोट" को छोड़ दिया जाता है और सही स्क्रैच-पैड को "फाइनल" में कॉपी किया जाता है। यदि फाइनल पहले से ही स्टैंक्ड है, तो स्क्रैच पैड को छोड़ दिया जाता है। (भविष्य: उन टकरावों को सामूहिक रूप से वर्तमान जल निकासी क्षेत्र की बाहरी सीमा का प्रतिनिधित्व करना चाहिए।)

10FPS पर:

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

"नोट्स" को लाल रंग में दिखाया गया है, एक बार बड़े क्षेत्र को अंतिम में कॉपी किया जाता है और हरा हो जाता है, फिर एल्गोरिथ्म शेष अस्थिर क्षेत्रों के लिए दोहराता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.