2015-04-05 5 views
5

में कई निश्चित आकार के मैट्रिक्स के साथ काम करना मैं मैट्रिक्स इनवर्जन और इगेंडेकंपोजिशन जैसी चीजें कर रहा हूं, 4000 फिक्स्ड-साइज (3x3, 4x4) मैट्रिस के बारे में काम करने के लिए देख रहा हूं।सीयूडीए कर्नेल

ऐसा लगता है कि यह समानांतर करने का सबसे अच्छा तरीका है कि यह कई GPU धागे समस्या के एक उदाहरण पर काम करने दें।

क्या ऐसा करने का कोई उचित तरीका है? मैंने पढ़ा है: http://www.culatools.com/blog/2011/12/09/batched-operations/ लेकिन जहां तक ​​मैं कह सकता हूं, यह हमेशा ऐसा कुछ है जो दृष्टि में कोई समाधान नहीं होने पर "काम किया जा रहा है"। तीन साल बाद, मुझे आशा है कि एक अच्छा समाधान होगा।

अब तक, मैं पर ध्यान दिया है:

  • CUDA कर्नेल में Eigen का उपयोग करना: http://eigen.tuxfamily.org/dox-devel/TopicCUDA.html। लेकिन यह अपने बचपन में है: इस प्रकार, यह अच्छी तरह से काम नहीं कर रहा है और कुछ चीजें लागू नहीं की गई हैं। इसके अलावा, मुझे यकीन नहीं है कि यह CUDA के लिए अनुकूलित है या नहीं। लगभग कोई दस्तावेज नहीं है और कोड का एकमात्र उदाहरण एक परीक्षण फ़ाइल है (eigen/test/cuda_basic.cu)। जब मैंने कुडा कर्नेल में ईजिन का उपयोग करने की कोशिश की, तो कर्नेल में Eigen::MatrixXf घोषित करने जैसी साधारण चीजें nvcc V7.0.27 और ईजिन 3.2.90 (मर्कुरियल) के साथ संकलन में नहीं टिकीं।
  • एक कर्नेल के भीतर बीएलएएस दिनचर्या चलाने के लिए cuBLAS डिवाइस API लाइब्रेरी का उपयोग करना। ऐसा लगता है कि क्यूब्ला और इसके जैसे छोटे मैट्रिस के लिए समानांतर होने के लिए लिखा गया है, जो कि 3x3 और 4x4 मैट्रिक्स के लिए अधिक धीमी और धीमी गति से प्रतीत होता है। मुझे भी यकीन नहीं है कि क्यूब्ला जैसी कुछ भी है जो भी कर सकती है eigendecomposition या एसवीडी। (जहां तक ​​मुझे पता है, CULA अपने दिनचर्या को कर्नल के भीतर से कॉल करने का समर्थन नहीं करता है)।
  • सीयूडीए धाराओं का उपयोग कर बैच प्रसंस्करण कर्नेल। CUDA टूलकिट v7.0 के लिए CUBLAS दस्तावेज़ के खंड 2.1.7 "बैचिंग कर्नेल" में, यह सुझाव दिया गया है। लेकिन "" अभ्यास में 16 से अधिक समवर्ती कर्नेल एक ही समय में निष्पादित करना संभव नहीं है "और इसके परिणामस्वरूप यह 4000 छोटी मैट्रिक्स को संसाधित करने के लिए भयानक होगा। कूला ब्लॉग पोस्ट के उपर्युक्त लिंक में, मैंने उद्धृत किया, "" एक सिद्धांत में, प्रति समस्या एक सीयूडीए स्ट्रीम का उपयोग कर सकता है और एक समय में एक समस्या लॉन्च कर सकता है। यह दो कारणों से बीमार प्रदर्शन करेगा। पहला यह है कि प्रति ब्लॉक धागे की संख्या बहुत कम होगी; [...] दूसरा यह है कि हजारों परिचालनों को लॉन्च करके ओवरहेड इस तरह से अस्वीकार्य होगा, क्योंकि लॉन्च कोड उतना महंगा है (यदि अधिक महंगा नहीं है) बस प्रदर्शन के रूप में सीपीयू पर मैट्रिक्स। ""
  • कर्नेल में अपने स्वयं के मैट्रिक्स गुणा और eigendecomposition कार्यान्वित। यह बहुत धीमी होने की संभावना है, और इसके अलावा लागू करने के लिए समय लेने वाला हो सकता है।

इस बिंदु पर मैं GPU पर ऐसा करने के लिए छोड़ने का लुत्फ उठा रहा हूं। यह एक दयालुता है, क्योंकि मैं एक एल्गोरिदम के लिए वास्तविक समय प्रदर्शन की उम्मीद कर रहा था जिसके लिए 4000 3x3 मैट्रिक्स को हर 0.1 सेकंड में लगभग 100 गुना बदलने की आवश्यकता होती है।

+0

मुझे एक ही समस्या है: कई छोटे 3x3 मैट्रिक्स के लिए ईजिन विश्लेषण। कुछ जीपीयू समाधान देखना अच्छा लगेगा। अच्छा लेख। –

उत्तर

3

Cublas getrfBatched फ़ंक्शन और getriBatched छोटे matrices के बैच उलटा के लिए डिज़ाइन किए गए हैं। यह गतिशील समांतरता या धाराओं (आपके दूसरे और तीसरे दृष्टिकोण) से भी तेज होना चाहिए। source code form में बैच सॉल्वर भी उपलब्ध है जो मैट्रिक्स इनवर्जन कर सकता है। इस लिंक तक पहुंचने के लिए आपको developer.nvidia.com पर एक पंजीकृत डेवलपर के रूप में लॉग इन करने की आवश्यकता होगी।

इसके अलावा, मुझे यकीन नहीं है कि क्यूब्लास जैसी कोई चीज है जो ईइजेंडेकंपोशन या एसवीडी भी कर सकती है। (जहां तक ​​मुझे पता है, CULA अपने दिनचर्या को कर्नल के भीतर से कॉल करने का समर्थन नहीं करता है)।

Cusolver कुछ eigen solver functions प्रदान करता है।हालांकि उन्हें डिवाइस कोड से बैच नहीं किया जाता है और न ही कॉल करने योग्य होता है, इसलिए आप धाराओं के साथ एकमात्र विकल्प के रूप में सामना कर रहे हैं।

संबंधित मुद्दे