hadoop通过JNI调用cuda程序

来源:互联网 发布:mysql恢复数据库 命令 编辑:程序博客网 时间:2024/06/05 11:23

一、通过JNI,将C写成的cuda编译成动态链接库

1、 写一个java类,类中包含一个native的函数,导入.so动态链接库,注意,linux中,SiftGPU其实指的是libSiftGPU.so。


2、javac编译这个类生成.class文件,我直接用eclipse编译了。

3、在项目目录下的./bin文件目录下,使用如下命令,生成C++函数的头文件

javah -jni -classpath . nfs.sil.image.sift.main.FeatureExtractSIFT_GPU

在该目录下会出现一个nfs_sil_image_sift_main_FeatureExtractSIFT_GPU.h的头文件,文件内容如下


4、实现nfs_sil_image_sift_main_FeatureExtractSIFT_GPU.cu,实现.h中的C++函数

5、编译,生成动态链接库

先把所有的.cu文件用nvcc编译成.o文件

最后 gcc -Wall -rdynamic 'pkg-config --cflags opencv' -fopenmp -shared -L/home/OpenCV-2.4.3/lib -lopencv_core -lopencv_highgui -L/usr/local/cuda/lib -lcudart -o libSiftGPU.so $(ALL)


二、使用hadoop运行程序

注意,在需要运行的类中包含,将一些参数分析交给GenericOptionsParser做。

GenericOptionsParser parser = new GenericOptionsParser(conf, args);
String[]otherArgs = parser.getRemainingArgs();

运行命令

hadoop jar imageRetrieval.jar nfs.sil.image.sift.index.SiftHadoopImageIndexer  -files libSiftGPU.so images index

-files意思是把libSiftGPU.so拷贝到工作机上。

另一个可行的办法是,手动将libSiftGPU.so拷贝到java.library.path所指向的文件夹下

咳咳,这种方法比较暴力~~




原创粉丝点击