我应该使用什么 API 来支持 Java 中的 OpenCL。
我想知道这对性能最好
- JavaCL
- Aparapi(AMD 提供的 API)
- JOCL
是否需要 JavaCL 才能将 Java 字节码转换为 OpenCL,或者只是 Aparapi(AMD 提供的 API)可以做到。
据我了解,Aparapi 是唯一提供从字节码自动转换 OpenCL 的框架。RootBeer 为 CUDA 提供了类似的选项。
WRT 性能如果您准备手动调整 OpenCL 和/或知道如何利用 OpenCL 的一些更高级功能(本地内存、向量指令、重叠传输/调度),您可能会发现 JavaCL 或 JOCL 提供更多性能机会。
具体来说,如果您希望应用多个 OpenCL 内核(例如在管道中),您可以使用 JOCL/JavaCL 更轻松地最小化主机和 GPU 之间的缓冲区传输。Aparapi 在这里缺乏一些灵活性。
但是,我希望(并且已经观察到)大多数“简单”算法的性能在这三个框架之间非常相似。
如果您发现自己想要“调整”生成的 OpenCL(Aparapi 将允许您列出它生成的代码),或者发现您想要进行实验,我的建议(完全披露我是 Aparapi 发明者/初始贡献者)将是尝试 Aparapi对于重叠的缓冲区/传输或多内核调度,当您获得更多经验时,您总是可以切换到 JOCL/JavaCL。