แนวทางที่ดีที่สุดสำหรับ GPGPU / CUDA / OpenCL ใน Java?


94

การประมวลผลทั่วไปบนหน่วยประมวลผลกราฟิก ( GPGPU ) เป็นแนวคิดที่น่าสนใจมากในการควบคุมพลังของ GPU สำหรับการประมวลผลทุกประเภท

ฉันชอบใช้ GPGPU สำหรับการประมวลผลภาพอนุภาคและการดำเนินการทางเรขาคณิตที่รวดเร็ว

ตอนนี้ดูเหมือนว่าผู้แข่งขันทั้งสองในพื้นที่นี้คือ CUDA และ OpenCL ฉันต้องการทราบ:

  • OpenCL ยังใช้งานได้จาก Java บน Windows / Mac หรือไม่
  • ไลบรารีมีวิธีใดบ้างในการเชื่อมต่อกับ OpenCL / CUDA
  • การใช้ JNA เป็นตัวเลือกโดยตรงหรือไม่?
  • ฉันลืมอะไรไปหรือเปล่า?

ชื่นชมประสบการณ์ / ตัวอย่าง / เรื่องราวสงครามในโลกแห่งความเป็นจริง


1
ฉันคิดว่าการเขียนโปรแกรม GPU ใน Java จะเป็นเรื่องยากเมื่อพิจารณาว่าฉันใช้พอยน์เตอร์ในการเขียนโปรแกรม cuda มากแค่ไหน ฉันไม่ทราบว่าการใช้ Java ในการเขียนโปรแกรมอุปกรณ์จะมีประโยชน์มากหรือไม่เนื่องจากคุณไม่น่าจะมีการใช้งานคุณสมบัติ / ไลบรารี Java แบบเต็มซึ่งทำให้ Java แตกต่างจาก C ++
Anycorn

2
ฉันเคยเห็นการสาธิต Java ที่น่าประทับใจซึ่งใช้ GLSL และอาจเป็น CUDA ดังนั้นจึงเป็นไปได้อย่างแน่นอน
Frederik

1
คุณตรวจสอบ jcuda.org และ jocl.org หรือไม่
bakkal

1
ฉันรู้เกี่ยวกับพวกเขา แต่ฉันไม่สามารถตัดสินคุณภาพได้ คุณมีประสบการณ์กับพวกเขาบ้างไหม?
Frederik

4
@Nils: และด้วยเหตุนี้เขาจึงต้องการผลักดันตัวเลขทั้งหมดที่กระทืบบน GPU ... อย่างไรก็ตามแม้แต่ C หรือ x86 asm ธรรมดาก็มีงานหนักในการแข่งขันกับโปรเซสเซอร์ขนานข้อมูลขนาดใหญ่เช่น GPU
Stringer

คำตอบ:


62

AFAIK, JavaCL / OpenCL4Javaเป็นการรวม OpenCL เพียงตัวเดียวที่พร้อมใช้งานบนทุกแพลตฟอร์มในขณะนี้ (รวมถึง MacOS X, FreeBSD, Linux, Windows, Solaris ทั้งหมดในรุ่น Intel 32, 64 บิตและ ppc ด้วยการใช้JNA )

มีการสาธิตที่ทำงานได้ดีจริงจาก Java Web Start อย่างน้อยบน Mac และ Windows (เพื่อหลีกเลี่ยงข้อขัดข้องแบบสุ่มบน Linux โปรดดูหน้าวิกินี้เช่นParticles Demoนี้

นอกจากนี้ยังมาพร้อมกับระบบสาธารณูปโภคไม่กี่ (GPGPU รุ่นจำนวนสุ่มลดขนานพื้นฐานพีชคณิตเชิงเส้น) และสกาล่า DSL

ในที่สุดก็ผูกที่เก่าแก่ที่สุดที่มีอยู่ (ตั้งแต่เดือนมิถุนายน 2009) และก็มีชุมชนผู้ใช้ที่ใช้งานอยู่

(ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนของJavaCL :-))


ฉันตื่นเต้นมากสำหรับ JNLP แต่ดูเหมือนว่ามันจะไม่เหมือนกับ macbook ของฉัน มากสำหรับข้ามแพลตฟอร์ม
Karl

5
@Karl โอ้ขอโทษฉันทำลาย JNLP (JAR เพิ่งเปลี่ยนชื่อ)! ตอนนี้ได้รับการแก้ไขแล้วหวังว่าคุณจะลองอีกครั้ง ... (และข้ามแพลตฟอร์มอย่างชาญฉลาด: มันเสียอย่างสม่ำเสมอในทุกแพลตฟอร์ม ;-))
zOlive

3
การเพิ่มความปลอดภัยล่าสุดใน Java 7 ทำให้ Particle Demo Web Start ล้มเหลวโดยมีข้อยกเว้น
Thorbjørn Ravn Andersen

@zOlive ลิงก์ JavaCl สุดท้ายไปยังรหัส Google ไม่สามารถใช้ได้อีกต่อไป
tryman

34

