       Re: Compilation: Avoiding inlining

• To: mathgroup at smc.vnet.net
• Subject: [mg121485] Re: Compilation: Avoiding inlining
• From: Oliver Ruebenkoenig <ruebenko at wolfram.com>
• Date: Fri, 16 Sep 2011 07:07:40 -0400 (EDT)
• Delivered-to: l-mathgroup@mail-archive0.wolfram.com
• References: <201109160946.FAA12301@smc.vnet.net>

On Fri, 16 Sep 2011, DmitryG wrote:

> Here is a program with (* Definition of the equations *) made one-
> step, that performs the same as in my previous post:
>
> **************************************************************************
>
> (* Runge-Kutta-4 routine *)
> makeCompRK[fIn_] :=
>  With[{f = fIn},
>   Compile[{{x0, _Real,
>      1}, {t0, _Real}, {tMax, _Real}, {n, _Integer}},
>    Module[{h, K1, K2, K3, K4, SolList, x = x0, t},
>     h = (tMax - t0)/n;
>     SolList = Table[x0, {n + 1}];
>     Do[t = t0 + k h;
>      K1 = h f[t, x];
>      K2 = h f[t + (1/2) h, x + (1/2) K1];
>      K3 = h f[t + (1/2) h, x + (1/2) K2];
>      K4 = h f[t + h, x + K3];
>      x = x + (1/6) K1 + (1/3) K2 + (1/3) K3 + (1/6) K4;
>      SolList[[k + 1]] = x
>
>      , {k, 1, n}];
>     SolList](*,CompilationTarget->"C"*)]];
>
> (* Definition of the equations *)
> NN = 100;
> F = Function[{t, x},  Evaluate[ Table[-x[[i]] Sin[ 0.3 t]^2/(1 + 100
> Sum[x[[i + j]], {j, 1, Min[3, NN - i]}]^2), {i, 1, NN}]]];
> Print[]
>
> (* Compilation *)
> tt0 = AbsoluteTime[];
> Timing[RK4Comp = makeCompRK[F];]
> AbsoluteTime[] - tt0
> Print[];
>
> (* Setting parameters and Calculation *)
> x0 = Table[ RandomReal[{0, 1}], {i, 1, NN}];   t0 = 0;    tMax =
> 200;   n = 500;
> tt0 = AbsoluteTime[];
> Sol = RK4Comp[x0, t0, tMax, n];
> AbsoluteTime[] - tt0
>
> Print["Compilation: ", Developer`PackedArrayQ@Sol]
>
> (* Plotting time dependences *)
>
> x1List = Table[{1. t0 + (tMax - t0) k/n, Sol[[k + 1, 1]]}, {k, 0,
> n}];
> x2List = Table[{1. t0 + (tMax - t0) k/n, Sol[[k + 1, 2]]}, {k, 0, n}];
> x3List = Table[{1. t0 + (tMax - t0) k/n, Sol[[k + 1, 3]]}, {k, 0, n}];
> ListLinePlot[{x1List, x2List, x3List}, PlotMarkers -> Automatic,
> PlotStyle -> {Blue, Green, Red}, PlotRange -> {0, 1}]
>
> **********************************************************
>
> As I understand, it is the command Evaluate that is responsible for
> inlining, making the size of the compiled code grow with NN and
> impossibility to compile in C. However, the program compiled with
> Mathematica runs fast.
>
> Removing Evaluate makes the compiled code small and independent of NN,
> also compiling in C becomes possible. In this case, unfortunately, the
> program runs slowly.
>
> Dmitry
>
>

Most likely due to call backs to Mathematica, you could check that with
CompilePrint.

Oliver

• Prev by Date: Re: Compilation: Avoiding inlining
• Next by Date: Re: passing Indeterminate and Infinity to C via MathLink
• Previous by thread: Re: Compilation: Avoiding inlining
• Next by thread: Re: Compilation: Avoiding inlining