2010-05-31 14 views
7

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

मैट्रिक्स अपेक्षाकृत छोटा है, केवल 60-100 पंक्तियों और कोल्स, इसलिए इसे सीपीयू पर तेजी से गणना की जा सकती है, लेकिन इसका उपयोग एल्गोरिदम के बीच में थोड़ा होता है, इसलिए मुझे इसे मेजबान, गणना करने के लिए स्थानांतरित करना होगा उलटा, और उसके बाद परिणाम को डिवाइस पर वापस स्थानांतरित करें जहां इसे तब बहुत बड़ी गणनाओं में उपयोग किया जाता है।

+0

आपको यह भी ध्यान रखना चाहिए कि एक मैट्रिक्स को बदलना एक महंगी ऑपरेशन हो सकता है, खासतौर से बड़ी मैट्रिक्स के लिए, और अक्सर समस्या को हल करने का एक वैकल्पिक तरीका होता है। LU decomposition एक "बिल्डिंग ब्लॉक" है जिसका उपयोग वास्तविक उलटा करने से बचने के लिए किया जा सकता है। – Tom

उत्तर

5

मेरे पास ओपन सीएल में कोई कार्यान्वयन नहीं है, लेकिन "Numerical Recipes" और गिल स्ट्रैंग के "Into to Applied Math" में अद्भुत स्पष्टीकरण हैं जो कोड के लिए आसान होंगे। "एनआर" में सी कोड है जिसे आप अनुकूलित कर सकते हैं।

उलटा

यह गलत है की गणना। आप LU decomposition के साथ एक उलटा गणना नहीं कर रहे हैं, आप मैट्रिक्स को विघटित कर रहे हैं। यदि आप उलटा चाहते थे, तो आपको इकाई वैक्टर की एक श्रृंखला के साथ प्रतिस्थापन वापस करना होगा। यह एक छोटा लेकिन महत्वपूर्ण अंतर है।

11

ViennaCL पर देखो: http://viennacl.sourceforge.net/

+0

यही वही था जो मैं चाहता था। एकमात्र पकड़ यह है कि LU कारक के लिए कर्नेल पिवोटिंग का उपयोग नहीं करते हैं, इसलिए उनके प्रदर्शन कुछ इनपुट के लिए खराब और संख्यात्मक रूप से अस्थिर हो सकते हैं। – buchtak

1

मैं जानता हूँ कि इस की देर तरह है, लेकिन आप एक मैट्रिक्स है कि उस पर किसी भी मैट्रिक्स गणना करने के लिए कोशिश कर रहे हैं, तो छोटी (60-100 पंक्तियां), तो जीपीयू की बजाय सीपीयू पर कंप्यूशन बहुत तेजी से होने जा रहे हैं क्योंकि मुख्य स्मृति से सूचना को जीपीयू की स्मृति में कॉपी करने के लिए समय लगता है। यदि आप ऐसा करना चाहते हैं, तो मैं ओपनएमपी या एमपीआई जैसी समांतर भाषा का उपयोग करने का सुझाव दूंगा क्योंकि इससे आप सीपीयू पर गणना को तेज करने के लिए अपने कोड को समानांतर करने की अनुमति देंगे।

0

मूल प्रश्न (अब 7 साल पुराना) वास्तव में 412 बाद में paper describing matrix inversion in CUDA based on Gauss-Jordan में हल किया गया था। यह विभिन्न धागे में गणना को वितरित करने का प्रयास करता है, और आकार में 2048 तक मैट्रिस के लिए विस्तृत प्रदर्शन संकेत देता है।

ओपनसीएल नहीं होने पर, सामान्य विचार सीयूडीए से आसानी से अनुवाद करेंगे।

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