[R-sig-dyn-mod] compiled code and parallel computing with deSolve

Simeon Lisovski simeon.lisovski at googlemail.com
Fri Nov 10 12:05:00 CET 2017


Fantastic, thanks Thomas. 

Works like a charm and so much faster!


-----Ursprüngliche Nachricht-----
Von: Thomas Petzoldt [mailto:thomas.petzoldt at tu-dresden.de] 
Gesendet: Thursday, 9 November 2017 17:22
An: Special Interest Group for Dynamic Simulation Models in R
Cc: Simeon Lisovski
Betreff: Re: [R-sig-dyn-mod] compiled code and parallel computing with deSolve

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