Cách tiếp cận tốt nhất cho GPGPU / CUDA / OpenCL trong Java?


94

Tính toán mục đích chung trên các đơn vị xử lý đồ họa ( GPGPU ) là một khái niệm rất hấp dẫn để khai thác sức mạnh của GPU cho bất kỳ loại máy tính nào.

Tôi muốn sử dụng GPGPU để xử lý hình ảnh, các hạt và các phép toán hình học nhanh.

Hiện tại, có vẻ như hai đối thủ trong không gian này là CUDA và OpenCL. Tôi muốn biết:

  • OpenCL có thể sử dụng được từ Java trên Windows / Mac không?
  • Các cách thư viện để giao tiếp với OpenCL / CUDA là gì?
  • Sử dụng JNA trực tiếp có phải là một lựa chọn không?
  • Tôi đang quên điều gì đó?

Mọi trải nghiệm / ví dụ / câu chuyện chiến tranh trong thế giới thực đều được đánh giá cao.


1
Tôi sẽ tưởng tượng việc lập trình GPU trong Java sẽ khó, xem xét mức độ tôi sử dụng con trỏ trong lập trình cuda. Tôi không biết nếu có sẽ được nhiều lợi ích khi sử dụng Java trong lập trình thiết bị, kể từ khi bạn không có khả năng có đầy đủ các tính năng Java thư viện / thực hiện mà phân biệt Java từ C ++
Anycorn

2
Tôi đã xem một số bản trình diễn Java ấn tượng sử dụng GLSL và có thể là CUDA, vì vậy chắc chắn là có thể.
Frederik

1
Bạn đã kiểm tra jcuda.org và jocl.org?
bakkal

1
Tôi biết về chúng, tuy nhiên tôi không thể đánh giá chất lượng. Bạn có bất kỳ kinh nghiệm với họ?
Frederik

4
@Nils: và vì vậy đó là lý do tại sao anh ấy muốn đẩy tất cả các con số lên GPU ... Dù sao, ngay cả asm C hoặc x86 đơn giản cũng sẽ có một nhiệm vụ khó khăn để cạnh tranh với các bộ xử lý song song dữ liệu lớn như GPU.
Stringer

Câu trả lời:


62

AFAIK, JavaCL / OpenCL4Java là liên kết OpenCL duy nhất có sẵn trên tất cả các nền tảng ngay bây giờ (bao gồm MacOS X, FreeBSD, Linux, Windows, Solaris, tất cả đều trong biến thể Intel 32, 64 bit và ppc, nhờ sử dụng JNA ).

Nó có các bản trình diễn thực sự chạy tốt từ Java Web Start ít nhất là trên Mac và Windows (để tránh sự cố ngẫu nhiên trên Linux, vui lòng xem trang wiki này , chẳng hạn như Bản trình diễn hạt này .

Nó cũng đi kèm với một số tiện ích (tạo số ngẫu nhiên GPGPU, giảm song song cơ bản, đại số tuyến tính) và một Scala DSL .

Cuối cùng, nó là ràng buộc lâu đời nhất có sẵn (kể từ tháng 6 năm 2009) và nó có một cộng đồng người dùng tích cực .

(Tuyên bố từ chối trách nhiệm: Tôi là tác giả của JavaCL :-))


Ồ, tôi rất hào hứng với JNLP, nhưng rõ ràng nó không thích macbook của tôi. Rất nhiều cho nền tảng chéo.
Karl

5
@Karl Ồ, xin lỗi, tôi đã phá vỡ JNLP (JAR gần đây đã đổi tên)! Điều đó hiện đã được khắc phục, hy vọng bạn sẽ thử lại ... (và đa nền tảng: nó đã bị hỏng liên tục trên tất cả các nền tảng ;-))
zOlive

3
Việc thắt chặt bảo mật gần đây trong Java 7 khiến cho Web Demo của Particle bắt đầu không thành công với một ngoại lệ.
Thorbjørn Ravn Andersen

@zOlive Liên kết JavaCl cuối cùng tới mã google không khả dụng nữa.
tryman

