जावा में GPGPU / CUDA / OpenCL के लिए सबसे अच्छा तरीका?


94

ग्राफिक्स प्रोसेसिंग यूनिट ( GPGPU ) पर सामान्य प्रयोजन कंप्यूटिंग किसी भी प्रकार की कंप्यूटिंग के लिए GPU की शक्ति का उपयोग करने के लिए एक बहुत ही आकर्षक अवधारणा है।

मैं इमेज प्रोसेसिंग, पार्टिकल्स और फास्ट जियोमेट्रिक ऑपरेशंस के लिए GPGPU का उपयोग करना पसंद करूंगा।

अभी, ऐसा लगता है कि इस अंतरिक्ष में दो दावेदार CUDA और OpenCL हैं। मैं जानना चाहता हूं:

  • क्या Windows / Mac पर Java से अभी भी OpenCL उपयोगी है?
  • OpenCL / CUDA को इंटरफ़ेस करने के पुस्तकालय क्या हैं?
  • क्या JNA का उपयोग सीधे एक विकल्प है?
  • क्या मैं कुछ भूल रहा हूँ?

किसी भी वास्तविक दुनिया के अनुभव / उदाहरण / युद्ध की कहानियों की सराहना की जाती है।


1
मैं जावा में प्रोग्रामिंग जीपीयू की कल्पना करना कठिन होगा, यह देखते हुए कि मैं क्यूडा प्रोग्रामिंग में पॉइंटर्स का कितना उपयोग करता हूं। मुझे नहीं पता कि डिवाइस प्रोग्रामिंग में जावा का उपयोग करने के लिए बहुत अधिक लाभ होगा, क्योंकि आपके पास पूर्ण जावा सुविधाओं / पुस्तकालयों को लागू करने की संभावना नहीं है जो जावा को C ++ से अलग करते हैं
Anycorn

2
मैंने कुछ प्रभावशाली जावा डेमो देखे हैं जो GLSL और शायद CUDA का उपयोग करते थे, इसलिए यह निश्चित रूप से संभव है।
फ्रेडरिक

1
आपने jcuda.org और jocl.org की जांच की?
बकल

1
मैं उनके बारे में जानता हूं, हालांकि मैं गुणवत्ता का न्याय नहीं कर सकता। क्या आपको उनके साथ कोई अनुभव है?
फ्रेडरिक

4
@ निल्स: और इसलिए वह GPU पर सभी नंबर को क्रंच करना चाहता है ... वैसे भी, सादे C या x86 asm में GPU जैसे बड़े पैमाने पर डेटा समानांतर प्रोसेसर के खिलाफ प्रतिस्पर्धा करने के लिए एक कठिन कार्य होगा।
स्ट्रिंगर

जवाबों:


62

AFAIK, JavaCL / OpenCL4Java एकमात्र OpenCL बाइंडिंग है जो अभी सभी प्लेटफार्मों पर उपलब्ध है (जिसमें MacOS X, FreeBSD, Linux, Windows, Solaris, सभी में Intel 32, 64 बिट्स और ppc वेरिएंट शामिल हैं, JNA के इसके उपयोग के लिए धन्यवाद )।

इसमें डेमो है जो वास्तव में मैक और विंडोज पर कम से कम जावा वेब स्टार्ट से ठीक चलता है (लिनक्स पर यादृच्छिक दुर्घटनाओं से बचने के लिए, कृपया इस विकी डेमो जैसे विकी पृष्ठ को देखें ।

यह कुछ उपयोगिताओं (GPGPU यादृच्छिक संख्या पीढ़ी, बुनियादी समानांतर कमी, रैखिक बीजगणित) और एक स्काला DSL के साथ भी आता है ।

अंत में, यह सबसे पुराना बाइंडिंग उपलब्ध है (जून 2009 के बाद से) और इसमें एक सक्रिय उपयोगकर्ता समुदाय है

(डिस्क्लेमर: मैं जावासीएल का लेखक हूं :-))


ओह, मैं JNLP के लिए बहुत उत्साहित था, लेकिन जाहिर तौर पर यह मेरी मैकबुक की तरह नहीं था। इतना पार मंच के लिए।
कार्ल

5
@ कार्ल ओह क्षमा करें, मैंने JNLP (JAR ने हाल ही में परिवर्तित नाम) को तोड़ दिया है! यह अब तय हो गया है, आशा है कि आप फिर से कोशिश करेंगे ... (और क्रॉस-प्लेटफॉर्म-वार: यह सभी प्लेटफार्मों पर लगातार टूट गया था ;-))
zOlive

