जावा मैट्रिक्स गणित पुस्तकालयों का प्रदर्शन? [बन्द है]


151

हम ऐसी चीज़ की गणना कर रहे हैं जिसका रनटाइम मैट्रिक्स ऑपरेशंस से बंधा है। (नीचे कुछ विवरण यदि दिलचस्पी है।) इस अनुभव ने निम्नलिखित प्रश्न का संकेत दिया:

मैट्रिक्स गणित के लिए जावा पुस्तकालयों के प्रदर्शन के साथ क्या लोगों के पास अनुभव है (जैसे, गुणा, उलटा, आदि)? उदाहरण के लिए:

मैंने खोजा और कुछ नहीं मिला।


हमारी गति तुलना का विवरण:

हम Intel FORTRAN (ifort (IFORT) 10.1 20070913) का उपयोग कर रहे हैं। हमने इसे Apache commons math 1.2 मैट्रिक्स ऑप्स का उपयोग करके जावा (1.6) में पुन: लागू किया है, और यह सटीकता के अपने सभी अंकों से सहमत है। (जावा में इसे चाहने के हमारे पास कारण हैं।) (जावा युगल, फोरट्रान वास्तविक * 8)। फोरट्रान: 6 मिनट, जावा 33 मिनट, एक ही मशीन। RealMatrixImpl में jvisualm प्रोफाइलिंग का बहुत अधिक समय व्यतीत होता है। {getEntry, isValidCoordinate} (जो अप्राप्य अपाचे कॉमन्स गणित 2.0 में चला जाता है, लेकिन 2.0 कोई तेज़ नहीं है)। फोरट्रान एटलस BLAS रूटीन (dpotrf, आदि) का उपयोग कर रहा है।

जाहिर है कि यह प्रत्येक भाषा में हमारे कोड पर निर्भर हो सकता है, लेकिन हमारा मानना ​​है कि अधिकांश समय समकक्ष मैट्रिक्स के संचालन में है।

कई अन्य संगणनाओं में, जिनमें पुस्तकालय शामिल नहीं हैं, जावा बहुत धीमा नहीं है, और कभी-कभी बहुत तेज है।


मुश्किल मैट्रिक्स गणित ऑप्स कम से कम हे (एन ^ 3) हैं ... बदतर बदतर से बदतर, मुझे लगता है कि आप समय और परीक्षण कर सकते हैं ...
Calyth

2
आपको व्युत्क्रम की आवश्यकता क्यों है? लगभग सभी अनुप्रयोगों के लिए, आपको वास्तविक व्युत्क्रम की आवश्यकता नहीं है। स्थिरता की समस्या के कारण प्रतिलोम की गणना करना एक बुरा विचार है।
यिंग जिओ

1
@ जय: हाँ, हम समय कर सकते हैं। मैं सोच रहा था कि क्या दूसरों के पास पहले से ही था। @ यिंग जिओ: हाँ, इनवर्स से बचना है। हालाँकि, यह अभिकलन इसका उपयोग करते हुए सबसे सीधा लगता है। En.wikipedia.org/wiki/… देखें ।
dfrankow

2
@Calyth गलत है, एक विभाजन और विजय दृष्टिकोण का उपयोग करके ओ (एन ^ 3) की तुलना में अधिक कुशल विधियां हैं।
स्टारबेल

1
सबसे तेज़ मूल प्रदर्शन JCublas से है। यदि आपको तेजी से रैखिक बीजगणित की आवश्यकता है, तो आपको GPU की आवश्यकता है। ClMath के साथ JOCL भी काम कर सकता है और CPU (और यहां तक ​​कि मल्टी-प्लेटफॉर्म w / o recompiling) के लिए पोर्टेबल हो सकता है, लेकिन मैंने इसका परीक्षण नहीं किया है।
१३:३० पर अलेक्सांद्र डबिन्स्की

जवाबों:


98

बस मेरे 2 सेंट जोड़ने के लिए। मैंने इनमें से कुछ पुस्तकालयों की तुलना की है। मैंने अपने आप से मैट्रिक्स के 3000 गुणा 3000 मैट्रिक्स को दोगुना करने का प्रयास किया। परिणाम इस प्रकार हैं।

C / C ++, ऑक्टेव, पायथन और आर के साथ मल्टीथ्रेड एटीएलएएस का उपयोग करते हुए, लिया गया समय लगभग 4 सेकंड था।

