[ADMB Users] Differences in speed of ADMB versions?
Derek Seiple
dseiple84 at gmail.com
Mon Apr 25 06:30:11 PDT 2011
The algorithms for matrix inverse and solving a linear system were
changed between versions 9 and 10.
In version 9 the algorithms were essentially straight from Numerical
Recipes in C. In version 10 they were rewritten to use a new class
which does LU-Decomposition, cltudecomp_for_adjoint
In version 9 you have
> 2.20 26.82 1.56 solve(dvar_matrix const&, dvar_vector const&, ...
as one of the top functions called. Can you tell me which one exactly
this one is, there are a couple solve functions. If it is the one I am
thinking of there is a chance that the new code is making more use of
the LU-Decomp classes than maybe it should (at least this is what
your profiles and other peoples comments suggest to me).
Derek
On Sun, Apr 24, 2011 at 8:41 PM, Arni Magnusson <arnima at hafro.is> wrote:
> Whenever a new version of ADMB comes out, I do a quick benchmark with the
> 'catage' example. Recent versions of ADMB have shown very similar
> performance:
>
> catage -mcmc 100000 -mcsave 100
> 9.1-440 18 sec
> 10.0-450 18 sec
> 10.1-450 18 sec
>
> But like Tim and Allan, I do see a worrisome pattern in the 'vol' example,
>
> vol -nohess
> 9.1-440 172 84
> 10.0-450 488 254
> 10.1-450 498 254
>
> where 9.1-440 means ADMB 9.1 on MinGW GCC 4.4.0, and the columns show how
> many seconds it takes to run n2mvol -gbs 500000000 and -nohess. Looks like
> things got almost 3 times slower between ADMB 9 and 10. Or is this just a
> matter of running the model with the right -options?
>
> I've used the 'gprof' tool that comes with GCC to see how much time is spent
> on each function call. These are the top 10 calls in the "healthy" 9.1-440
> profile,
>
> % cumu self call
> 12.23 8.67 8.67 DF_FILE::fread(void*, unsigned int)
> 10.68 16.24 7.57 DF_FILE::fwrite(void*, unsigned int)
> 4.06 19.12 2.88 dmdv_solve()
> 3.15 21.35 2.23 dfinvpret()
> 3.13 23.57 2.22 dvector::allocate(int, int)
> 2.38 25.26 1.69 dfpool::free(void*)
> 2.20 26.82 1.56 solve(dvar_matrix const&, dvar_vector const&, ...
> 2.19 28.37 1.55 dvector::operator=(dvector const&)
> 2.09 29.85 1.48 vector_shapex::operator new(unsigned int)
> 1.88 31.18 1.33 operator new(unsigned int)
> ...
> 0.00 70.88 0.00
>
> and this is the "slow" 10.1-450 profile:
>
> % cumu self call
> 5.82 9.42 9.42 DF_FILE::fread(void*, unsigned int)
> 5.26 17.94 8.52 DF_FILE::fwrite(void const*, unsigned int)
> 4.20 24.74 6.80 dmatrix::deallocate()
> 3.32 30.12 5.38 cltudecomp_for_adjoint::ludecomp_pivot_for_...
> 2.90 34.81 4.69 dvector::~dvector()
> 2.79 39.32 4.51 grad_stack::set_gradient_stack1(void (*)(), ...
> 2.69 43.67 4.35 cltudecomp_for_adjoint::ludecomp_pivot_for_...
> 2.54 47.79 4.12 dvector::allocate(int, int)
> 2.52 51.87 4.08 operator new(unsigned int)
> 2.47 55.87 4.00 ivector::~ivector()
> ...
> 0.00 161.91 0.00
>
> The first two read/write calls are not that different, but then we see a lot
> of time spent on low-level constructors and destructors for matrices and
> vectors. Is it possible that some matrix operators were doing things more
> economically in ADMB 9 than in 10?
>
> Arni
> _______________________________________________
> Users mailing list
> Users at admb-project.org
> http://lists.admb-project.org/mailman/listinfo/users
>
More information about the Users
mailing list