[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