जावा के साथ जामा का उपयोग करना, लिया गया समय 50 सेकंड था।

जावा के साथ बछेड़ा और समानांतर बछेड़ा का उपयोग करना, लिया गया समय 150 सेकंड था!

JBL के साथ JBLAS का उपयोग करते हुए, लिया गया समय फिर से 4 सेकंड के आसपास था क्योंकि JBLAS मल्टीट्रेड एटीएलएएस का उपयोग करता है।

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


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

17
मैंने नेटलिब-जावा की सिर्फ v1.0 जारी की है ... प्रदर्शन ऑन-बराबर है (और कभी-कभी फोरट्रान कोड को पार कर जाता है), और यह उपयोगकर्ता कोड में किसी भी बदलाव के बिना मशीन अनुकूलित नेटिव का उपयोग कर सकता है। निम्न-स्तरीय रैखिक बीजगणित पुस्तकालयों की तलाश में कृपया इस पर विचार करें। मैं एमटीजे भी बनाए रखता हूं , जो नेटलिब-जावा का उपयोग करता है। स्काला में, ब्रीज़ का उपयोग करें (इसके द्वारा संचालित netlib-java)
fommil

4
ND4j और जावा का उपयोग करना - मेरा अपेक्षाकृत पुराना लैपटॉप 219 मिली के भीतर सुझाए गए गुणन को पूरा करता है। जबकि अजगर + सुन्न इसे 349 मिली के भीतर पूरा करता है
बेनेल

2
और सिर्फ nd4j का उपयोग करने के बारे में अपनी पिछली टिप्पणी में जोड़ने के लिए, मैंने देशी-प्लेटफॉर्म को इसके बैकएंड के रूप में इस्तेमाल किया, अगर मैं
क्यूडा

क्या आपने बेंचमार्क के लिए अपना कोड कहीं प्रकाशित किया है?
ब्रजज़ीज़

108

मैं जावा मैट्रिक्स बेंचमार्क ( JMatBench ) का लेखक हूं और इस चर्चा पर अपने विचार दूंगा।

जावा पुस्तकालयों के बीच महत्वपूर्ण अंतर हैं और पूरी तरह से संचालन के दौरान कोई स्पष्ट विजेता नहीं है, कुछ स्पष्ट नेता हैं जो नवीनतम प्रदर्शन परिणामों (अक्टूबर 2013) में देखे जा सकते हैं ।

आप "बड़ी" मैट्रिक्स के साथ काम कर रहे हैं, तो और (तेज 3.5 के बारे में) देशी पुस्तकालयों, तो साफ तौर पर विजेता का उपयोग कर सकते है MTJ साथ प्रणाली अनुकूलित netlib । यदि आपको शुद्ध जावा समाधान की आवश्यकता है तो MTJ , OjAlgo , EJML और Parallel Colt अच्छे विकल्प हैं। छोटे मैट्रिक्स के लिए ईजेएमएल स्पष्ट विजेता है।

जिन पुस्तकालयों का मैंने उल्लेख नहीं किया, उनमें महत्वपूर्ण प्रदर्शन के मुद्दे नहीं थे या महत्वपूर्ण विशेषताएं नहीं थीं।


6
बस मैंने सोचा था कि आपका बेंचमार्क वास्तव में आसान है! इसमें अपना समय लगाने के लिए धन्यवाद।
होहानुउली

1
जेबीएएस एसवीडी के समर्थन में 13 सितंबर को दिखाई देता है: mikiobraun.github.io/jblas/javadoc/org/jblas/…
Leopd

अद्भुत काम, बहुत कुछ।
वेबपाट

क्या आपके द्वारा मूल्यांकन किए गए पुस्तकालयों की कहीं सूची है, लेकिन प्रत्येक के लिए और इसके परिणामों को प्रकाशित नहीं किया है?
केविन क्रुमविडे


51

मैं जाब्लस का मुख्य लेखक हूं और यह बताना चाहता हूं कि मैंने दिसंबर 2009 के अंत में संस्करण 1.0 जारी किया है। मैंने पैकेजिंग पर बहुत काम किया है, जिसका अर्थ है कि अब आप एटलस और जेएनआई पुस्तकालयों के साथ एक "मोटा जार" डाउनलोड कर सकते हैं। विंडोज, लिनक्स, मैक ओएस एक्स, 32 और 64 बिट (विंडोज को छोड़कर) के लिए। इस तरह से आप अपने वर्गपथ में जार फ़ाइल जोड़कर मूल प्रदर्शन प्राप्त करेंगे। इसे http://jblas.org पर देखें !


