[R-sig-dyn-mod] compiled code and parallel computing with deSolve
Thomas Petzoldt
thomas.petzoldt at tu-dresden.de
Thu Nov 9 17:21:42 CET 2017
Hi,
if I understand you correctly, then you want to use "top level
parallelization". It means that R starts several R instances as child
processes, each process can call its own ode().
What I do is creating an ordinary function (lets say "foo") that gets
all the necessary data (!) and packages (!) and that calls ode() with
the appropriate dll. Then a parallelizer, e.g. parLapply calls this
function "foo".
Package "growthrates" (https://github.com/tpetzoldt/growthrates/) uses
such a mechanism for fitting parametric models in parallel. The function
to be fitted can be given in closed form, as an R ODE or a compiled ODE
-- it does not matter at the top level.
Please check if your R child processes get all relevant data, including
the event function.
Thomas
Am 09.11.2017 um 14:18 schrieb Simeon Lisovski:
> Hallo,
>
>
>
> I am having problems with some of my code that uses compiled code (C) within
> the "ode" function.
>
>
>
> For an optimization routine, I need to run a particular ODE in each
> iteration and with multiple parameters to find a solution that is then
> incorporated in the main function. To speed things up I was trying to run
> this step in parallel (using the parallel package). However, I cannot find a
> way to export the compiled code to the nodes so that it`ll become available
> for the ode function. On a mac the mcmcApply function is doing the trick,
> but I cannot get it to work on a windows computer.
>
>
>
> The basic idea for code (not reproducible since that would require very long
> code):
>
>
>
> dyn.load(model.dll) ## c-code with functions "dem", "initforc" and "event"
>
>
>
> event_times <- c(1,5,10,15)
>
> t_fnc <- function(t) {.}
>
>
>
> parallel::makeCluster(nr.cores)
>
> parallel::clusterSetRNGStream(mycl)
>
> parallel::clusterEvalQ(mycl, library("deSolve"))
>
> parallel::clusterExport(mycl,c("event_times", "t_fnc"), envir=environment())
>
>
>
> mu <- seq(0.01, 0.1, length = 100)
>
>
>
> fnc <- function(x, ..) {
>
> parms <- c(alpha = x, . )
>
> out <- ode(y = xstart, t, func = "popM", parms = parms,
>
> dllname = "dem", initforc = "initforc",
>
> forcings = list(t, t_fnc(t)),
>
> initfunc = "initmod", nout = 0,
>
> events = list(func = "event", times =
> event_times),
>
> method = rkMethod("rk34f")
>
> out
>
> }
>
>
>
> parallel::parSapply(mycl, mu, FUN = fnc, .)
>
>
>
>
>
> This won`t work and R complains that event$func should be loaded.
>
>
>
> Any thoughts?
>
>
>
> Thanks,
>
> Simeon
>
>
More information about the R-sig-dynamic-models
mailing list