2010-10-18 16 views
10

मैं सी ++ के लिए उच्च प्रदर्शन बहु-आयामी सरणी पुस्तकालयों/कक्षाओं के बारे में सलाह ढूंढ रहा हूं। क्या मैं सच में की जरूरत है:उच्च प्रदर्शन सी ++ बहु आयामी सरणी

  • गतिशील रूप से एक आकार रन-टाइम में निर्धारित साथ सरणियों आवंटित करने की क्षमता

  • पहुँच सकते हैं और एक सरणी मूल्यों (तेज)

  • को संशोधित करने की क्षमता array1 = array2 + 2 * array3

  • एक अच्छी तरह से बनाए पुस्तकालय के रूप में सरल सरणी अंकगणित इस तरह का उपयोग कर सकेंगे

मैं विभिन्न पुस्तकालयों भर में आ गए हैं, जिनमें शामिल हैं:

  • Blitz++, जो लग रहा है मैं वास्तव में क्या जरूरत है, लेकिन जो बहुत अच्छी तरह से बनाए प्रतीत नहीं होता है (नवीनतम स्थिर रिलीज 5 साल पहले किया गया था)

  • Boost, जो सरणी अंकगणितीय का समर्थन नहीं करता है, और ब्लिट्ज ++ कहने की तुलना में काफी धीमी प्रतीत होता है।

  • जोन बोमन का array.h जिसमें कोई प्रलेखन नहीं है।

क्या किसी के पास उपरोक्त विकल्पों के बारे में कोई अन्य सुझाव या टिप्पणी है?

+0

उत्तर के लिए धन्यवाद। बस स्पष्ट करने के लिए, मुझे रैखिक बीजगणित में रुचि नहीं है, केवल सरणी कंटेनर और सरल अंकगणितीय परिचालन। – astrofrog

उत्तर

0

शायद बीएलएएस जैसे पुस्तकालय, एक सीबीएलएएस मौजूद है, लेकिन याद नहीं है।

http://www.netlib.org/blas/

2
  • uBlas, बूस्ट का एक हिस्सा। यह पूर्ण बीएलएएस स्तर 1-3 प्रदान करता है, और इसलिए सरणी अंकगणितीय कार्यों के बहुत सारे हैं।
  • Armadillo भी एक सी ++ रैखिक बीजगणित पुस्तकालय प्रतीत होता है, जहां तक ​​मैं वैकल्पिक रूप से LAPACK/एटलस का उपयोग कर सकता हूं (जो निश्चित रूप से इसे तेजी से तेज़ बनाता है)।
  • GNU Scientific Library पूर्ण ब्लास प्रदान करता है। मुझे नहीं पता कि यह कितना तेज़ है, या यदि यह लैपैक/एटलस का उपयोग कर सकता है।
  • यदि आपको अपनी सूची के मुकाबले और अधिक फैंसी की आवश्यकता नहीं है, तो आप एटलस 'बीएलएएस स्वयं के लिए आसानी से लपेट सकते हैं। लेकिन अगर आपको ऐसा करने की ज़रूरत नहीं है तो शायद आप पहिया को फिर से शुरू नहीं करना चाहते हैं।
3

बेंचमार्क, here सहित व्यापक और अपेक्षाकृत हालिया सर्वेक्षण है।

मेरा मानना ​​है कि आप Boost.UBlas को LAPACK या Intel MKL जैसे अंतर्निहित संख्यात्मक पुस्तकालयों को बाध्य करके बढ़ा सकते हैं, लेकिन ऐसा नहीं किया है।

fwiw, जो कार्यान्वयन अक्सर उम्मीदवारों के रूप में आने वाले प्रत्यारोपण Boost.UBlas और MTL हैं। यह मेरा अनुभव है कि व्यापक गोद लेने के चलते समर्थन और विकास को बढ़ावा देने की अधिक संभावना है।

4

Eigen बेहद अच्छी तरह से बनाए रखा गया है (अभी, कम से कम, हर महीने नए संस्करण आ रहे हैं) और आपको आवश्यक अन्य परिचालनों का समर्थन करता है।

+2

ईजिन बहुआयामी सरणी का समर्थन नहीं करता प्रतीत होता है। – Ran

+3

ईजिन (मास्टर) में अब एक पूर्ण विशेषीकृत टेंसर लाइब्रेरी (बहु-आयामी सरणी) है – iNFINITEi

0

एक प्रदर्शन परिप्रेक्ष्य से, मैंने boost :: MultiArray और Armadillo को बढ़ावा देने की कोशिश की है। न तो तेज थे, दोनों में सरणी या वैक्टर की तुलना में धीमी पहुंच का समय था, और मैं इन पैकेजों को x1 (4:10) = x2 (1: 6) + x2 (2: 7) जैसे ऑपरेशन में हरा सकता था। + x2 (3: 8) एक साधारण हाथ-कोडित पाश का उपयोग करके (मेरे कंपाइलर के अनुकूलन की सहायता से, मुझे यकीन है)। जब आप मैट्रिक्स गुणा में आते हैं, तो ये पैकेज LAPACK और BLAS के माध्यम से कुछ लाभ प्रदान कर सकते हैं लेकिन आप हमेशा उन इंटरफेस का उपयोग अपने आप कर सकते हैं।

0
चेतावनी है कि इस बेशर्म स्वयं को बढ़ावा देने है साथ

,

https://github.com/ndarray/ndarray

में देख लायक हो सकता है।

हालांकि यह अनुकूलित गणितीय ऑपरेटरों को प्रदान नहीं करता है, यह इसके लिए ईजिन को एक इंटरफ़ेस प्रदान करता है। जहां यह वास्तव में खड़ा है, वह SWIG या Boost.Python के माध्यम से पाइथन/NumPy के साथ अंतःक्रियाशीलता प्रदान करने में है।

0

इसके अलावा एक और बेशर्म स्वयं को बढ़ावा देने,

https://github.com/dwwork/FortCpp/

मैं GitHub पर इस समस्या को अप करने के लिए अपने स्वयं के व्यक्तिगत समाधान पोस्ट किया है। मैं किसी भी खिंचाव से सी ++ विशेषज्ञ नहीं हूं, लेकिन मैंने सोचा कि मैं इसे कम से कम वहां फेंक दूंगा।

2

Necomi आपको जो सुविधाएं पसंद हैं उन्हें प्रदान करने लगती हैं।

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

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