3
जावा 7 सुरक्षा में हाल ही में कसने से कण डेमो वेब प्रारंभ एक अपवाद के साथ विफल हो जाता है।
थोरबजोरन राव एंडरसन

@zOlive Google कोड का अंतिम JavaCl लिंक अब उपलब्ध नहीं है।
तिकड़ी

34

आप अपर्पी पर भी विचार कर सकते हैं । यह आपको जावा में अपना कोड लिखने की अनुमति देता है और रनटाइम पर ओपनटेक को बायोटेक में बदलने का प्रयास करेगा।

पूरा खुलासा। मैं अपर्पी डेवलपर हूं।


क्या अपर्पी अब भी कायम है?
श्री जेडी

@MrJedi: मुझे ऐसा लगता है, गितुब पर नवीनतम कमिट कुछ दिन पुराना है: github.com/aparapi/aparapi
Aydin K.

यह "कुछ हद तक बरकरार" है;) मैं एक अनुचर हूँ।
बार्नीपिट

12

वैसे CUDA C का एक संशोधन है, CUDA कर्नेल को लिखने के लिए आपको C में कोड करना होगा, और फिर nvidia के CUDA कंपाइलर के साथ निष्पादन योग्य फॉर्म को संकलित करना होगा। उत्पादित मूल कोड को तब JNI का उपयोग करके जावा के साथ जोड़ा जा सकता था। इसलिए तकनीकी रूप से आप जावा से कर्नेल कोड नहीं लिख सकते हैं। JCUDA http://www.jcuda.de/jcuda/JCuda.html है , यह आपको सामान्य मेमोरी / डिवाइस मेंशन और कुछ जावा विधियों में CUDA और JNI लिपटे (FFT, कुछ लीनियर बीजगणित विधियों के लिए कार्यान्वित की जाती है) के लिए cuda के एप्स प्रदान करता है। .. आदि आदि..)।

दूसरी ओर OpenCL सिर्फ एक एपीआई है। OpenCL कर्नेल एपीआई के लिए पास किए गए सादे तार हैं इसलिए जावा से OpenCL का उपयोग करते हुए आपको अपनी खुद की गुठली निर्दिष्ट करने में सक्षम होना चाहिए। जावा के लिए ओपनसीएल बाइंडिंग http://www.jocl.org/ पर देखी जा सकती है ।


2
यदि JNA ( jna.dev.java.net ) को आपके प्लेटफ़ॉर्म पर समर्थित किया गया है, तो मैं इसका उपयोग देशी कोड को लागू करने के लिए करूँगा, क्योंकि यह जेएनआई लाइब्रेरी को कोड करने की तुलना में बहुत कम प्रयास है।
mdma

11

मैं JOCL का उपयोग कर रहा हूं और मैं इससे बहुत खुश हूं।

CUDA (मेरे लिए कम से कम) पर OpenCL का मुख्य नुकसान उपलब्ध पुस्तकालयों (थ्रस्ट, CUDPP, आदि) की कमी है। हालाँकि CUDA को आसानी से OpenCL में पोर्ट किया जा सकता है, और उन पुस्तकालयों (एल्गोरिदम, रणनीतियों, आदि) को देखकर यह वास्तव में बहुत अच्छा है क्योंकि आप इसके साथ बहुत कुछ सीखते हैं।


7

मुझे पता है कि देर हो चुकी है लेकिन इस पर एक नज़र डालें: https://github.com/pcpratts/rootbeer1

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

परियोजना पृष्ठ से:

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



1

यदि आप कुछ छवि प्रसंस्करण या ज्यामितीय संचालन करना चाहते हैं, तो आप gpu समर्थन (उदाहरण के लिए CUDA के साथ) के साथ एक रैखिक बीजगणित पुस्तकालय चाहते हो सकते हैं। मैं आपको सुझाव दूंगा कि ND4J विच CUDA GPU सपोर्ट वाला लीनियर अलग्रेज है, जिस पर DeepLearning4J बनाया गया है। इसके साथ आपको सीधे CUDA से नहीं निपटना है और c में निम्न स्तर का कोड रखना होगा। इसके अलावा अगर आप DL4J के साथ छवि के साथ अधिक सामान करना चाहते हैं, तो आपके पास विशिष्ट इमेज प्रोसेसिंग ऑपरेशन जैसे कि कनवल्शन तक पहुंच होगी।


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