2
आपके काम से प्रेरित होकर, मैंने netlib-java ;-) में एक ऐसी ही बात की
fommil

2
Haha, मुझे भी, jeigen :-) के लिए
ह्यूग पर्किंस

जोगआम्प वही करता है, जोगम्प-फैट देखें। अच्छा विचार :)
gouessej

8

मैं वास्तव में विशिष्ट पुस्तकालयों पर टिप्पणी नहीं कर सकता, लेकिन सिद्धांत रूप में इस तरह के संचालन के जावा में धीमे होने का बहुत कम कारण है। हॉटस्पॉट आम तौर पर उन चीजों के प्रकार करता है जिनसे आप एक कंपाइलर की अपेक्षा करते हैं: यह जावा वैरिएबल पर बेसिक मैथ्स ऑपरेशन्स को संबंधित मशीन निर्देशों के अनुरूप बनाता है (यह SSE निर्देशों का उपयोग करता है, लेकिन प्रति ऑपरेशन केवल एक); किसी सरणी के तत्वों तक पहुँच "कच्चे" MOV निर्देशों का उपयोग करने के लिए संकलित किया जाता है जैसा कि आप उम्मीद करेंगे; यह इस बात पर निर्णय लेता है कि जब यह हो सकता है तो रजिस्टरों को चर कैसे आवंटित किया जाए; यह प्रोसेसर आर्किटेक्चर का लाभ उठाने के लिए निर्देशों का फिर से आदेश देता है ... एक संभावित अपवाद यह है कि जैसा कि मैंने उल्लेख किया है, हॉटस्पॉट केवल प्रति सेकंड निर्देश में एक ऑपरेशन करेगा; सिद्धांत रूप में आपके पास एक काल्पनिक रूप से अनुकूलित मैट्रिक्स लाइब्रेरी हो सकती है, जो प्रति निर्देश कई ऑपरेशन करती है, हालांकि मैं डॉन ' t पता है कि क्या कहते हैं, आपके विशेष फोरट्रान पुस्तकालय ऐसा करता है या अगर इस तरह के एक पुस्तकालय भी मौजूद है। यदि ऐसा होता है, तो वर्तमान में जावा (या कम से कम, हॉटस्पॉट) के लिए प्रतिस्पर्धा करने का कोई रास्ता नहीं है (हालांकि आप निश्चित रूप से जावा से कॉल करने के लिए उन अनुकूलन के साथ अपनी खुद की मूल लाइब्रेरी लिख सकते हैं)।

तो इन सब का क्या अर्थ है? कुंआ:

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

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


8

मैंने सिर्फ Apache Commons Math की तुलना jlapack से की है।

परीक्षण: एक यादृच्छिक 1024x1024 मैट्रिक्स का विलक्षण मूल्य अपघटन।

मशीन: इंटेल (R) कोर (TM) 2 डुओ CPU E6750 @ 2.66GHz, linux x64

ऑक्टेव कोड: ए = रैंड (1024); टिक [यू, एस, वी] = SVD (ए); toc

परिणाम निष्पादन समय
-------------------------------------------------- -------
ऑक्टेव 36.34 सेकंड

JDK 1.7u2 64 बिट
    jlapack dgesvd 37.78 सेकंड
    एपाचे गणित गणित SVD 42.24 सेकंड


JDK 1.6u30 64 बिट
    jlapack dgesvd 48.68 सेकंड
    एपाचे गणित गणित SVD 50.59 सेकंड

देशी दिनचर्या
लैपैक * C: 37.64 सेकंड से मंगवाया गया
इंटेल MKL 6.89 सेकंड (!)

मेरा निष्कर्ष है कि JDK 1.7 से कॉल किया गया jlapack, लैपैक के मूल द्विआधारी प्रदर्शन के बहुत करीब है। मैंने लाइनक्स डिस्ट्रो के साथ आने वाले लैपैक बाइनरी लाइब्रेरी का इस्तेमाल किया और यू, एस और वीटी मैट्रिसेस को पाने के लिए डीएजीएसवीडी रूटीन का इस्तेमाल किया। सभी परीक्षण डबल मैट्रिक्स (ऑक्टेव को छोड़कर) प्रत्येक रन पर सटीक सटीकता का उपयोग करके किए गए थे।

