我现在有一个有关算法的项目,UI与服务层都是用java写,但在Java上算法运行所消耗的时间过于漫长,我们决定将计算密集的部分(大概90%的CPU时间)移植到GPU上,使用CUDA进行计算。现在CUDA一切进展顺利,但现在的问题在于如何从java向cuda传递对象。我们考虑过JCUDA,只是JCUDA只能传递各种基本数据类型组成的数组,因此最终没有被启用。现在我们正在犹豫用什么技术,目前可选择的有JNI与CORBA,没有确定用哪一个。这是一个与效率高度相关的项目,因此java与下层的交互所需要的时间要尽可能的少,另外我们需要直接把java的对象传到底层,有没有人有这方面的经验,谢谢了

解决方案 »

  1.   

    没接触过楼主的那种,并发运算的项目。可能地理信息数据能够用到吧。
    不过,我觉得,
    1.从开发速度上来讲,使用现成的JCUDA要快一些。
    2.Java语言是针对应用软件而生的,对于底层数据的处理以及硬件设备的操纵,能力要弱很多。
        底层数据的处理,还是C/C++比较有优势,基本数据类型不丰富,可以采用结构体。
        但是,Java就要将内存对象,转换成字节数组(byte[])来与硬件交互信息。
    3.我还是推荐使用JCUDA的,如果非要放弃使用,那么JNI和CORBA,
        推荐使用JNI,效率可能要高,但是代码量可能要大。
        其实,中间还是存在Java对象向基本数据类型(byte[])转换的过程。
    所以,
    我建议,楼主使用JCUDA,你可以写一个TransformHelper类,
    完成Java对象向基本数据类型的转换过程,或者,辅助调用JCUDA的API。
      

  2.   

    谢谢,其实你说的JCUDA,我们上一周就在尝试使用JCUDA,但对象模型很复杂,类之间有继承关系,有时候还要用到多态,这么复杂的对象关系,用结构体模拟很困难。我们尝试了一周,想在结构体里面使用指向函数的指针模拟多态,甚至在里面嵌入了汇编指令,但最终还是失败了。所以JNI貌似还是可以接受的。
      

  3.   

    JNI本身就支持native层使用java层的对象