दिलचस्प पोस्ट
क्यों कंपाइलरों स्ट्रिंग literals const करने के लिए अनुमति नहीं है const? कस्टम क्रिया का उपयोग करके गतिविधि प्रारंभ करें कोड से जावा स्विंग एप्लिकेशन को बंद कैसे करें स्विफ्ट # सीलेक्टर के तर्क को उद्देश्य-सी के संपर्क में लेना चाहता है डॉक करने वाले कंटेनर से मेजबान पोर्ट का उपयोग कैसे करें बड़ी संख्या के मापांक की गणना कैसे करें? क्या जावास्क्रिप्ट के लिए कोई कोडिंग मानदंड हैं? मैं रेडियो बटन के रंग को कैसे बदलूं? जावा की प्राथमिकता प्रश्न के लिए अंतर्निहित इटरेटर किसी विशेष क्रम में डेटा संरचना को पार नहीं करता है। क्यूं कर? साइन 180 के मूल्य 1.22465e-16 के रूप में आ रहे हैं BigDecimal के लिए जोड़ जावा स्ट्रीम एक बार बंद क्यों हैं? सी #: गतिशील रनटाइम डाली कैसे एलएपीसीडब्लूआरआर में कनवर्ट करने के लिए? कैसे एक NSArray वर्णक्रम के अनुसार सॉर्ट करने के लिए?

एनवीडिया जीपीयू (सीयूडीए) के साथ जावा का उपयोग करना

मैं एक व्यावसायिक परियोजना पर काम कर रहा हूं जो जावा में किया और कंप्यूटर कंप्यूटर्स के बाजारों में विशाल गणना शक्ति की आवश्यकता है। सरल गणित लेकिन डेटा के विशाल मात्रा के साथ

हमने कुछ कुडा जीपीयू के साथ इसे करने का प्रयास किया और चूंकि जावा को कुडा द्वारा समर्थित नहीं किया गया था, मैं सोच रहा हूं कि कहां से शुरू करना है क्या मुझे एक जेएनआई इंटरफ़ेस का निर्माण करना चाहिए? क्या मुझे जक्डिया का उपयोग करना चाहिए या क्या इसके साथ जाने के अन्य तरीके हैं?

मुझे इस क्षेत्र में अनुभव नहीं है और मैं चाहूंगा कि अगर कोई मुझे कुछ करने के लिए निर्देशित करे, तो मैं शोध और सीखना शुरू कर सकता हूं।

Solutions Collecting From Web of "एनवीडिया जीपीयू (सीयूडीए) के साथ जावा का उपयोग करना"

सबसे पहले, आपको इस तथ्य से अवगत होना चाहिए कि CUDA स्वचालित रूप से कंप्यूटेशन को तेजी से नहीं बना देगा एक ओर, क्योंकि GPU प्रोग्रामिंग एक कला है, और यह सही हो सकता है, बहुत चुनौतीपूर्ण है। दूसरी ओर, क्योंकि GPUs केवल कुछ प्रकार के कम्प्यूटेशंस के लिए अच्छी तरह से अनुकूल हैं

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

उत्तरार्द्ध एक ऐसी समस्या है जो GPUs पर अच्छे हैं: उनके पास कई कोर हैं, और सभी कोर एक ही करते हैं, लेकिन इनपुट डेटा के विभिन्न भागों पर काम करते हैं।

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

इससे समस्याओं का एक अन्य वर्गीकरण होता है अर्थात् समस्याएं स्मृति बाध्य हैं या बाध्य हैं

पहले एक उन समस्याओं को संदर्भित करता है जहां प्रत्येक डेटा तत्व के लिए किए गए निर्देशों की संख्या कम होती है। उदाहरण के लिए, एक समानांतर वेक्टर जोड़ पर विचार करें: आपको दो डेटा तत्वों को पढ़ना होगा, फिर एक एकल कार्य निष्पादित करना होगा, और फिर परिणाम वेक्टर में योग लिखना होगा। आप GPU पर ऐसा करते समय एक गति को नहीं देखेंगे, क्योंकि एकल अतिरिक्त पढ़ने / लिखने के प्रयासों के लिए क्षतिपूर्ति नहीं करता है

दूसरा शब्द, "गणना बाउंड", उन समस्याओं को संदर्भित करता है जहां निर्देशों की संख्या मेमोरी रीड / लिखने की तुलना में अधिक होती है। उदाहरण के लिए, एक मैट्रिक्स गुणा पर विचार करें: निर्देशों की संख्या ओ (एन ^ 3) होगी, जब n मैट्रिक्स का आकार है। इस मामले में, कोई उम्मीद कर सकता है कि GPU एक निश्चित मैट्रिक्स आकार पर CPU को मात देगा। एक और उदाहरण हो सकता है जब कई जटिल त्रिकोणमिति कंप्यूटेशन (साइन / कोसाइन आदि) "कुछ" डेटा तत्वों पर किया जाता है