34

Bạn cũng có thể xem xét Aparapi . Nó cho phép bạn viết mã của mình bằng Java và sẽ cố gắng chuyển đổi bytecode thành OpenCL trong thời gian chạy.

Tiết lộ đầy đủ. Tôi là nhà phát triển Aparapi.


Aparapi có còn được duy trì không?
Mr Jedi

@MrJedi: Tôi nghĩ vậy, cam kết mới nhất trên github chỉ mới được vài ngày: github.com/aparapi/aparapi
Aydin K.

Nó là "phần nào được duy trì";) Tôi là một người bảo trì.
barneypitt

12

Vâng CUDA là một sửa đổi của C, để viết nhân CUDA, bạn phải viết mã bằng C, sau đó biên dịch sang dạng thực thi bằng trình biên dịch CUDA của nvidia. Mã gốc được tạo sau đó có thể được liên kết với Java bằng JNI. Vì vậy, về mặt kỹ thuật, bạn không thể viết mã hạt nhân từ Java. Có JCUDA http://www.jcuda.de/jcuda/JCuda.html , nó cung cấp cho bạn apis của cuda để quản lý bộ nhớ / thiết bị chung và một số phương pháp Java được triển khai trong CUDA và JNI được bao bọc (FFT, một số phương pháp đại số tuyến tính .. Vân vân..).

Mặt khác OpenCL chỉ là một API. Hạt nhân OpenCL là các chuỗi thuần túy được chuyển tới API, do đó, sử dụng OpenCL từ Java, bạn sẽ có thể chỉ định các hạt nhân của riêng mình. Có thể tìm ràng buộc OpenCL cho java tại đây http://www.jocl.org/ .


2
nếu JNA ( jna.dev.java.net ) được hỗ trợ trên nền tảng của bạn, tôi sẽ sử dụng điều đó để gọi mã gốc, vì nó ít nỗ lực hơn nhiều so với viết thư viện JNI.
mdma

11

Tôi đã sử dụng JOCL và tôi rất hài lòng với nó.

Nhược điểm chính của OpenCL so với CUDA (ít nhất là đối với tôi) là thiếu các thư viện có sẵn (Thrust, CUDPP, v.v.). Tuy nhiên CUDA có thể dễ dàng được chuyển sang OpenCL và bằng cách xem các thư viện đó hoạt động như thế nào (thuật toán, chiến lược, v.v.) thực sự rất hay vì bạn học được rất nhiều điều với nó.


7

Tôi biết là muộn nhưng hãy xem này: https://github.com/pcpratts/rootbeer1

Tôi chưa làm việc với nó nhưng có vẻ dễ sử dụng hơn nhiều so với các giải pháp khác.

Từ trang dự án:

Rootbeer cao cấp hơn CUDA hoặc OpenCL Java Language Bindings. Với các ràng buộc, nhà phát triển phải tuần tự hóa các đồ thị phức tạp của các đối tượng thành các mảng kiểu nguyên thủy. Với Rootbeer, điều này được thực hiện tự động. Cũng với ràng buộc ngôn ngữ, nhà phát triển phải viết nhân GPU trong CUDA hoặc OpenCL. Với Rootbeer, một phân tích tĩnh của Java Bytecode được thực hiện (sử dụng Soot) và mã CUDA được tạo tự động.



1

Nếu bạn muốn thực hiện một số thao tác xử lý hình ảnh hoặc hình học, bạn có thể muốn có một thư viện đại số tuyến tính với sự hỗ trợ của gpu (với CUDA chẳng hạn). Tôi muốn gợi ý cho bạn phù thủy ND4J là đại số tuyến tính với hỗ trợ GPU CUDA mà DeepLearning4J được xây dựng trên đó. Với điều đó, bạn không phải đối phó trực tiếp với CUDA và phải mã cấp thấp trong c. Ngoài ra, nếu bạn muốn thực hiện nhiều thứ hơn với hình ảnh với DL4J, bạn sẽ có quyền truy cập vào các hoạt động xử lý hình ảnh cụ thể như tích chập.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.