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.
Jawaban:
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 :-))
sumber
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.
sumber
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/ .
sumber
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.
sumber
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.
sumber
Saya juga dapat merekomendasikan JOCL oleh jogamp.org , bekerja di Linux, Mac, dan Windows. CONRAD , misalnya, menggunakan banyak OpenCL dalam kombinasi dengan JOCL.
sumber
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.
sumber
Anda dapat melihat CUDA4J API
http://sett.com/gpgpu/the-cuda4j-api
sumber