अंगूठे का एक नियम के रूप में: आप मान सकते हैं कि "मुख्य" GPU मेमोरी से एक डेटा तत्व को पढ़ना / लिखना लगभग 500 निर्देशों की एक विलंबता है ….

इसलिए, GPUs के प्रदर्शन के लिए एक अन्य प्रमुख बिंदु डेटा क्षेत्र है : यदि आपको डेटा पढ़ना और लिखना है (और अधिकतर मामलों में, आपको करना होगा ;-)), तो आपको यह सुनिश्चित करना चाहिए कि डेटा को करीब से रखा गया है GPU कोर के लिए संभव GPUs के पास निश्चित मेमोरी क्षेत्रों ("स्थानीय मेमोरी" या "साझा मेमोरी" के रूप में संदर्भित है) आमतौर पर आकार में केवल कुछ KB होता है, लेकिन डेटा के लिए विशेष रूप से कुशल होता है जो कि गणना में शामिल होने वाला है।

तो इसे फिर से ज़ोर देना: जीपीयू प्रोग्रामिंग एक कला है, जो कि सीपीयू पर समानांतर प्रोग्रामिंग से केवल दूर से संबंधित है। जावा में थ्रेड्स जैसे थ्रेड्स जैसे ForkJoinPools , ForkJoinPools इत्यादि सभी धारणा देते हैं कि आपको किसी तरह अपने काम को विभाजित करना होगा और इसे कई प्रोसेसर के बीच वितरित करना होगा। GPU पर, आपको बहुत कम स्तर पर चुनौतियों का सामना करना पड़ सकता है: अधिभोग, रजिस्टर दबाव, साझा स्मृति दबाव, मेमोरी कोलसिंग … बस कुछ ही नाम के लिए।

हालांकि, जब आपके पास डेटा-समांतर, संकलन-बाध्य समस्या को हल करने के लिए है, तो GPU जाने का तरीका है


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


आपको यह भी दिलचस्प लग सकता है कि अक्टूबर 2012 में, ओपनजेडीके हॉटस्पॉट समूह ने "सुमात्रा" परियोजना शुरू की: http://openjdk.java.net/projects/sumatra/ इस परियोजना का लक्ष्य जीआईयू के समर्थन से सीधे जीवीयू समर्थन प्रदान करना है। वर्तमान स्थिति और प्रथम परिणाम उनकी मेलिंग सूची में http://mail.openjdk.java.net/mailman/listinfo/sumatra-dev पर देखा जा सकता है


हालांकि, कुछ समय पहले, मैंने सामान्य रूप से "GPU पर जावा" से संबंधित कुछ संसाधनों को एकत्र किया था। मैं इनको फिर से संक्षेप में बताऊंगा, कोई विशेष क्रम में नहीं।

