我们有一个原生 c/asm
应用程序,利用 GPU(OpenCL) 使用特定方法处理大型 加密/解密
数据,它运行完美,没问题. JEE
正在开发一部分项目(web和distribution),我们只需要调用native application/library即可。
我们尝试使用 Process
类将其称为分离的外部进程。问题是我们无法控制应用程序(事件、处理程序、线程等)。我们还尝试将 C 代码转换为 Java 代码,但性能下降了。除了将 native 代码作为进程运行之外,我正在考虑 JNA 和 JNI,但有一些问题。
问题:
- 为了更好(更快)的读/写解决方案,是否可以在 JNI 和 JNA 中通过直接(非托管)内存 [Java(
ByteBuffer#allocateDirect()
)] 交换数据?< - 是否可以通过原生代码管理和处理进程,通过 Java 代码(OpenCL lib)访问 GPU(共享)内存?
- 性能如何? JNA 比 JNI 快吗?
我们在 Redhat Linux6 x64 上有两个 AMD W7000 集群设备。
最佳答案
JNA 比 JNI 慢得多,但更容易。如果性能不是问题,请使用 JNA。
使用直接缓冲区的优点是最关键的操作不使用 JNI 或 JNA,因此速度更快。他们使用内在的 when 意味着他们变成了单一的机器代码指令。
如果 Java 代码比 C 代码慢得多,则很可能代码没有得到足够的优化。一般来说,GPU 应该做所有的工作,所以如果 Java 有点慢,这应该没什么区别。
例如如果您将 99% 的时间花在 GPU 上,而 Java 花费两倍的时间,那么总速度会慢 99+2% 或 1%。
关于java - JNI 与 JNA 性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288909/