[Beowulf] Compiling mpiJava on Amd64.

Giuseppe Vitillaro giuseppe at vitillaro.org
Thu Jul 20 02:08:55 PDT 2006

Sorry to jump just in the middle of an existing thread,
but I was addressed here from Bernard Lee, that proposed
to me to help on the problem to have mpiJava on the 
x86_64 architecture.

I'm relativily new to this topic, so the solution I got
may look naive to you ... sorry to have bothered the list
if this is the case.

I found a couple of problems trying to compile mpiJava 1.2.5
under RHEL 4.2 on a x86_64 machine.

 (1) unknown architecture to the configure script

      the config/config.guess reports the machine
      as "x86_64-unknown-linuxoldld" that is not recognized
      from the configure script and not handled correctly
      for what I see

      I solved this problem just using the --target=i686-linux
      forcing the configure script to act in the same way
      it works for a i686 machine

 (2) -fPIC Posisition Indipendent Code problem

      for what I understand mpiJava is essentially
      a JNI wrapper to an MPI C library, so, it needs
      to get compiled in the shape of a shared library,
      at least under Linux, i.e. a ".so" library, that
      gets loaded into a running Java Virtual Machine

      so the mpiJava shared library libmpijava.so "must" be
      linked with the -shared option under Linux

      while on the i686 architecture a shared library can
      be linked mixing pic and nonpic objects on the x86_64
      architecture that is not possible, at least for what
      I understand; if you try, you get this error:

        relocation R_X86_64_32 against `a local symbol' can not be used 
            when making a shared object; recompile with -fPIC

      that imply that all the mpiJava objects for the libmpijava.so
      library "must" be compiled using -fPIC option ... otherwise
      ... well it doesn't link ...

      so I actually met two problems: I had to recompile
      the mpi library I was using (the RH default lam-7.0.6 was not pic)
      with the -fPIC flag to get a pic mpi library and be sure
      that libmpijava.so objects get compiled with -fPIC too;

      to achieve the first goal I just downloaded and recompiled
      the lam library 7.1.2 using a default ./configure --prefix

      the second one was easily solved with a "minor hack"
      to the mpiJava configure script: I used the DEFPINS
      mpiJava macro (that is used for other purpouses, but
      not used in my framework) to be sure that -fPIC flag
      go to mpiJava makefiles (I do not like to touch source
      code if I can)

      the complete solution looks like calling the mpiJava
      configure script in this way:

           CFLAGS=-fPIC DEFPINS=-fPIC ./configure --with-MPI=lam 

     once the -fPIC lam (read your preferred sup[ported MPI 
     implementation) is the first in your path

 (3) Java Virtual Machine implementation
     on my machine I have two versions of the Java SUN installed
     j2sdk1.4.2_10 (1.4 i686 32 bits) and jdk1.5.0_06 (1.5 x86_64 64 bits)

     the reason is easy to understand: for what I know SUN doesn't have
     an x86_64 1.4 implementation or at least ... it didn't have one
     at the time I installed Java on my machine

     if I try to compile mpiJava with the 1.4-i686 version ... using
     the defailt x86_64 gcc compiler ... what I get is that I'm trying
     to build an x86_64 shared library that a i686 Java Virtual Machine
     cannot load ... the JVM will simply report that it cannot find
     the file when "System.loadLibrary()" method is called

     so,  again there are two posibilities here:
        (a) using a i686 JVM and the gcc32 (gcc -m32) C compiler
            and essentially get a 32 bits i686 environment
            running on a x86_64 machine;

        (b) using an x86_64 JVM and the gcc C compiler
            and get a 64 bits x86_64 environment;

     I choosed to go through (a): it was easier and I think
     most of the mpiJava users would have a preference to
     have a complete x86_64 64 bits solution.

     Unfortunately I had not a JDK 1.4 x86_64 java environment
     available ... probably there are a non SUN around or perhaps
     SUN has or will publish one. I'm saying this because ... well
     I used a JDK 1.5 environment with a tools that declare to
     be tested just against a 1.4 JDK.

So my personal solution consists of these steps:

  (1) be sure to have an x86_64 JVM first in my path
      (it was 1.5 for me);

  (2) be sure to have a -fPIC x86_64 MPI implementation
      first in my path (it was LAM 7.1.2 fresh compiled for me);

  (3) use a "minor hack" on the mpiJava configure script
      called as:
         CFLAGS=-fPIC DEFPINS=-fPIC ./configure --with-MPI=lam

  (4) just following the guidelines in mpiJava README file.

I followed this path with mpiJava 1.2.5 and got it compiled
on RHEL 4.2 x86_64.

Problems are not over tough: the "make check" regression
test doesn't look good. Not all tests are passed correctly:
some test fail (although for what I see it passes the
basic ones).

This may depend from my Java version 1.5 (probably it would
be better to try with 1.4 x86_64 version first) or from others
subtle x86_64 from i686 porting problems that may manifest in this way.

I hope this may be useful to others to solve the problem,
sorry to have bothered the list with a so long message,

   Regards, G. Vitillaro



More information about the Beowulf mailing list