[java] Java에서 GPGPU / CUDA / OpenCL에 대한 최상의 접근 방식?

GPGPU (그래픽 처리 장치)의 범용 컴퓨팅 은 모든 종류의 컴퓨팅에 GPU의 성능을 활용할 수있는 매우 매력적인 개념입니다.

이미지 처리, 입자 및 빠른 기하학적 작업에 GPGPU를 사용하고 싶습니다.

현재이 분야의 두 경쟁자는 CUDA와 OpenCL 인 것 같습니다. 알고 싶습니다 :

  • Windows / Mac의 Java에서 OpenCL을 사용할 수 있습니까?
  • OpenCL / CUDA에 인터페이스하는 라이브러리 방식은 무엇입니까?
  • JNA를 직접 사용하는 것이 옵션입니까?
  • 내가 뭔가 잊은 건가요?

실제 경험 / 예제 / 전쟁 이야기가 있으면 감사합니다.



답변

AFAIK, JavaCL / OpenCL4Java 는 현재 모든 플랫폼에서 사용할 수있는 유일한 OpenCL 바인딩입니다 ( JNA 사용 덕분에 MacOS X, FreeBSD, Linux, Windows, Solaris, 모두 Intel 32, 64 비트 및 ppc 변형 포함 ).

적어도 Mac과 Windows에서 Java Web Start에서 실제로 제대로 실행되는 데모가 있습니다 (Linux에서 임의의 충돌을 방지하려면 이 Particles Demo 와 같은 이 위키 페이지 를 참조하십시오 .

또한 몇 가지 유틸리티 (GPGPU 난수 생성, 기본 병렬 감소, 선형 대수) 및 Scala DSL이 함께 제공 됩니다.

마지막으로 사용 가능한 가장 오래된 바인딩 (2009 년 6 월 이후)이며 활성 사용자 커뮤니티가 있습니다.

(면책 조항 : 저는 JavaCL 의 저자입니다 :-))


답변

Aparapi 를 고려할 수도 있습니다 . 이를 통해 Java로 코드를 작성할 수 있으며 런타임에 바이트 코드를 OpenCL로 변환하려고 시도합니다.

전체 공개. 저는 Aparapi 개발자입니다.


답변

CUDA는 C의 수정입니다. CUDA 커널을 작성하려면 C로 코딩 한 다음 nvidia의 CUDA 컴파일러를 사용하여 실행 가능한 형태로 컴파일해야합니다. 생성 된 네이티브 코드는 JNI를 사용하여 Java와 연결할 수 있습니다. 따라서 기술적으로 Java에서 커널 코드를 작성할 수 없습니다. JCUDA http://www.jcuda.de/jcuda/JCuda.html 이 있으며 일반적인 메모리 / 장치 관리를위한 cuda의 API와 CUDA 및 JNI 래핑 된 일부 Java 메서드 (FFT, 일부 선형 대수 메서드)를 제공합니다. .. 등 ..).

반면에 OpenCL은 API 일뿐입니다. OpenCL 커널은 API에 전달되는 일반 문자열이므로 Java의 OpenCL을 사용하면 고유 한 커널을 지정할 수 있습니다. Java 용 OpenCL 바인딩은 http://www.jocl.org/ 에서 찾을 수 있습니다 .


답변

저는 JOCL을 사용해 왔으며 매우 만족합니다.

CUDA에 비해 OpenCL의 가장 큰 단점은 (적어도 저에게는) 사용 가능한 라이브러리 (Thrust, CUDPP 등)가 없다는 것입니다. 그러나 CUDA는 OpenCL로 쉽게 이식 할 수 있으며 이러한 라이브러리가 작동하는 방식 (알고리즘, 전략 등)을 살펴보면 실제로 많은 것을 배울 수 있으므로 매우 좋습니다.


답변

늦었다는 것을 알고 있지만 이것을보십시오 : https://github.com/pcpratts/rootbeer1

나는 그것을 사용하지 않았지만 다른 솔루션보다 사용하기가 훨씬 쉽습니다.

프로젝트 페이지에서 :

Rootbeer는 CUDA 또는 OpenCL Java 언어 바인딩보다 고급입니다. 바인딩을 사용하면 개발자는 복잡한 개체 그래프를 기본 유형의 배열로 직렬화해야합니다. Rootbeer를 사용하면 이것은 자동으로 수행됩니다. 또한 언어 바인딩을 사용하여 개발자는 CUDA 또는 OpenCL에서 GPU 커널을 작성해야합니다. Rootbeer를 사용하면 Java Bytecode의 정적 분석이 수행되고 (Soot 사용) CUDA 코드가 자동으로 생성됩니다.


답변

jogamp.org의 JOCL을 추천 할 수도 있으며 Linux, Mac 및 Windows에서 작동합니다. 예를 들어 CONRAD 는 JOCL과 함께 OpenCL을 많이 사용합니다.


답변

일부 이미지 처리 또는 기하학적 연산을 수행하려면 GPU를 지원하는 선형 대수 라이브러리 (예 : CUDA 포함)가 필요할 수 있습니다. ND4J 마녀는 DeepLearning4J가 구축 된 CUDA GPU 지원이있는 선형 algrebra라고 제안합니다. 이를 통해 CUDA를 직접 처리 할 필요가없고 c에서 낮은 수준의 코드가 필요합니다. 또한 DL4J를 사용하여 이미지로 더 많은 작업을 수행하려면 컨볼 루션과 같은 특정 이미지 처리 작업에 액세스 할 수 있습니다.