Re: [eigen] Cost of a map operation

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


On Wed, Sep 2, 2009 at 6:02 PM, Gael Guennebaud
<gael.guennebaud@xxxxxxxxx> wrote:
> perhaps here you don't want to copy it to an Eigen vector but directly
> use *address as an Eigen vector. For that you simply declare:
>
> Map<AddressVector_t,ForceAligned> AddressVector(address);

Sorry to revive an old thread for this but the above trick doesn't
work for mapping dynamic matrices. I tried this

============
Map<MatrixXi, ForceAligned>
dataMatrix(dataPtr,packetPtr->fileHeader.rows,packetPtr->fileHeader.columns);
============
and it refused to compile.
But this is working

============
dataMatrix = Map<MatrixXi,ForceAligned>(dataPtr,packetPtr->fileHeader.rows,packetPtr->fileHeader.columns);
============

I just want to know how to use map here to avoid a memcpy
>
> and use AddressVector as any other Eigen vector, e.g.:
>
> AddressVector *= 2;
>
> that is the same as directly modifying address:
>
> for(int i=0; bla; bla)
>  address[i] *= 2;
>
> with all Eigen's goodies.
>
> cheers,
> gael.
>
> On Wed, Sep 2, 2009 at 2:16 PM, Benoit Jacob<jacob.benoit.1@xxxxxxxxx> wrote:
>> This is as efficient as it could be: typically, this expands to
>> nothing more than:
>>
>> for(int i = 0; i < cordNum; ++i)
>>  AddressVector[i] = address[i];
>>
>> and then 1) Eigen unrolls this if appropriate and 2) Eigen vectorizes
>> this if possible.
>>
>> Basically, the Map object itself is just an expression, so its
>> construction is cheap at least, and in practice the compiler is able
>> to avoid actually creating it, everything gets "inlined".
>>
>> Tip: you could check the resulting assembly code for yourself, just
>> put asm comments around this, asm("#hello"); , and use gcc -S to get
>> the assembly...
>>
>> Benoit
>>
>>
>>
>> 2009/9/2 Rohit Garg <rpg.314@xxxxxxxxx>:
>>> What is the cost of this map operation?
>>>
>>> AddressVector_t AddressVector = Map<AddressVector_t,ForceAligned>(address)
>>>
>>> where AddressVector_t itself is a typedef for
>>>
>>> typedef Matrix<int,cordNum,1> AddressVector_t;
>>>
>>> cordNum is a compile time constant.
>>>
>>> This map operation occurs in inner loop of my application, so I want
>>> to know, how costly is it gonna be? I mean with what use in mind was
>>> it written for?
>>> --
>>> Rohit Garg
>>>
>>> http://rpg-314.blogspot.com/
>>>
>>> Senior Undergraduate
>>> Department of Physics
>>> Indian Institute of Technology
>>> Bombay
>>>
>>>
>>>
>>
>>
>>
>
>
>



-- 
Rohit Garg

http://rpg-314.blogspot.com/

Senior Undergraduate
Department of Physics
Indian Institute of Technology
Bombay



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/