डिस्क्लेमर - मैं रैखिक बीजगणित का विशेषज्ञ नहीं हूं, ऊपर के किसी भी पुस्तकालय से संबद्ध नहीं हूं और यह एक कठोर बेंचमार्क नहीं है। यह एक 'होम-मेड' टेस्ट है, क्योंकि मैं JDK 1.7 के प्रदर्शन में वृद्धि की तुलना में दिलचस्पी 1.6 से 1.6 के साथ-साथ गणित SVD से jlapack तक कर रहा था।


8

जीगेन https://github.com/hughperkins/jeigen

  • लपेटता है Eigen C ++ पुस्तकालय http://eigen.tuxfamily.org , जो उपलब्ध सबसे तेज मुफ्त C ++ पुस्तकालयों में से एक है
  • अपेक्षाकृत ट्रिक सिंटैक्स, उदाहरण के लिए 'mmul', 'sub'
  • घने और विरल मैट्रिस दोनों को संभालता है

एक त्वरित परीक्षण, दो सघन मैट्रिक्स को गुणा करके, यानी:

स्थैतिक jeigen.atrixUtil आयात करें। *;

int K = 100;
int N = 100000;
DenseMatrix A = rand(N, K);
DenseMatrix B = rand(K, N);
Timer timer = new Timer();
DenseMatrix C = B.mmul(A);
timer.printTimeCheckMilliseconds();

परिणाम:

Jama: 4090 ms
Jblas: 1594 ms
Ojalgo: 2381 ms (using two threads)
Jeigen: 2514 ms
  • जाम की तुलना में, सब कुछ तेज है :-P
  • जाब्लस की तुलना में, जिगन काफी तेज नहीं है, लेकिन यह विरल मैट्रिस को संभालता है।
  • ओजाल्गो की तुलना में, जीनगन बीते समय की समान मात्रा के बारे में लेता है, लेकिन केवल एक कोर का उपयोग कर रहा है, इसलिए जीनगेन कुल सीपीयू का उपयोग करता है। Jeigen में एक terser सिंटैक्स है, अर्थात 'mmul' बनाम 'multiplyRight'

जीनगन का कमाल! मैंने हाल ही में जेएनआई और एक डीएलएल का उपयोग करके जावा में ईजन को लागू किया, जो कि बहुत बड़े विरल मैट्रिसेस को हल करने के लिए है। डीएलएल के साथ मेरा संस्करण मेरे परीक्षणों (8000x8000 से अधिक मेट्रिक्स) के समानांतर समानांतर से 20 से अधिक तेज़ी से है। काश, मुझे जीनगन के बारे में पता होता!
जेड बोसोन

6

कुछ अलग हार्डवेयर कॉन्फ़िगरेशन के लिए http://code.google.com/p/java-matrix-benchmark/ पर जावा में उपलब्ध विभिन्न मैट्रिक्स पैकेजों का एक बेंचमार्क है । लेकिन यह अपने स्वयं के बेंचमार्क करने के लिए कोई विकल्प नहीं है।

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

आम तौर पर यद्यपि, JAMA, Jampack और COLT पुराने हो रहे हैं, और रैखिक बीजगणित के लिए जावा में उपलब्ध वर्तमान प्रदर्शन की स्थिति का प्रतिनिधित्व नहीं करते हैं। अधिक आधुनिक पुस्तकालय एकाधिक कोर और सीपीयू कैश का अधिक प्रभावी उपयोग करते हैं। JAMA एक संदर्भ कार्यान्वयन था, और प्रदर्शन के संबंध में पाठ्यपुस्तक एल्गोरिदम को बहुत अधिक लागू करता है। COLT और IBM निंजा पहले java लाइब्रेरी थे जो यह प्रदर्शित करते थे कि java में प्रदर्शन संभव था, भले ही वे देशी पुस्तकालयों से 50% पिछड़ गए हों।


4

