CUDA

2010-01-10 19 views
7

के साथ ड्राइंग त्रिकोण मैं अपनी खुद की ग्राफिक्स लाइब्रेरी लिख रहा हूं (हाँ, इसका होमवर्क :) और सभी प्रतिपादन और गणनाओं को तेजी से करने के लिए cuda का उपयोग करें।CUDA

मुझे भरे त्रिकोणों के साथ समस्या है। मैंने इसे इस तरह लिखा है कि एक प्रक्रिया एक त्रिकोण खींचती है। जब दृश्य पर बहुत सारे छोटे त्रिकोण होते हैं तो यह बहुत बढ़िया काम करता है, लेकिन जब त्रिकोण बड़े होते हैं तो यह पूरी तरह प्रदर्शन को तोड़ देता है।

मेरा विचार दो पास करना है। पहले स्कैनलाइन के बारे में जानकारी के साथ केवल टैब की गणना करें (यहां से यहां तक ​​खींचे जाएं)। यह वर्तमान एल्गोरिदम में प्रति प्रक्रिया गणना त्रिकोण होगा। और दूसरे पास में वास्तव में प्रति त्रिकोण से एक से अधिक प्रक्रियाओं के साथ स्कैनलाइन को आकर्षित करें।

लेकिन क्या यह पर्याप्त तेज़ होगा? शायद कुछ बेहतर समाधान है?

उत्तर

3

आप यह blog: CUDA में एक सॉफ्टवेयर रेंडरिंग पाइपलाइन देख सकते हैं। मुझे नहीं लगता कि यह करने का सबसे अच्छा तरीका है, लेकिन कम से कम लेखक कुछ उपयोगी स्रोत साझा करता है।

दूसरा, यह paper: एक प्रोग्राम करने योग्य, समांतर रेंडरिंग आर्किटेक्चर पढ़ें।मुझे लगता है कि यह सबसे हालिया पेपर में से एक है और यह भी CUDA आधारित है।

यदि मैं यह करना ही था, मैं एक डेटा समानांतर Rasterization पाइपलाइन साथ की तरह Larrabee (जो TBR है) या यहां तक ​​कि Reyes के CUDA के पास जाकर अनुकूलन होगा यह:

http://www.ddj.com/architect/217200602 http://home.comcast.net/~tom_forsyth/larrabee/Standford%20Forsyth%20Larrabee%202010.zip (देखना प्रस्तुति के दूसरे भाग)

http://graphics.stanford.edu/papers/mprast/

0

मुझे संदेह है कि आपको सीयूडीए के बारे में कुछ गलत धारणाएं हैं और इसका उपयोग कैसे किया जाए, खासकर जब आप "प्रक्रिया" का संदर्भ लें, जब सीयूडीए शब्दावली में, ऐसी कोई बात नहीं है।

अधिकांश सीयूडीए अनुप्रयोगों के लिए, अच्छे प्रदर्शन के लिए दो महत्वपूर्ण चीजें हैं: मेमोरी एक्सेस को अनुकूलित करना और सुनिश्चित करना कि प्रत्येक 'सक्रिय' CUDA थ्रेड एक वार्प में एक ही ऑपरेशन करता है, उसी समय ओपेर सक्रिय धागे के रूप में एक ही ऑपरेशन करता है। इन दोनों ध्वनि की तरह वे आपके आवेदन के लिए महत्वपूर्ण हैं।

अपनी मेमोरी एक्सेस को अनुकूलित करने के लिए, आप यह सुनिश्चित करना चाहते हैं कि वैश्विक मेमोरी से आपका पठन और वैश्विक मेमोरी पर आपके लेखन को समेकित किया गया हो। आप सीयूडीए प्रोग्रामिंग गाइड में इसके बारे में और अधिक पढ़ सकते हैं, लेकिन इसका अनिवार्य रूप से मतलब है, आधा वार में आसन्न थ्रेड को आसन्न स्मृति स्थानों से पढ़ना या लिखना चाहिए। साथ ही, प्रत्येक थ्रेड को एक समय में 4, 8 या 16 बाइट्स को पढ़ना या लिखना चाहिए।

यदि आपकी मेमोरी एक्सेस पैटर्न यादृच्छिक है, तो आपको बनावट मेमोरी का उपयोग करने पर विचार करना पड़ सकता है। जब आपको किसी ब्लॉक में अन्य थ्रेड द्वारा पढ़ी गई स्मृति को संदर्भित करने की आवश्यकता होती है, तो आपको साझा स्मृति का उपयोग करना चाहिए।

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

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

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

इसके अलावा, मैं दृढ़ता से सीयूडीए के बारे में और अधिक पढ़ने की सिफारिश करता हूं क्योंकि ऐसा लगता है कि आप कुछ मूलभूत बुनियादी सिद्धांतों की अच्छी समझ के बिना गहरे अंत में कूद रहे हैं।

+1

मेरी भाषा के बारे में क्षमा करें, अंग्रेजी मेरा मूल नहीं है। तो ग्राफिक्स कार्ड पर प्रसंस्करण के लिए उचित शब्दावली क्या है? ठीक है, मुझे लगता है कि मैं कूडा को बहुत अच्छा समझता हूं, लेकिन हां, मेरे पास समांतर-एल्गोरिदम में ज्ञान की कमी है। मेरा इनपुट क्लिपिंग स्पेस में वर्टेक्स का सेट है, और मुझे त्रिकोण खींचना पड़ा। मुझे लगता है कि एल्गोरिदम जहां हर पिक्सेल को प्रत्येक त्रिभुज की जांच करनी चाहिए वह इष्टतम नहीं होगा। – qba

+0

प्रत्येक पिक्सेल जांच से बचें प्रत्येक त्रिकोण को बीवीएच, केडी-ट्री या आर-ट्री का उपयोग करके अपने त्रिकोणों को विभाजित करके किया जा सकता है। – whatnick

-1

नहीं अशिष्ट होना करने के लिए, लेकिन यह क्या ग्राफिक्स कार्ड वैसे भी करने के लिए तैयार कर रहे हैं नहीं है? लगता है कि मानक ओपनजीएल और डायरेक्ट 3 डी एपीआई का उपयोग करने से अधिक समझदारी होगी।

क्यों सीयूडीए की बजाय अपने मूल प्रतिपादन करने के लिए एपीआई का उपयोग नहीं करते हैं, जो बहुत कम स्तर है? फिर, यदि आप अतिरिक्त संचालन करना चाहते हैं जो समर्थित नहीं हैं, तो आप उन्हें शीर्ष पर लागू करने के लिए CUDA का उपयोग कर सकते हैं। या शायद उन्हें शेडर्स के रूप में लागू करें।

+0

हां, हां वास्तव में। लेकिन पारंपरिक लक्ष्य के बिना यहां उनका लक्ष्य ग्राफिक रास्टरराइजेशन पाइपलाइन बनाना है। इसे अवधारणा या शैक्षणिक उद्देश्य परियोजना के प्रमाण के रूप में सोचें। – Stringer

+0

हां मेरी पढ़ाई के लिए यह परियोजना। हमें अपने आप को सभी रास्टरराइजेशन करना था। अधिकांश लोग सीपीयू का उपयोग करते हैं, लेकिन मैंने सीयूडीए का उपयोग करने का फैसला किया। – qba

+0

हम्म, उस स्थिति में यह एक दिलचस्प परियोजना की तरह लगता है। एक बैक-एस्सारवर्ड दृष्टिकोण की तरह, लेकिन फिर भी दिलचस्प है। – BobMcGee