我的应用程序由在同一台计算机上运行 的两个组件组成:
1)一个瘦Java模块,可以处理简单的任务,如数据库持久性,流程请求等。
2)使用OpenCV和CUDA进行大量计算的C ++模块
说两个组件都独立启动。
步骤1: Java Layer的 init()方法调用C ++模块的 init()方法,该方法将从中读取数千个图像S3,进行一些图像处理并将结果保存在GPU内存中。init()仅被调用一次,并且该数据在GPU内存中保持不变。
第2步: Java层中对calc()的连续调用将调用C ++模块中的calc()方法,该方法使用传递的参数利用GPU内存上的数据进行一些处理,并将结果发送到Java层。
我的问题是如何在Java和C ++进程之间以较少的开销实现IPC?
一种明显的方法是使用TCP套接字(也许使用GRPC)
是否可以将JNI(或SWIG)用于这种IPC通信?
答案 0 :(得分:2)
我将假定应用程序等不是非常关键。然后,像Apache Thrift这样的RPC框架可能是理想的选择,因为它简化了RPC任务(基本上使用TCP连接进行通信)。通过本地TCP连接发回结果图像听起来不像会引起任何问题。 https://thrift.apache.org/
最小的开销是共享内存或内存映射文件。但是AFAIK要求您(还)需要做更多的工作才能实现。