मैं la4j (Java के लिए रेखीय बीजगणित) पुस्तकालय का लेखक हूं और यहां मेरी बात है। मैं 3 साल के लिए la4j पर काम कर रहा हूं (नवीनतम रिलीज़ 0.4.0 [01 जून 2013] है) और केवल अब मैं प्रदर्शन विश्लेषण और अनुकूलन शुरू कर सकता हूं क्योंकि मैंने अभी न्यूनतम आवश्यक कार्यात्मक कवर किया है। इसलिए, la4j उतना तेज़ नहीं है जितना मैं चाहता था लेकिन मैं इसे बदलने के लिए अपने समय का भार उठा रहा हूं।

मैं वर्तमान में J4atBench प्लेटफॉर्म के लिए la4j के नए संस्करण को पोर्ट करने के बीच में हूं । मुझे उम्मीद है कि नया संस्करण बेहतर प्रदर्शन दिखाएगा, पिछले एक के बाद से मैं कई सुधार कर रहा हूं जैसे कि la4j में बहुत तेजी से आंतरिक मैट्रिक्स प्रारूप, असुरक्षित एक्सेसर्स और मैट्रिक्स गुणा के लिए तेजी से अवरुद्ध एल्गोरिथ्म।


1
नहीं - la4j वास्तव में अप्रतिस्पर्धी है। कोड देखें। http://www.p/java-matrix-benchmark
क्रिस्टोफर मैनिंग

यह बहुत बदल गया है। मैंने आपके उत्तर के बाद से लाइब्रेरी के दो संस्करण जारी किए हैं। वर्तमान रिलीज 0.4.0 है। और यह बस उड़ जाता है।
व्लादिमीर कोस्त्युकोव

3

Linalg कोड जो पेंटियम और बाद में प्रोसेसर की वेक्टर कंप्यूटिंग क्षमताओं (MMX एक्सटेंशन के साथ शुरू होता है, जैसे कि LAPACK और अब एटलस BLAS) पर निर्भर करता है, "काल्पनिक रूप से अनुकूलित" नहीं है, बल्कि बस उद्योग-मानक है। जावा में उस परिपूर्णता को दोहराने के लिए आपको देशी पुस्तकालयों की आवश्यकता होगी। मेरे पास एक ही प्रदर्शन समस्या है जैसा कि आप वर्णन करते हैं (मुख्य रूप से, चोल्स्की डिकम्पोज़िशन की गणना करने में सक्षम होने के लिए) और वास्तव में कुशल कुछ भी नहीं मिला है: जामा शुद्ध जावा है, क्योंकि इसे लागू करने के लिए सिर्फ एक टेम्पलेट और संदर्भ किट माना जाता है। .. जो कभी नहीं हुआ। आप अपाचे गणित के कॉमन्स को जानते हैं ... जैसा कि COLT के लिए, मुझे अभी भी इसका परीक्षण करना है, लेकिन यह निंजा सुधारों पर बहुत अधिक निर्भर करता है, जिनमें से अधिकांश एक एड-हॉक जावा कंपाइलर का निर्माण करके पहुंचे थे, इसलिए मुझे संदेह है कि यह मदद करने वाला है। उस समय, मुझे लगता है कि हम "


अच्छी बात! एटलस के लिए जेएनआई रैपर के साथ एक अल्फा-स्टेज प्रोजेक्ट: jblas.org । लेखक की ब्लॉग पोस्ट: mikiobraun.blogspot.com/2008/10/…
dfrankow

3

हमने कुछ बड़े गंभीर वित्तीय गणनाओं के लिए COLT का उपयोग किया है और इससे बहुत खुश हैं। हमारे भारी प्रोफाइल कोड में हमें लगभग कभी भी अपने किसी एक के साथ COLT कार्यान्वयन को प्रतिस्थापित नहीं करना पड़ा।

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


3

क्या आपने इंटेल मठ कर्नेल लाइब्रेरी पर एक नज़र डाली है ? यह ATLAS से भी बेहतर प्रदर्शन का दावा करता है । एमकेएल का उपयोग जावा में जेएनआई रैपर के माध्यम से किया जा सकता है ।


2
हमारे पास वह है। क) इसका लाइसेंस एटलस की तुलना में अधिक प्रतिबंधात्मक है (इसलिए हम अपने सभी कंप्यूटरों का उपयोग नहीं कर सकते हैं); बी) यह जावा नहीं है (और जैसा कि मैंने कहा कि हमारे पास जावा में रहने के लिए कारण हैं)।
dfrankow

