[ADMB Users] vector vs loop and admb speed

dave fournier davef at otter-rsch.com
Thu Jan 31 19:28:12 PST 2013


On 13-01-31 06:55 PM, H. Skaug wrote:

Hi,

Your are missing the point. It is not the copy constructor.  The 
assignment operator
must do the equivalent of a deep copy (for rational behavior) The idea is to
convince it to do shallow copies in special cases.  However the 
assignment is inefficient in general
and the df1b2 stuff lacks many of the optimizations of the dvariable 
stuff, mainly because the
Norwegians wanted to do it on the cheap to screw non communist free 
enterpise individuals
where possible.

     Dave

> Hi,
>
> It appears to me that the copy constructor for df1b2matrix (see below)
> makes a shallow copy (but I may be wronge), and if so the inefficiency
> can be avoided.
>
> However, I take your point that we should go through the code
> and look for inefficiencies, and write documentation along the way.
> If you are willing to take a skype sesson on this I am happy to participate.
> If more a people with write access are willing to join the sessian
> that would be even better. 3-4 people should work fine on skype.
>
> Hans
>
>   Copy constructor:
> 00695 df1b2matrix::df1b2matrix(const df1b2matrix & x)
> 00696 {
> 00697   index_min=x.index_min;
> 00698   index_max=x.index_max;
> 00699   v=x.v;
> 00700   shape=x.shape;
> 00701   if (shape) (shape->ncopies)++;
> 00702 }
>
> On Thu, Jan 31, 2013 at 9:15 PM, dave fournier <davef at otter-rsch.com> wrote:
>> Without going through all this there is one extra overhead in vectorized
>> code which can be
>> avoided sometimes.  Consider something like
>>
>>       A=B+C
>>
>> where A,B, and C are matrix types.  The way this gets calculated is that the
>> function + calculates the sum of the
>> two matrices and stores this in a matrix, say tmp. the the = function
>> assigns  tmp to A. Since usually = is a deep copy
>> there is some overhead for this.  The overhead is probably a lot more for
>> df1b2matrix than for dvar_matrix as
>> the former class does not have nearly the level of optimizations in it.
>>
>> However there were some possibilities for opimization built into df1b2
>> stuff.  See the assignment operator in *vc5.cpp
>>
>>
>> df1b2vector& df1b2vector::operator = (const df1b2vector& _x)
>> {
>>    if (allocated())
>>    {
>>      ADUNCONST(df1b2vector,x)
>>      check_shape(*this,x,"df1b2vector& df1b2vector::operator =");
>>      int mmin=x.indexmin();
>>      int mmax=x.indexmax();
>>      for (int i=mmin;i<=mmax;i++)
>>      {
>>        (*this)(i)=x(i);
>>      }
>>    }
>>    else
>>    {
>>      copy(_x);
>>    }
>>    return *this;
>> }
>>
>> what this does is to use a shallow copy for a df1b2vector if it is
>> unallocated.  I don;t think this was done for df1b2matrices
>> but it could be.  In the meantime it may be possible to declare a
>> df1b2matrix as an array of unallocated df1b2vectors
>> which would be a partial optimization.   The constructor
>>
>> df1b2matrix::df1b2matrix(int nrl,int nrh)
>> {
>>    if (nrl>nrh)
>>    {
>>      allocate();
>>    }
>>    else
>>    {
>>      allocate(nrl,nrh);
>>    }
>> }
>>
>> in *vc5.cpp should do the job.
>>
>> Otherwise,  we should go through the assignment operators for df1b2 types to
>> investigate the opportunities for
>> optimization.
>>
>>
>>
>>
>>
>> _______________________________________________
>> Users mailing list
>> Users at admb-project.org
>> http://lists.admb-project.org/mailman/listinfo/users




More information about the Users mailing list