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


94

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

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

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

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

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


1
cuda 프로그래밍에서 포인터를 얼마나 많이 사용하는지 고려할 때 Java로 GPU를 프로그래밍하는 것이 어려울 것이라고 생각합니다. Java를 C ++와 차별화하는 완전한 Java 기능 / 라이브러리가 구현되지 않았기 때문에 장치 프로그래밍에서 Java를 사용하는 것이 많은 이점이 있었는지 모르겠습니다
Anycorn

2
GLSL과 아마도 CUDA를 사용하는 인상적인 Java 데모를 보았으므로 확실히 가능합니다.
Frederik

1
jcuda.org와 jocl.org를 확인하셨습니까?
bakkal

1
나는 그들에 대해 알고 있지만 품질을 판단 할 수는 없습니다. 그들에 대한 경험이 있습니까?
Frederik

4
@Nils : 그래서 그는 GPU에서 모든 숫자 크 런칭을 밀어 붙이고 싶어합니다 ... 어쨌든, 일반 C 또는 x86 asm조차도 GPU와 같은 대규모 데이터 병렬 프로세서와 경쟁하기 위해 어려운 작업을 할 것입니다.
Stringer

답변:


62

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 의 저자입니다 :-))


오, JNLP에 너무 신이 났지만 분명히 제 맥북이 마음에 들지 않습니다. 크로스 플랫폼에 너무 많이.
Karl

5
@Karl 아 죄송합니다, JNLP를 깨뜨 렸습니다 (JAR가 최근에 이름을 변경했습니다)! 이제 수정되었습니다. 다시 시도해 보시기 바랍니다 ... (그리고 크로스 플랫폼 방식 : 모든 플랫폼에서 일관되게 중단되었습니다 ;-))
zOlive

3
Java 7 보안의 최근 강화로 인해 Particle Demo Web Start가 예외와 함께 실패합니다.
Thorbjørn Ravn Andersen

@zOlive Google 코드에 대한 마지막 JavaCl 링크는 더 이상 사용할 수 없습니다.
tryman

34

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

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


아파라 피는 여전히 유지되고 있습니까?
Mr Jedi

@MrJedi : 나는 최근이 GitHub에 커밋, 그렇게 생각은 일부 일 이전입니다 : github.com/aparapi/aparapi
아이 딘 K.

그것은 "다소 유지되고있는 것"입니다.) 나는 관리자입니다.
barneypitt

12

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/ 에서 찾을 수 있습니다 .


2
JNA ( jna.dev.java.net )가 플랫폼에서 지원되는 경우 JNI 라이브러리를 코딩하는 것보다 훨씬 적은 노력이 소요되므로이를 사용하여 네이티브 코드를 호출합니다.
mdma 2010 년

11

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

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


7

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

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

프로젝트 페이지에서 :

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



1

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.