简体   繁体   English

从Java运行本机MPI代码

[英]Running Native MPI code from java

I am trying to run a simple native mpi code from java which I need later for my project. 我试图从Java运行一个简单的本机mpi代码,以后我的项目需要它。 I am using Ubuntu. 我正在使用Ubuntu。 I have: 我有:

HelloJNI.java HelloJNI.java

public class HelloJNI {
 static {
   System.loadLibrary("hello");
 }

 private native void sayHello();

 public static void main(String[] args) {
   new HelloJNI().sayHello();  // invoke the native method
 }
}

The header file: 头文件:

 JNIEXPORT void JNICALL Java_HelloJNI_sayHello (JNIEnv *, jobject);

The C source file: C源文件:

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject     thisObj) {
printf("Hello World- MPI from C!\n");
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf("Hello world from processor %s, rank %d"
      " out of %d processors\n",
      processor_name, world_rank, world_size);
MPI_Finalize();
}

I have followed this tutorial: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html 我遵循了本教程: https : //www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html

I am able to create the shared library through the make file which is: 我可以通过以下make文件创建共享库:

INCLUDE1 = /usr/lib/java/jdk1.8.0_45/include
INCLUDE2 = /usr/lib/java/jdk1.8.0_45/include/linux
MPI_INCLUDE = /home/openmpi-1.8.5/ompi/include
JAVAHPATH = /usr/lib/java/jdk1.8.0_45/bin
MPICC = /home/openmpi-1.8.5/bin/mpicc
# Define a variable for classpath
CLASS_PATH = ../bin

# Define a virtual path for .class in the bin directory
vpath %.class $(CLASS_PATH)

all : libhello.so

# $@ matches the target, $< matches the first dependancy
libhello.so : HelloJNI.o
${MPICC} $< -L/home/openmpi-1.8.5/lib -lmpi -shared -fpic -o $@ -Wl,-   rpath=/home/openmpi-1.8.5/lib 

# $@ matches the target, $< matches the first dependancy
HelloJNI.o : HelloJNI.c HelloJNI.h
${MPICC} -fpic -I$(INCLUDE1) -I$(INCLUDE2) -I$(MPI_INCLUDE) -c $< -o $@

# $* matches the target filename without the extension
HelloJNI.h : HelloJNI.class     
    $(JAVAHPATH)/javah -classpath $(CLASS_PATH) $*


clean :
      rm HelloJNI.h HelloJNI.o libhello.so

The problem is when I try to run it I am having these MPI errors: 问题是,当我尝试运行它时,出现以下MPI错误:

"mca: base: component_find: unable to open /home/openmpi-1.8.5/lib/openmpi/mca_shmem_sysv: /home/openmpi-1.8.5/lib/openmpi/mca_shmem_sysv.so: undefined symbol: opal_show_help (ignored)
mca: base: component_find: unable to open /home/openmpi-1.8.5/lib/openmpi/mca_shmem_mmap: /home/openmpi-1.8.5/lib/openmpi/mca_shmem_mmap.so: undefined symbol: opal_show_help (ignored)
mca: base: component_find: unable to open /home/openmpi-1.8.5/lib/openmpi/mca_shmem_posix: /home/openmpi-1.8.5/lib/openmpi/mca_shmem_posix.so: undefined symbol: opal_shmem_base_framework (ignored)
It looks like opal_init failed .....orte_init failed ..... mpi_init  failed"

I have tried various things so far both from command line and using eclipse which are: Using Eclipse: 到目前为止,无论是从命令行还是使用eclipse,我都尝试过各种方法:使用Eclipse:

  • Added the shared library path via -Djava.library.path in the VM Argument in the run configuration 通过运行配置中VM参数中的-Djava.library.path添加了共享库路径
    • Also through LD_LIBRARY_PATH as in Environment and also in bashrc 同样通过LD_LIBRARY_PATH,如环境和bashrc中一样
    • In the makefile I have tried to compile the shared library using mpicc 在makefile中,我尝试使用mpicc编译共享库
    • I have added the mpi.jar to the project as well 我也已将mpi.jar添加到项目中

Using command line: 使用命令行:

  • javac -cp /home/s3050004/Downloads/openmpi-1.8.5/lib/mpi.jar HelloJNI.java javac -cp /home/s3050004/Downloads/openmpi-1.8.5/lib/mpi.jar HelloJNI.java
  • java -Djava.library.path=/home/workspace/HelloJNI/jni:/home/openmpi-1.8.5/lib -cp /home/openmpi-1.8.5/lib/mpi.jar:/home/workspace/HelloJNI/src HelloJNI java -Djava.library.path = / home / workspace / HelloJNI / jni:/home/openmpi-1.8.5/lib -cp /home/openmpi-1.8.5/lib/mpi.jar:/home/workspace/HelloJNI / src HelloJNI

In the command line I am trying to do the same as in eclipse which is specifying path to the shared library and the mpi lib also specfying the mpi.jar and the trying to run the HelloJNI but I get the same errors. 在命令行中,我尝试执行与eclipse中相同的操作,即指定共享库的路径,并且mpi lib也指定了mpi.jar并尝试运行HelloJNI,但出现相同的错误。 I am not sure why I am getting these errors and I want to understand why I am getting them. 我不确定为什么会收到这些错误,并且我想了解为什么会收到这些错误。 I will really appreciate any suggestions or ideas towards this. 我将非常感谢对此的任何建议或想法。

它已得到修复,这是OpenMPI的问题,我用它重新安装并重新配置了它,并且可以正常工作:

--enable-shared --enable-static 

It looks like the java failed to load all dependencies of your libhello.so 看来Java无法加载libhello.so的所有依赖项

Please check that dependencies could be loaded by ldd: 请检查是否可以通过ldd加载依赖项:

ldd libhello.so

If not, 如果不,

  1. create symbolic links for openmpi libraries 为openmpi库创建符号链接

    ldconfig -n folder with openmpi .so files 带有openmpi .so文件的 ldconfig -n 文件夹

  2. add that path to the LD_LIBRARY_PATH 将该路径添加到LD_LIBRARY_PATH

  3. and try ldd libhello.so again 然后再次尝试ldd libhello.so

Once it starts loading by ldd, it will work from java. 一旦它开始通过ldd加载,它将从Java运行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM