2012-05-03 14 views
5

लिखने के लिए मैं सी ++ लाइब्रेरी ईजिन से बहुत प्रभावित हूं जो मैट्रिक्स/वेक्टर गणना में भारी गति प्राप्त करने के लिए अभिव्यक्ति टेम्पलेट का उपयोग करता है।रैला एलजीएस रैखिक बीजगणित लिब

मैं इस पुस्तकालय को स्कैला में क्लोन करना चाहता हूं। जहां तक ​​मुझे पता है कि स्केलस टाइप सिस्टम इस तरह कुछ करने के लिए पर्याप्त शक्तिशाली नहीं है, लेकिन यह संभव हल्के मॉड्यूलर स्टेजिंग एलएमएस होना चाहिए। वहां कई परियोजनाएं प्रतीत होती हैं (प्रसन्नता, वर्चुअलाइजेशन-एलएमएस, आदि)। विश्वसनीयता और प्रदर्शन के मामले में इस तरह के प्रोजेक्ट के लिए उपयोग करने का अधिकार कौन सा होगा?

धन्यवाद

संपादित करें: मैं सिर्फ स्केला 2.10 में मैक्रोज़ बारे में जाना। हो सकता है कि मैं यहां उपयोग करना चाहता हूं।

@ ओम-nom-nom

महत्वपूर्ण हिस्सा http://eigen.tuxfamily.org/dox/TopicInsideEigenExample.html

उदाहरण से समझाया गया है बताते हैं कि एक वेक्टर अलावा

u = v + w 

एक के बाद में (देशी) सी ++ अच्छा प्रदर्शन है अस्थायी चर जोड़ा गया है और यह चर आपको

for(int i = 0; i < size; i++) tmp[i] = v[i] + w[i]; 
for(int i = 0; i < size; i++) u[i] = tmp[i]; 
के रूप में असाइन किया गया है

Eigen टेम्पलेट metaprogramming (ऊपर के लिंक में कदम से समझाया कदम) का उपयोग करता है

for(int i = 0; i < size; i++) u[i] = v[i] + w[i]; 

जो स्पष्ट रूप से तेजी से होता है और एक अतिरिक्त चर की जरूरत नहीं है करने के लिए संकलन समय पर इस कम करने के लिए।

+0

यदि आप शीघ्र ही अभिव्यक्ति टेम्पलेट्स के तंत्र का वर्णन करते हैं, तो यह मदद कर सकता है। –

उत्तर

1

सही ढंग से इस सवाल का जवाब करने के लिए, आप अपने आप को अतिरिक्त सवाल पूछने की जरूरत है:

  1. क्या तुम सच में लगता है कि सी ++ टेम्पलेट के साथ कोड स्काला कोड तुलना में बेहतर प्रदर्शन कर रहे हैं? मॉडर्न बेंचमार्क दिखाता है कि जावा मैट्रिक्स इनवर्जन पर सी ++ से तेज है। यह मुख्य रूप से वीएम में सुधार के साथ-साथ एचडब्ल्यू में भी है।

  2. अप्रबंधित स्मृति, लटकने वाले पॉइंटर्स से निपटने की बढ़ी हुई लागत और सी ++ में कोडिंग के कारण बढ़ी हुई त्रुटियों और बग की तुलना में तेज़ मैट्रिक्स टूल के द्वारा आपको कितने व्यवसाय लाभ प्राप्त होंगे?

  3. यदि समस्या को छोटे पैमाने पर स्कैला में संतोषजनक प्रदर्शन के साथ हल किया जा सकता है, और अंतर केवल उच्च स्तर पर महत्वपूर्ण हो जाते हैं, तो विभिन्न कार्यों में समस्या (मैट्रिक्स/वेक्टर गुणा) को विभाजित करने के लिए उचित नहीं होगा जिसे समानांतर में निष्पादित किया जा सकता है?

व्यक्तिगत टिप्पणी: मैं यहोशू बलोच, सबसे प्रभावशाली जावा डेवलपर्स कभी और प्रभावी जावा के लेखक से एक के साथ कुछ ईमेल विचार विमर्श किया, और उसने मुझे (ब्रायन Goletz द्वारा एक दिलचस्प प्रस्तुति के लेखक की ओर इशारा किया गया है अभ्यास में जावा कन्करेंसी और जावा दुनिया में बहुत प्रभावशाली रूप में अच्छी तरह): Not Your Father's Von Neumann Machine: A Crash Course in Modern Hardware


यदि आप निष्कर्ष है कि लाभ है और इस महत्वपूर्ण है, और है कि भविष्य में आपकी समस्या siz विकसित नहीं होगा तो वाई कहां बहु-कोर निष्पादन के लाभ की आवश्यकता नहीं होगी, आपको शायद सी ++ में रहने की आवश्यकता है। दूसरे मामले में, स्कैला मैक्रोज़ पर एक नज़र डालें, जो 2.10-एम 3 के बाद उपलब्ध हैं।

* अतिरिक्त: इंटरमीडिएट वैरिएबल से परहेज करना वास्तव में समझ में नहीं आता है जब जावा या सी # जैसे वीएम के शीर्ष पर चलने वाली भाषाओं का उपयोग करते समय वास्तव में समझ में नहीं आता है। असल में, जैसा कि आपने सही ढंग से वर्णित लेख के रूप में बताया है, JVM के साथ जेवीएम ने जावा बाइटकोड को असेंबलर में कैसे अनुवाद किया है, इस बारे में एक निश्चित खतरा है। हाथ से चलने वाले ऑप्टिमाइज़ेशन में से कई पहले से ही जेवीएम द्वारा लागू किए जा चुके हैं, और यदि आप घोषणा विधियों और वैरिएबल फाइनल का सावधानी बरतते हैं तो इनमें से अधिकतर तर्क बेकार है। *

+0

आपकी टिप्पणी के लिए धन्यवाद। वास्तव में प्रश्न है कि सी ++ जावा से अभी भी तेज है। [लिंक] (https://github.com/mikiobraun/jblas/wiki/Java-Native-Code-Background) कुछ संकेत देता है, और मैग्मा जैसी परियोजनाएं हैं जिनका उपयोग जेएनआई का उपयोग करके किया जा सकता है। हालांकि, मेरा प्रश्न अलग है। यह अस्थायी चर और अनावश्यक गणना से बचने के बारे में अधिक है (उदाहरण के लिए पहचान मैट्रिक्स के साथ गुणा करना)। –