2010-12-30 20 views
10

मुझे मैट्रिक्स पर गुणा करने की आवश्यकता है। मैं एक पुस्तकालय की तलाश में हूं जो इसे तेजी से कर सकता है। मैं विजुअल सी ++ 2008 कंपाइलर का उपयोग कर रहा हूं और मेरे पास कोर i7 860 है इसलिए यदि लाइब्रेरी को मेरी कॉन्फ़िगरेशन के लिए अनुकूलित किया गया है तो यह सही है।मैट्रिक्स परिचालनों के लिए एक अच्छी सी ++ लाइब्रेरी क्या है

+2

LAPACK + BLAS (यदि नहीं यह तेजी से नहीं है) सबसे बातें –

उत्तर

5

Eigen में देखें। आपको इसकी ज़रूरत होनी चाहिए।

+0

किया यह धागे का उपयोग करता है हो जाता है? – Yttrill

+0

ईजिन छोटे matrices पर केवल अच्छा है। यह बड़े matrices के लिए धागे का उपयोग नहीं करता है। लेकिन यह उपलब्ध होने पर एसएसई 2 का उपयोग करता है। –

+0

खैर, उनका स्वयं का बेंचमार्क अलग दिखाता है ... हेक, थ्रेडिंग को ब्लॉक उत्पादों को लागू करके लागू किया जा सकता है यदि आपको वास्तव में इसकी आवश्यकता है। – rubenvb

3

मुझे बूस्ट के uBLAS के साथ अच्छा अनुभव रहा है। यदि आप बूस्ट का उपयोग कर रहे हैं तो यह एक अच्छा विकल्प है।

+0

क्या यह धागे का उपयोग करता है (यदि यह तेज़ नहीं है)? – Yttrill

+2

यह आपके सिस्टम पर स्थापित बीएलएएस लाइब्रेरी का उपयोग करता है। इंटेल एक प्रदान करता है जो धागे और वेक्टर निर्देशों का उपयोग करता है: इंटेल एमकेएल के लिए Google। हालांकि यह मुफ्त नहीं है। –

+0

मुझे बूस्ट के यूब्लास के साथ वास्तव में एक भयानक अनुभव हुआ है। यह पूरी तरह से अनजान और पता लगाने में मुश्किल है। उदाहरण के लिए, मुझे कैसे पता होना चाहिए कि वेक्टर-मैट्रिक्स गुणा 'prod() 'का उपयोग करके किया जाता है - क्यों' * 'ऑपरेटर नहीं? इसके अलावा, मैं दो वैक्टरों को गुणा भी नहीं कर सकता। –

1

आप GNU Scientific Library(GSL) का उपयोग कर सकते हैं।

यहाँ गुणा सहित एक पेज पुस्तकालय में मैट्रिक्स उपलब्ध संचालन का वर्णन है, (gsl_matrix_mul_elements()):

http://www.gnu.org/software/gsl/manual/html_node/Matrix-operations.html

और यहाँ कुछ लिंक प्राप्त करने के लिए आप दृश्य स्टूडियो के साथ GSL का उपयोग कर के साथ शुरू कर रहे हैं:

http://gladman.plushost.co.uk/oldsite/computing/gnu_scientific_library.php

http://www.quantcode.com/modules/smartfaq/faq.php?faqid=33

+0

वास्तव में? एमएसवीसी ++ पर जीएनयू कोड संकलित? मेरा मतलब है कि यदि आप वास्तव में प्रदर्शन प्राप्त करना चाहते हैं तो आप एटलस आधारित बीएलएएस का उपयोग करेंगे, लेकिन मुझे संदेह है कि यह विंडोज पर निर्माण करना आसान होगा .. :) – Yttrill

+0

http://math-atlas.sourceforge.net/errata.html# gccCrazy –

-1

शायद इसे स्वयं लागू करने का एक विकल्प है, शायद std :: valarray का उपयोग कर क्योंकि इसे ओपनएमपी का उपयोग करके समांतर किया जा सकता है: gcc निश्चित रूप से ऐसा संस्करण है, एमएसवीसी ++ शायद भी करता है।

अन्यथा, निम्नलिखित चालें: मैट्रिक्स में से एक को स्थानांतरित किया जाना चाहिए। तो फिर तुम है:

एबी [i, j] = योग (के) एक [मैं, k] बी टी^[j, k]

