GPU पर साझा शीर्ष मानदंड बनाना


9

मैं ज्यादातर CPU से मार्चिंग क्यूब्स के कार्यान्वयन को ओपनग्लूट कंप्यूट शेड्स पर पोर्ट करने में सफल रहा हूं, लेकिन मैंने अभी तक मानदंडों से निबटा नहीं है और इसके बारे में जाने का सबसे अच्छा तरीका सोच रहा हूं।

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

मैं इस कार्यान्वयन को एक और shader पर पोर्ट कर सकता था, लेकिन इसके साथ जो समस्या मुझे दिख रही है, वह है भारी संख्या में परमाणु की आवश्यकता। चूँकि हम केवल स्केलर पूर्णांक प्रकारों पर एटमिक्स का उपयोग कर सकते हैं, और मैं एक हस्ताक्षर योग्य तरीके से 3 हस्ताक्षरित इनट्स को 1 में पैक करने का एक तरीका नहीं सोच सकता, इसका मतलब है कि 3 अक्ष * 3 कोने = 9 परमाणु प्रति shader आह्वान कहते हैं। वे निश्चित रूप से पूरे स्मृति में फैल जाएंगे, इसलिए यह 9 बार एक एकल परमाणु काउंटर को मारने की तरह नहीं है, लेकिन यह अभी भी बहुत कुछ नरक की तरह लगता है।

अन्य विकल्प एक shader मंगलाचरण प्रति बहुभुज चलाने के लिए और चेहरे की सामान्य सूची बनाने के लिए है (मैं शायद इस तरह से x10y10z10 पर पैक कर सकता हूं), तो पड़ोसी चेहरों के सभी मानदंडों को संचित करने के लिए एक shader प्रति-शीर्ष। यह एक बहुत बड़ा मेमोरी हॉग होगा, हालांकि सबसे खराब स्थिति से निपटने के लिए चेहरे के सूचकांकों के स्टोरेज स्पेस को 12 इंट प्रति वर्टिक्स की आवश्यकता होगी। इस बात की भी समस्या है कि इस स्टोरेज में लिखने के लिए फिर से एटमिक्स का सहारा लिए बिना काम करने के लिए कितने चेहरों को पहले से ही एक विशेष शीर्ष पर लिखा गया है।

किसी को भी यह कैसे करना है पर कोई बेहतर विचार है?

जवाबों:


5

केवल NVidia समाधान के लिए आप फ्लोटिंग पॉइंट एटॉमिक ऐड इंट्रिंसिक्स (जैसे NvInterlockedAddFp32) HLSL में GPU आंतरिक को अनलॉक कर सकते हैं। NVIDIA डेवलपर

मैं 80.000 शीर्ष जाल पर यह कोशिश की है और यह काफी तेज है (GTX980M पर 1 या 2 एमएस की तरह कुछ है, अगर मुझे याद नहीं है)

काम करने के लिए आंतरिकता के लिए रिलीज में अपने शेड्स को संकलित करने से सावधान रहें (एनवीडिया बग / सीमा के कारण)

इसके अलावा वर्टेक्स स्प्लिट्स से सावधान रहें (उदाहरण के लिए यूवी असंतोष के कारण), आपको उन्हें संभालना होगा अन्यथा आपको यूवी सीम पर अवांछित कठोर किनारे होंगे।


क्योंकि प्रश्न पुराना है, मैं आपसे इसके बजाय पूछना चाहता हूं :-) क्योंकि मैं समझता हूं कि प्रत्येक शीर्ष के लिए बस आसन्न जानकारी होने के कारण रस के लिए पर्याप्त अच्छा नहीं था?
एंड्रियास

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