นอกจากนี้คุณยังอาจพิจารณาAparapi ช่วยให้คุณสามารถเขียนโค้ดของคุณใน Java และจะพยายามแปลง bytecode เป็น OpenCL ในขณะรันไทม์

การเปิดเผยข้อมูลทั้งหมด ฉันเป็นผู้พัฒนา Aparapi


aparapi ยังคงรักษาอยู่หรือไม่?
Mr Jedi

@MrJedi: ฉันคิดอย่างนั้นการกระทำล่าสุดบน github มีอายุเพียงบางวันเท่านั้น: github.com/aparapi/aparapi
Aydin K.

มัน "ค่อนข้างคง";) ฉันเป็นผู้ดูแล
barneypitt

12

CUDA คือการแก้ไข C เพื่อเขียนเคอร์เนล CUDA คุณต้องเขียนโค้ดใน C จากนั้นคอมไพล์เป็นรูปแบบที่เรียกใช้งานได้ด้วยคอมไพเลอร์ CUDA ของ nvidia โค้ดเนทีฟที่สร้างขึ้นสามารถเชื่อมโยงกับ Java โดยใช้ JNI ในทางเทคนิคแล้วคุณไม่สามารถเขียนโค้ดเคอร์เนลจาก Java ได้ มี JCUDA http://www.jcuda.de/jcuda/JCuda.htmlซึ่งมี apis ของ cuda สำหรับการจัดการหน่วยความจำ / อุปกรณ์ทั่วไปและวิธีการบางอย่างของ Java ที่ใช้ใน CUDA และ JNI ที่ห่อหุ้มไว้ (FFT วิธีพีชคณิตเชิงเส้นบางวิธี .. ฯลฯ ฯลฯ .. ).

ในทางกลับกัน OpenCL เป็นเพียง API เคอร์เนล OpenCL เป็นสตริงธรรมดาที่ส่งผ่านไปยัง API ดังนั้นการใช้ OpenCL จาก Java คุณควรจะระบุเคอร์เนลของคุณเองได้ OpenCL ผูกพันสำหรับ Java สามารถพบได้ที่นี่http://www.jocl.org/


2
หาก JNA ( jna.dev.java.net ) ได้รับการสนับสนุนบนแพลตฟอร์มของคุณฉันจะใช้สิ่งนั้นเพื่อเรียกใช้โค้ดเนทีฟเนื่องจากใช้ความพยายามน้อยกว่าการเข้ารหัสไลบรารี JNI มาก
mdma

11

ฉันใช้ JOCL และฉันมีความสุขมากกับมัน

ข้อเสียเปรียบหลักของ OpenCL ผ่าน CUDA (อย่างน้อยสำหรับฉัน) คือไม่มีไลบรารีที่พร้อมใช้งาน (Thrust, CUDPP ฯลฯ ) อย่างไรก็ตาม CUDA สามารถย้ายไปยัง OpenCL ได้อย่างง่ายดายและการดูว่าไลบรารีเหล่านั้นทำงานอย่างไร (อัลกอริทึมกลยุทธ์ ฯลฯ ) นั้นดีมากเมื่อคุณได้เรียนรู้มากมายกับมัน


7

ฉันรู้ว่ามันสายไป แต่ลองดูที่https://github.com/pcpratts/rootbeer1

ฉันไม่ได้ทำงานด้วย แต่ดูเหมือนว่าจะใช้งานง่ายกว่าโซลูชันอื่น ๆ

จากหน้าโครงการ:

Rootbeer เป็นขั้นสูงกว่า CUDA หรือ OpenCL Java Language Bindings ด้วยการเชื่อมโยงผู้พัฒนาจะต้องจัดลำดับกราฟของวัตถุที่ซับซ้อนให้เป็นอาร์เรย์ของประเภทดั้งเดิม ด้วย Rootbeer สิ่งนี้จะทำโดยอัตโนมัติ นอกจากนี้ด้วยการผูกภาษาผู้พัฒนาต้องเขียนเคอร์เนล GPU ใน CUDA หรือ OpenCL ด้วย Rootbeer การวิเคราะห์แบบคงที่ของ Java Bytecode จะเสร็จสิ้น (โดยใช้ Soot) และโค้ด CUDA จะถูกสร้างขึ้นโดยอัตโนมัติ



1

หากคุณต้องการประมวลผลภาพหรือการดำเนินการทางเรขาคณิตคุณอาจต้องการไลบรารีพีชคณิตเชิงเส้นที่รองรับ gpu (เช่น CUDA เป็นต้น) ฉันขอแนะนำให้คุณแม่มด ND4J เป็นพีชคณิตเชิงเส้นที่รองรับ CUDA GPU ซึ่งสร้าง DeepLearning4J โดยที่คุณไม่ต้องจัดการกับ CUDA โดยตรงและต้องใช้รหัสระดับต่ำใน c นอกจากนี้หากคุณต้องการทำสิ่งต่างๆมากขึ้นด้วยภาพด้วย DL4J คุณจะสามารถเข้าถึงการประมวลผลภาพเฉพาะเช่นการแปลงภาพ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.