Pendekatan terbaik untuk GPGPU / CUDA / OpenCL di Java?


94

Komputasi serba guna pada unit pemrosesan grafis ( GPGPU ) adalah konsep yang sangat menarik untuk memanfaatkan kekuatan GPU untuk segala jenis komputasi.

Saya ingin menggunakan GPGPU untuk pemrosesan gambar, partikel, dan operasi geometris cepat.

Saat ini, tampaknya dua pesaing di ruang ini adalah CUDA dan OpenCL. Saya ingin tahu:

  • Apakah OpenCL dapat digunakan dari Java pada Windows / Mac?
  • Apa cara perpustakaan untuk melakukan antarmuka ke OpenCL / CUDA?
  • Apakah menggunakan JNA secara langsung merupakan pilihan?
  • Apakah saya lupa sesuatu?

Pengalaman / contoh / cerita perang dunia nyata apa pun dihargai.


1
Saya akan membayangkan pemrograman GPU di Java akan sulit, mengingat seberapa banyak saya menggunakan pointer dalam pemrograman cuda. Saya tidak tahu apakah akan ada banyak manfaat menggunakan Java dalam pemrograman perangkat, karena Anda tidak mungkin menerapkan fitur / pustaka Java lengkap yang membedakan Java dari C ++
Anycorn

2
Saya telah melihat beberapa demo Java yang mengesankan yang menggunakan GLSL dan mungkin CUDA, jadi mungkin saja.
Frederik

1
Apakah Anda memeriksa jcuda.org dan jocl.org?
bakkal

1
Saya tahu tentang mereka, namun saya tidak bisa menilai kualitasnya. Apakah Anda punya pengalaman dengan mereka?
Frederik

4
@Nils: dan itulah sebabnya dia ingin mendorong semua angka yang berderak di GPU ... Bagaimanapun, bahkan C atau x86 asm biasa akan memiliki tugas yang sulit untuk bersaing dengan prosesor paralel data besar seperti GPU.
Stringer

Jawaban:


62

AFAIK, JavaCL / OpenCL4Java adalah satu-satunya pengikatan OpenCL yang tersedia di semua platform saat ini (termasuk MacOS X, FreeBSD, Linux, Windows, Solaris, semua dalam varian Intel 32, 64 bits dan ppc, berkat penggunaan JNA ).

Ini memiliki demo yang benar-benar berjalan dengan baik dari Java Web Start setidaknya di Mac dan Windows (untuk menghindari crash acak di Linux, silakan lihat halaman wiki ini , seperti Demo Partikel ini .

Itu juga dilengkapi dengan beberapa utilitas (pembuatan bilangan acak GPGPU, reduksi paralel dasar, aljabar linier) dan Scala DSL .

Terakhir, ini adalah binding tertua yang tersedia (sejak Juni 2009) dan memiliki komunitas pengguna yang aktif .

(Penafian: Saya penulis JavaCL :-))


Oh, saya sangat bersemangat untuk JNLP, tetapi ternyata JNLP tidak menyukai macbook saya. Begitu banyak untuk lintas platform.
Karl

5
@Karl Oh maaf, saya melanggar JNLP (JAR baru saja berganti nama)! Itu sekarang sudah diperbaiki, harap Anda akan mencoba lagi ... (dan lintas platform: rusak secara konsisten di semua platform ;-))
zOlive

3
Pengetatan baru-baru ini di keamanan Java 7 menyebabkan Particle Demo Web Start gagal dengan pengecualian.
Thorbjørn Ravn Andersen

@zOlive Tautan JavaCl terakhir ke kode google tidak lagi tersedia.
tryman

34

Anda juga dapat mempertimbangkan Aparapi . Ini memungkinkan Anda untuk menulis kode Anda di Java dan akan mencoba mengubah bytecode ke OpenCL saat runtime.

Pengungkapan penuh. Saya adalah pengembang Aparapi.


Apakah aparapi masih dipertahankan?
Tuan Jedi

@MrJedi: Saya rasa begitu, commit terbaru di github hanya berumur beberapa hari: github.com/aparapi/aparapi
Aydin K.

Ini "agak dipertahankan";) Saya seorang pemelihara.
barneypitt

12

Nah CUDA adalah modifikasi dari C, untuk menulis kernel CUDA Anda harus membuat kode dalam C, dan kemudian mengkompilasi ke bentuk yang dapat dieksekusi dengan kompiler CUDA nvidia. Kode asli yang dihasilkan kemudian dapat dihubungkan dengan Java menggunakan JNI. Jadi secara teknis Anda tidak dapat menulis kode kernel dari Java. Ada JCUDA http://www.jcuda.de/jcuda/JCuda.html , ini memberi Anda apis cuda untuk memori umum / manajemen perangkat dan beberapa metode Java yang diimplementasikan dalam CUDA dan JNI dibungkus (FFT, beberapa metode aljabar linier .. dll dll ..).

Di sisi lain OpenCL hanyalah sebuah API. Kernel OpenCL adalah string biasa yang diteruskan ke API jadi dengan menggunakan OpenCL dari Java, Anda harus dapat menentukan kernel Anda sendiri. Pengikatan OpenCL untuk java dapat ditemukan di sini http://www.jocl.org/ .


2
jika JNA ( jna.dev.java.net ) didukung pada platform Anda, saya akan menggunakannya untuk memanggil kode asli, karena upaya ini jauh lebih sedikit daripada mengkodekan perpustakaan JNI.
mdma

11

Saya telah menggunakan JOCL dan saya sangat senang dengannya.

Kerugian utama OpenCL dibandingkan CUDA (setidaknya bagi saya) adalah kurangnya perpustakaan yang tersedia (Thrust, CUDPP, dll). Namun CUDA dapat dengan mudah di-porting ke OpenCL, dan dengan melihat bagaimana perpustakaan tersebut bekerja (algoritma, strategi, dll) sebenarnya sangat bagus karena Anda belajar banyak dengannya.


7

Saya tahu ini terlambat, tetapi lihat ini: https://github.com/pcpratts/rootbeer1

Saya belum bekerja dengannya tetapi tampaknya lebih mudah digunakan daripada solusi lain.

Dari halaman proyek:

Rootbeer lebih maju dari CUDA atau OpenCL Java Language Bindings. Dengan binding, developer harus membuat serial grafik objek yang kompleks menjadi array tipe primitif. Dengan Rootbeer ini dilakukan secara otomatis. Juga dengan pengikatan bahasa, pengembang harus menulis kernel GPU di CUDA atau OpenCL. Dengan Rootbeer, analisis statis Java Bytecode dilakukan (menggunakan Soot) dan kode CUDA dibuat secara otomatis.



1

Jika Anda ingin melakukan pemrosesan gambar atau operasi geometris, Anda mungkin menginginkan pustaka aljabar linier dengan dukungan GPU (dengan CUDA misalnya). Saya sarankan Anda penyihir ND4J adalah algrebra linier dengan dukungan GPU CUDA tempat DeepLearning4J dibangun. Dengan itu Anda tidak perlu berurusan dengan CUDA secara langsung dan harus kode level rendah di c. Ditambah jika Anda ingin melakukan lebih banyak hal dengan gambar dengan DL4J Anda akan memiliki akses ke operasi pemrosesan gambar tertentu seperti konvolusi.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.