[R] Using Fortran with MPI, RInside, and calling R functions

Erin Hodgess erinm.hodgess at gmail.com
Sat Feb 27 21:00:23 CET 2016


Hello again.

This time, I would like to add MPI to my Fortran program.  Here are the
Fortran and C++ codes:

program buzzy
   use iso_c_binding
  implicit none
  include '/opt/openmpi/include/mpif.h'




  integer :: rank,size,ierror,tag,status(MPI_STATUS_SIZE), i,np
  integer :: argc = 1000000
  real :: x,tot1
  character(len=32) :: argv


      INTERFACE
         SUBROUTINE R_FUN(argc,argv) bind(C, name="buzzyC")
           use iso_c_binding
        character(kind=c_char), INTENT(INOUT) :: argv
        INTEGER(kind=c_int), INTENT(IN) :: argc

      END SUBROUTINE R_FUN
    END INTERFACE

      call MPI_INIT(ierror)
      call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ierror)
      call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierror)




        print *, "Fortran Calling RInside",rank
    CALL R_FUN (argc,argv)
    print *,rank

    call MPI_FINALIZE(ierror)

  end program buzzy

and

#include <iostream>
#include <RInside.h>

void buzzyC_(int argc,char *argv[]);

extern "C" void buzzyC(int argc,char *argv[]) {

    // create an embedded R instance
  RInside R(argc,argv);

    // convert to string for RInside assignment


    // eval the string, give R notice
  R.parseEvalQ("cat(mean(rnorm(argc))");
}

Now my steps for compiling and linking are the following:

erin at erin-Bonobo-Extreme:~$ mpif90 -c buzzy.f90
erin at erin-Bonobo-Extreme:~$ mpic++ buzzyC.cpp -c
-I/home/erin/R/x86_64-pc-linux-gnu-library/3.2/RInside/include
-I/home/erin/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include
-I/usr/share/R/include -libstdc++
erin at erin-Bonobo-Extreme:~$ mpifort -o fcra buzzy.o buzzyC.o
-L/usr/lib/R/lib -lR -L
/home/erin/R/x86_64-pc-linux-gnu-library/3.2/RInside/lib -lRInside
-L/home/erin/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/libs/
-Wl,-rpath,/home/erin/R/x86_64-pc-linux-gnu-library/3.2/RInside/lib/
-lRInside
-Wl,-rpath,/home/erin/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/libs/ -lstdc++
/usr/lib/x86_64-linux-gnu/libstdc++.so.6

So far so good
But when I run this, disaster strikes:

erin at erin-Bonobo-Extreme:~$ mpirun -np 4 ./fcra
 Fortran Calling RInside           0
 Fortran Calling RInside           1
 Fortran Calling RInside           3
 Fortran Calling RInside           2

Program received signal SIGSEGV: Segmentation fault - invalid memory
reference.

Backtrace for this error:

Program received signal SIGSEGV: Segmentation fault - invalid memory
reference.

Backtrace for this error:
#0  0x7FC59706CE48
#1  0x7FC59706BFD0
#2  0x7FC596AA52EF
#3  0x7FC596AFB69A
#4  0x7FC597C5E8E8
#5  0x7FC5979671E8
#6  0x7FC5979677A1
#7  0x402A55 in buzzyC
#8  0x402891 in MAIN__ at buzzy.f90:?
#0  0x7F2482294E48
#1  0x7F2482293FD0
#2  0x7F2481CCD2EF
#3  0x7F2481D2369A
#4  0x7F2482E868E8
#5  0x7F2482B8F1E8
#6  0x7F2482B8F7A1
#7  0x402A55 in buzzyC
#8  0x402891 in MAIN__ at buzzy.f90:?
--------------------------------------------------------------------------
mpirun noticed that process rank 1 with PID 2188 on node
erin-Bonobo-Extreme exited on signal 11 (Segmentation fault).
--------------------------------------------------------------------------
erin at erin-Bonobo-Extreme:~$

Maybe I should be asking:  is this even possible, please?

Thanks,
Erin


-- 
Erin Hodgess
Associate Professor
Department of Mathematical and Statistics
University of Houston - Downtown
mailto: erinm.hodgess at gmail.com

	[[alternative HTML version deleted]]



More information about the R-help mailing list