Re: Compilation: Avoiding inlining
- To: mathgroup at smc.vnet.net
- Subject: [mg121558] Re: Compilation: Avoiding inlining
- From: Oliver Ruebenkoenig <ruebenko at wolfram.com>
- Date: Mon, 19 Sep 2011 07:07:49 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201109171027.GAA26060@smc.vnet.net>
On Sat, 17 Sep 2011, DmitryG wrote: > Hi Oliver, > > thank you for your response! I am interested now in the systems of > equations that are non-vectorizable. By mistake, in my first post I > have used a system of equations that can be vectorized and this turned > the discussion away from the topic. But in my second post, I have a > non-vectorizable system of equations. > > I have identified three ways to define the system of equations. Below > are the results with Mathematica compilation. > > 1) > (* Definition of the equations *) > NN = 1000; > F = Function[{t, x}, Table[ -x[[i]] Sin[0.1 t]^2/(1 +100 Sum[x[[i + > j]], {j, 1, Min[3, NN - i]}]^2), {i, 1, NN}]]; > >>> Evaluation time 24.4983979 - slow execution. No inlining. Compiled code 189 lines independently of NN. Compilation in C gives practically the same speed > > 2) > (* Definition of the equations *) > NN = 1000; > F = Function[{t, x}, Table[ Unevaluated[-x[[i]] Sin[0.1 t]^2/(1 +100 > Sum[x[[i + j]], {j, 1, Min[3, NN - i]}]^2)], {i, 1, NN}]]; > >>> Evaluation time 4.7582721. No inlining. Compiled code 93 lines independently of NN. Compilation in C gives practically the same speed > > 3) > (* Definition of the equations *) > NN = 1000; > F = Function[{t, x}, Evaluate[Table[ -x[[i]] Sin[0.1 t]^2/(1 +100 > Sum[x[[i + j]], {j, 1, Min[3, NN - i]}]^2), {i, 1, NN}]]]; > >>> Evaluation time 1.0680555 - fastest execution. Here we have inlining of the code, the size of the compiled code increases with NN. Compilation in C is impossible. > > > One can see that there are many different ways with very different > results, and it is very important to find the best one - more > important than to buy a faster computer;-)) > > Does in make sense to introduce F as a compiled function, as you have > done in your response? We already make compilation of the RK-4 > procedure with F injected into it. > > Best, > > Dmitry > > Dmitry, here is a version that, I hope, is a little less trick to understand: ClearAll[makeCompRK] makeCompRK[f_] := 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"*) , CompilationOptions -> {"InlineCompiledFunctions" -> True}] Concerning the function: NN = 1000; cRHS = With[{NN = NN}, Compile[{{t, _Real, 0}, {x, _Real, 1}}, -x* Sin[0.1 t]^2/ Table[(1 + 100 Sum[x[[i + j]], {j, 1, Min[3, NN - i]}]^2), {i, 1, NN}](*,CompilationTarget->"C"*)]]; Needs["CompiledFunctionTools`"] (*CompilePrint[cRHS]*) (*Compilation*) tt0 = AbsoluteTime[]; Timing[RK4Comp2 = makeCompRK[cRHS];] AbsoluteTime[] - tt0 (* CompilePrint[RK4Comp2] *) (* switch inling to True/False to see what is happening *) (*Setting parameters and Calculation*)x0 = Table[RandomReal[{0, 1}], {i, 1, NN}]; t0 = 0; tMax = 100; n = 500; tt0 = AbsoluteTime[]; Sol2 = RK4Comp2[x0, t0, tMax, n]; AbsoluteTime[] - tt0 needs about 0.7s to run to completion, your fastest code needs about 1s on my computer. The .. -> "C" version about needs about 0.12s on my computer. Hope this helps, Oliver
- References:
- Re: Compilation: Avoiding inlining
- From: DmitryG <einschlag@gmail.com>
- Re: Compilation: Avoiding inlining