यानी, यह जावा पुस्तकालयों के बारे में मेरे सवाल का जवाब नहीं है (लेकिन मेरे पास इसे कम करने की प्रतिष्ठा नहीं है)।
19

@dfrankow: मैंने जावा में इसका उपयोग करने पर आपकी चिंता को दूर करने के लिए अपना जवाब अपडेट किया है।
ज़च स्क्रिपवेन

1
+1, यदि यह गति है जिसकी आप तलाश कर रहे हैं, तो यह जाने का मार्ग प्रतीत होता है
गाब रॉयर

2
आखिरी कड़ी टूट गई है।
१19:

2

वर्खान के पद पर निर्माण जो कि पेंटियम-विशिष्ट मूल कोड बेहतर होगा:


2

आप जाब्लास परियोजना की जाँच कर सकते हैं । यह एक अपेक्षाकृत नया जावा पुस्तकालय है जो उच्च प्रदर्शन मैट्रिक्स संचालन के लिए BLAS, LAPACK और ATLAS का उपयोग करता है।

डेवलपर ने कुछ बेंचमार्क पोस्ट किए हैं जिसमें जाब्ता MTJ और Colt के खिलाफ अनुकूल रूप से आता है।


2

3 डी ग्राफिक्स अनुप्रयोगों के लिए lwjgl.util वेक्टर कार्यान्वयन लगभग 3 के एक कारक द्वारा उल्लिखित जाब्लास से ऊपर किया गया है।

मैंने 4x4 मैट्रिक्स के साथ vec4 के 1 मिलियन मैट्रिक्स गुणा किया है।

lwjgl लगभग 18ms में समाप्त हुआ, jblas को लगभग 60ms की आवश्यकता थी।

(मेरा मानना ​​है कि अपेक्षाकृत छोटे गुणन के तेजी से क्रमिक अनुप्रयोग के लिए जेएनआई दृष्टिकोण बहुत उपयुक्त नहीं है। चूंकि अनुवाद / मानचित्रण गुणा के वास्तविक निष्पादन की तुलना में अधिक समय ले सकता है।)


1

मैंने पाया है कि यदि आप बहुत अधिक आयामी मैट्रिक्स बना रहे हैं, तो आप दो आयामी सरणी के बजाय एकल आयामी सरणी का उपयोग करने के लिए इसे बदलकर लगभग 20% तेजी से जामा बना सकते हैं। ऐसा इसलिए है क्योंकि जावा बहु-आयामी सरणियों का कुशलता से समर्थन नहीं करता है। अर्थात। यह सरणियों की एक सरणी बनाता है।

बछेड़ा पहले से ही ऐसा करता है, लेकिन मैंने पाया है कि यह जामा की तुलना में अधिक जटिल और अधिक शक्तिशाली है, जो यह बता सकता है कि बछेड़ा के साथ सरल कार्य क्यों धीमा हैं।

जवाब वास्तव में इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। जामा उन चीज़ों के एक अंश का समर्थन नहीं करता है जो कोल्ट कर सकते हैं जो कि अधिक अंतर करते हैं।



0

वहाँ कई स्वतंत्र रूप से उपलब्ध जावा रैखिक बीजगणित पुस्तकालय हैं। http://www.ujmp.org/java-matrix/benchmark/ दुर्भाग्य से वह बेंचमार्क आपको केवल मैट्रिक्स गुणा के बारे में जानकारी देता है (परीक्षण को स्थानांतरित करने के साथ विभिन्न पुस्तकालयों को उनके संबंधित डिज़ाइन सुविधाओं का दोहन करने की अनुमति नहीं देता है)।

आपको यह देखना चाहिए कि विभिन्न मैट्रिक्स डिकम्पोजिशन की गणना करने के लिए इन रैखिक बीजगणित पुस्तकालय कैसे प्रदर्शन करते हैं। http://ojalgo.org/matrix_compare.html


0

मैट्रिक्स टूकिट्स जावा (एमटीजे) पहले ही उल्लेख किया गया था, लेकिन शायद यह किसी और के लिए फिर से इस धागे पर ठोकर खाने के लिए उल्लेख करने योग्य है। रुचि रखने वालों के लिए, ऐसा लगता है कि ApJ कॉमन्स गणित 2.0 में MTJ की जगह लेने के बारे में भी बात होती है , हालांकि मुझे यकीन नहीं है कि हाल ही में यह कैसे प्रगति कर रहा है।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.