जहां सन्निहित स्मृति स्कैनिंग कर रहे हैं। यदि आपके पास 8 कोर हैं तो आप [i, j] इंडेक्स के सेट को 8 में आसानी से विभाजित कर सकते हैं, और कुल नौकरी के प्रत्येक कोर 1/8 को दे सकते हैं। इसे और भी तेज बनाने के लिए आप वेक्टर गुणा निर्देशों का उपयोग कर सकते हैं, अधिकांश कंपाइलर इसके लिए एक विशेष कार्य प्रदान करेंगे। नतीजा एक ट्यूनेड लाइब्रेरी जितना तेज़ नहीं होगा लेकिन यह ठीक होना चाहिए।

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

+3

मैट्रिक्स संचालन को कभी भी लागू न करें। एक बीएलएएस कार्यान्वयन का प्रयोग करें। –

1

यह वैज्ञानिक पुस्तकालयों के साथ रेस में भाग नहीं सकते हैं, लेकिन दृश्य ग के साथ ++ यह हाथ में है

#include <windows.h> 
#include <gdiplus.h> 
#pragma comment (lib,"Gdiplus.lib") 
using namespace Gdiplus; 

int main() 
{ 
    ULONG_PTR gpToken = 0; 
    GdiplusStartup(&gpToken, &GdiplusStartupInput(), NULL); 
    //lib inited 

    Matrix A; 
    A.Translate(10,20); 

    Matrix B; 
    B.Rotate(35.0); 

    A.Multiply(&B); 
    if (A.IsInvertible()) 
     A.Invert(); 
    if (!A.IsIdentity()) 
     A.RotateAt(120.0, PointF(10,10)); 

    //getting values 
    REAL elements[6]; 
    A.GetElements(elements); 

    //lib stopped 
    GdiplusShutdown(gpToken); 
    return 0; 
} 
तो इस के साथ

आप आसानी से (Windows पर)

GdiPlus Matrix Documentation

आव्यूह गुणन बाधा ले जा सकते हैं
6

बीएलएएस सभी मूल रैखिक बीजगणित संचालन (अनिवार्य रूप से matrices और वैक्टर के गुणा) के लिए एक वास्तविक फोरट्रान मानक है। कई कार्यान्वयन उपलब्ध हैं। उदाहरण के लिए:

  • एटलस निःशुल्क और माना जाता है कि स्वयं अनुकूलन है। यद्यपि आपको इसे स्वयं संकलित करने की आवश्यकता है।
  • गोटो बीएलएएस को टीएसीसी में काज़ुशीज गोटो द्वारा बनाए रखा जाता है। वह आधुनिक प्रोसेसर से आखिरी प्रदर्शन थोड़ा सा पाने में बहुत अच्छा है। यह केवल अकादमिक उपयोग के लिए है।
  • इंटेल एमकेएल इंटेल प्रोसेसर के लिए अनुकूलित बीएलएएस प्रदान करता है। अकादमिक उपयोग के लिए भी यह मुफ़्त नहीं है।

फिर, आप एक सी ++ रैपर का उपयोग करना चाह सकते हैं, उदाहरण के लिए boost::ublas

यदि आप वितरित सिस्टम पर प्रोग्राम करते हैं, तो पीबीएलएएस और स्काल्पैक हैं जो वितरित रैखिक बीजगणित संचालन के लिए संदेश भेजने के उपयोग को सक्षम करते हैं। एक मल्टीकोर मशीन पर, आमतौर पर बीएलएएस (कम से कम इंटेल एमकेएल) के कार्यान्वयन बड़े पर्याप्त मैट्रिक्स के लिए धागे का उपयोग करते हैं।

यदि आप अधिक उन्नत रैखिक बीजगणित दिनचर्या (eigenvalues, रैखिक प्रणाली, कम से कम वर्ग, ...) चाहते हैं, तो अन्य वास्तव में फोरट्रान मानक LAPACK है। मेरे ज्ञान के लिए, नंगे फोरट्रान दिनचर्या को कॉल करने के अलावा सी ++ के साथ सुंदरता को एकीकृत करने के लिए कुछ भी नहीं है। फोरट्रान कॉल को छिपाने के लिए आपको कुछ रैपर लिखना होगा और एक ध्वनि प्रकार-जांच कार्यान्वयन प्रदान करना होगा।

7

एफडब्ल्यूआईडब्ल्यू, ईजिन 3 मैट्रिक्स उत्पादों के लिए धागे (ओपनएमपी) का उपयोग करता है (ईगिन के बारे में ऊपर दिए गए बयान के जवाब में धागे का उपयोग नहीं करते हैं)।

0

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

http://code.msdn.microsoft.com/Using-ScaLAPACK-on-Windows-d16a5e76#content

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