( अस्वीकरण : मैं http://jcuda.org/ और http://jocl.org/ के लेखक हूं)

(बाइट) कोड अनुवाद और ओपनसीएल कोड पीढ़ी:

https://github.com/aparapi/aparapi : एएमडी द्वारा बनाए गए और सक्रिय रूप से बनाए गए एक ओपन सोर्स लाइब्रेरी एक विशेष "कर्नेल" वर्ग में, एक विशिष्ट विधि को ओवरराइड कर सकता है जिसे समानांतर में निष्पादित किया जाना चाहिए। इस पद्धति का बाइट कोड रनटाइम पर स्वयं के बाइटकोड रीडर का उपयोग करके लोड किया जाता है। ओपनसीएल कोड में कोड का अनुवाद किया जाता है, जिसे ओपनसीएल कंपाइलर का इस्तेमाल करते हुए संकलित किया जाता है। इसके परिणामस्वरूप ओपनसीएल डिवाइस पर क्रियान्वित किया जा सकता है, जो कि एक GPU या एक सीपीयू हो सकता है अगर ओपनसीएल में संकलन संभव नहीं है (या कोई ओपनसीएल उपलब्ध नहीं है), तो कोड को थ्रेड पूल का प्रयोग करके समानांतर में निष्पादित किया जाएगा।

https://github.com/pcpratts/rootbeer1 : जावा के कुछ हिस्सों को CUDA कार्यक्रमों में परिवर्तित करने के लिए एक ओपन-सोर्स लाइब्रेरी। यह समर्पित इंटरफेस प्रदान करता है जो कि यह इंगित करने के लिए लागू किया जा सकता है कि एक विशिष्ट वर्ग को GPU पर निष्पादित किया जाना चाहिए। अप्रापी के विपरीत, यह स्वचालित रूप से "प्रासंगिक" डेटा (जो कि ऑब्जेक्ट ग्राफ़ का पूर्ण प्रासंगिक हिस्सा है!) को सीरियलाइज़ करने की कोशिश करता है, जो कि GPU के लिए उपयुक्त है।

https://code.google.com/archive/p/java-gpu/ : एनोटेटेड जावा कोड (कुछ सीमाएं के साथ) को सीयूडीए कोड में अनुवाद करने के लिए एक पुस्तकालय, जिसे तब पुस्तकालय में संकलित किया जाता है जो GPU पर कोड को निष्पादित करता है। पुस्तकालय पीएचडी थीसिस के संदर्भ में विकसित किया गया था, जिसमें अनुवाद प्रक्रिया के बारे में गहरा पृष्ठभूमि जानकारी शामिल है।

https://github.com/ochafik/ScalaCL : ओपनसीएल के लिए स्कला बाइंडिंग विशेष स्काला संग्रहों को ओपनसीएल के साथ समानांतर में संसाधित करने की अनुमति देता है संग्रह के तत्वों पर कॉल किए जाने वाले कार्य सामान्य स्काला कार्यों (कुछ सीमाएं के साथ) हो सकते हैं, जिन्हें ओपनसीएल कर्नेल में अनुवाद किया जाता है।

भाषा एक्सटेंशन

http://www.ateji.com/px/index.html : जावा के लिए एक भाषा एक्सटेंशन जो समानांतर संरचनाओं (जैसे लूप, ओपनएमपी शैली के लिए समानांतर) की अनुमति देता है, जो तब ओपीसीएल के साथ जीपीयू पर निष्पादित होते हैं। दुर्भाग्य से, यह बहुत आशाजनक परियोजना नहीं रह गई है।

http://www.habanero.rice.edu/Publications.html (जेसीयूडीएए): एक पुस्तकालय जो जावा- और सीयूडीए-सी कोड में विशेष जावा कोड (जेसीयूडीए कोड कहा जाता है) का अनुवाद कर सकता है, जिसे तब संकलित और निष्पादित किया जा सकता है GPU। हालांकि, लाइब्रेरी सार्वजनिक तौर पर उपलब्ध नहीं है

https://www2.informatik.uni-erlangen.de/EN/research/JavaOpenMP/index.html : ओपनएमपी निर्माण के लिए जावा भाषा एक्सटेंशन, एक सीयूडीए बैकएंड के साथ

जावा ओपनसीएल / सीयूडीए बाइंडिंग लाइब्रेरीज़

https://github.com/ochafik/JavaCL : ओपनसीएल के लिए जावा बाइंडिंग: ऑब्जेक्ट-ओरिएंटेड ओपनसीएल लाइब्रेरी, ऑटो-जनरेट किए गए निम्न स्तरीय बाइंडिंग के आधार पर

http://jogamp.org/jocl/www/ : ओपनसीएल के लिए जावा बाइंडिंग: ऑब्जेक्ट-ओरिएंटेड ओपनसीएल लाइब्रेरी, ऑटो-जनरेट किए गए निम्न स्तरीय बाइंडिंग के आधार पर

http://www.lwjgl.org/ : ओपनसीएल के लिए जावा बाइंडिंग: ऑटो-जेनरेट किए गए निम्न-स्तरीय बाइंडिंग और ऑब्जेक्ट ओरिएंटेड सुविधा क्लासेस

http://jocl.org/ : ओपनसीएल के लिए जावा बाइंडिंग: मूल ओपनसीएल एपीआई की 1: 1 मैपिंग निम्न स्तर की बाइंडिंग

http://jcuda.org/ : सीयूडीए के लिए जावा बाइंडिंग: मूल-सीयूडीए एपीआई के 1: 1 मैपिंग के निम्न-स्तरीय बाइंडिंग

कई तरह का

http://sourceforge.net/projects/jopencl/ : ओपनसीएल के लिए जावा बाइंडिंग 2010 से अब तक बनाए रखा नहीं जा सकता है

http://www.hoopoe-cloud.com/ : CUDA के लिए जावा बाइंडिंग अब बनाए रखा नहीं जा सकता है


मैं जावा और सीयूडीए के लिए परियोजनाओं में से एक का उपयोग कर शुरू करूंगा: http://www.jcuda.org/