Java'da GPGPU / CUDA / OpenCL için en iyi yaklaşım?


94

Grafik işlem birimlerinde ( GPGPU ) genel amaçlı bilgi işlem, her tür bilgi işlem için GPU'nun gücünden yararlanmak için çok çekici bir kavramdır.

Görüntü işleme, parçacıklar ve hızlı geometrik işlemler için GPGPU'yu kullanmayı çok isterim.

Şu anda, bu alandaki iki yarışmacı CUDA ve OpenCL gibi görünüyor. Bilmek isterdim:

  • OpenCL henüz Windows / Mac'te Java'dan kullanılabilir mi?
  • Kütüphanelerin OpenCL / CUDA ile arayüz oluşturmanın yolları nelerdir?
  • JNA'yı doğrudan kullanmak bir seçenek mi?
  • Bir şey mi unutuyorum?

Herhangi bir gerçek dünya deneyimi / örnekleri / savaş hikayeleri takdir edilmektedir.


1
Cuda programlamasında işaretçileri ne kadar kullandığımı düşünürsek, GPU'yu Java'da programlamanın zor olacağını düşünürdüm. Java'yı C ++ 'dan farklılaştıran tam Java özelliklerine / kitaplıklarına sahip olma olasılığınız düşük olduğundan, cihaz programlamada Java kullanmanın çok faydası olur mu bilmiyorum
Anycorn

2
GLSL ve muhtemelen CUDA kullanan bazı etkileyici Java demoları gördüm, bu yüzden kesinlikle mümkün.
Frederik

1
Jcuda.org ve jocl.org'u kontrol ettiniz mi?
bakkal

1
Onları biliyorum, ancak kaliteyi yargılayamam. Onlarla herhangi bir tecrüben var mı?
Frederik

4
@Nils: ve bu yüzden GPU'daki tüm rakamları zorlamak istiyor ... Her neyse, düz C veya x86 asm bile, GPU'lar gibi büyük veri paralel işlemcilerle rekabet etmek için zor bir görev olacaktır.
Stringer

Yanıtlar:


62

AFAIK, JavaCL / OpenCL4Java , şu anda tüm platformlarda mevcut olan tek OpenCL bağlamasıdır ( JNA kullanımı sayesinde MacOS X, FreeBSD, Linux, Windows, Solaris, tümü Intel 32, 64 bit ve ppc varyantları dahil ).

Java Web Start'tan en azından Mac ve Windows'ta iyi çalışan demoları var (Linux'ta rastgele çökmeleri önlemek için lütfen bu Particles Demo gibi bu wiki sayfasına bakın .

Ayrıca birkaç yardımcı program (GPGPU rasgele sayı oluşturma, temel paralel azaltma, doğrusal cebir) ve bir Scala DSL ile birlikte gelir .

Son olarak, mevcut en eski bağlamalardır (Haziran 2009'dan beri) ve aktif bir kullanıcı topluluğuna sahiptir .

(Sorumluluk reddi: Ben JavaCL'nin yazarıyım :-))


Oh, JNLP için çok heyecanlıydım, ama görünüşe göre macbook'umu sevmiyor. Çapraz platform için çok fazla.
Karl

5
@Karl Oh üzgünüm, JNLP'yi bozdum (JAR son zamanlarda isim değiştirdi)! Bu şimdi düzeltildi, tekrar deneyeceğinizi umuyoruz ... (ve çapraz platform açısından: tüm platformlarda tutarlı bir şekilde kırıldı ;-))
zOlive

3
Java 7 güvenliğindeki son sıkılaştırma, Particle Demo Web Start'ın bir istisna dışında başarısız olmasına neden oldu.
Thorbjørn Ravn Andersen

@zOlive Google koduna giden son JavaCl bağlantısı artık kullanılamıyor.
tryman

34

Aparapi'yi de düşünebilirsiniz . Kodunuzu Java'da yazmanıza izin verir ve çalışma zamanında bayt kodunu OpenCL'ye dönüştürmeye çalışır.

Tam açıklama. Aparapi geliştiricisiyim.


Aparapi hala korunuyor mu?
Mr Jedi

@MrJedi: Öyle düşünüyorum, github'daki son işlem sadece birkaç gün eski: github.com/aparapi/aparapi
Aydın K.

"Biraz korunuyor";) Ben bir bakıcıyım.
barneypitt

12

CUDA, C'nin bir modifikasyonudur, CUDA çekirdeğini yazmak için C kodlamanız ve ardından nvidia'nın CUDA derleyicisiyle çalıştırılabilir formda derlemeniz gerekir. Üretilen yerel kod daha sonra JNI kullanılarak Java ile bağlanabilir. Yani teknik olarak Java'dan çekirdek kodu yazamazsınız. JCUDA http://www.jcuda.de/jcuda/JCuda.html vardır, size genel bellek / cihaz yönetimi için cuda'nın apisini ve CUDA ve JNI sarılı (FFT, bazı doğrusal cebir yöntemleri) uygulanan bazı Java yöntemlerini sağlar. .. vs vs..).

Öte yandan OpenCL sadece bir API'dir. OpenCL çekirdekleri, API'ye aktarılan düz dizelerdir, bu nedenle Java'dan OpenCL kullanarak kendi çekirdeklerinizi belirtebilmeniz gerekir. Java için OpenCL bağlama burada http://www.jocl.org/ bulunabilir .


2
Platformunuzda JNA ( jna.dev.java.net ) destekleniyorsa, bunu bir JNI kitaplığını kodlamaktan çok daha az çaba gerektireceğinden yerel kodu çağırmak için kullanırdım.
mdma

11

JOCL kullanıyorum ve bundan çok memnunum.

OpenCL'nin CUDA'ya göre (en azından benim için) ana dezavantajı, mevcut kütüphanelerin (Thrust, CUDPP, vb.) Olmamasıdır. Bununla birlikte, CUDA kolayca OpenCL'ye taşınabilir ve bu kitaplıkların nasıl çalıştığına (algoritmalar, stratejiler, vb.) Bakarak, onunla çok şey öğrendiğiniz için aslında çok güzel.


7

Geç olduğunu biliyorum ama şuna bir bakın: https://github.com/pcpratts/rootbeer1

Onunla çalışmadım ama kullanımı diğer çözümlere göre çok daha kolay görünüyor.

Proje sayfasından:

Rootbeer, CUDA veya OpenCL Java Dil Bağlamalarından daha gelişmiştir. Bağlamalarla geliştirici, nesnelerin karmaşık grafiklerini ilkel tür dizileri halinde serileştirmelidir. Rootbeer ile bu otomatik olarak yapılır. Ayrıca dil bağlamalarında, geliştiricinin GPU çekirdeğini CUDA veya OpenCL'de yazması gerekir. Rootbeer ile Java Bytecode'un statik bir analizi yapılır (Soot kullanılarak) ve CUDA kodu otomatik olarak oluşturulur.



1

Bazı görüntü işleme veya geometrik işlemler yapmak istiyorsanız, gpu destekli (örneğin CUDA ile) doğrusal bir cebir kitaplığı isteyebilirsiniz. Size ND4J cadı, DeepLearning4J'nin üzerine inşa edildiği CUDA GPU desteğine sahip doğrusal bir algrebra olduğunu öneririm. Bununla doğrudan CUDA ile uğraşmak zorunda değilsiniz ve c. Ayrıca, DL4J ile görüntü ile daha fazla şey yapmak istiyorsanız, evrişim gibi belirli görüntü işleme işlemlerine erişebileceksiniz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.