Re: [eigen] Re: State of the problem with std::vector |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] Re: State of the problem with std::vector
- From: "Gael Guennebaud" <gael.guennebaud@xxxxxxxxx>
- Date: Thu, 8 Jan 2009 23:57:48 +0100
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:in-reply-to:mime-version:content-type :content-transfer-encoding:content-disposition:references; bh=//6pSgsQ3bi6xfqM4UiPrG2EfI6uG+m5I8vza+ET10g=; b=hwB3n+x5y3nl0G2+BEW0tYm0LCfidAs4w/7VP3SMR6qqB/qFE1Ugsgpe8t5X9TcJaA /nFonwkszPGTtzTMC9feugGJB8amUdTmsc5TY7m8i9WAIxrImo5UAhMaXULfwZ3NCg7y qfeRfMclReuvVqM6D8lmC/IuyQmrL/Sg7aTzs=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version :content-type:content-transfer-encoding:content-disposition :references; b=gHVZSJh4nGBJV2aNYEpr4RO8PdIEvM3XhwNEhlVLEXPzFlyFAnIilpu/J88e8BgwcS zq9JWSCNDyG2zOs+wxJqzFVHOZC2x4c/b01iOY+8gcG1GF1UpxO3bfAMuADo1ESBiEXy AM8RmXVZQ89YZa0vXGNIQhV1HRN7i/AmQdvRg=
On Thu, Jan 8, 2009 at 9:36 PM, Benoit Jacob <jacob.benoit.1@xxxxxxxxx> wrote:
> So, another possible solution... is to make a specialization
> std::vector<Vector4f> that inherits what it would normally be, and
> redefines resize().
how would you do that ? something like that : (neglecting the allocator)
namespace std {
template<typename Scalar,....> class vector<Eigen::Matrix<...> > :
public vector< Eigen::Matrix<...> >
{
...
};
} // std
but then we basically have an infinite recursion:
class A : public A {};
am I missing something ?
gael.
> 2009/1/8 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:
>> Hi,
>>
>> THE PROBLEM
>>
>> (as discussed since yesterday on IRC)
>>
>> std::vector<value_type> (both GCC and MSVC implementations) has a
>> resize() method that takes a value_type by value.
>>
>> Since attributes don't work on function parameters (with GCC and
>> MSVC), this means that this program,
>>
>> #include <Eigen/Core>
>> #include <vector>
>>
>> int main()
>> {
>> std::vector <Eigen::Vector4f> v(10);
>> v.resize(20);
>> }
>>
>> triggers the unaligned-array-assert (unless of course by pure chance
>> (50%) the copied vector happens to be aligned).
>> If we disabled the asserts, it will crash when trying to use aligned
>> SSE insns on this unaligned location.
>>
>> THE ONLY POSSIBLE SOLUTION WE CAN SEE
>> thanks a lot to "alexs" from ##c++ IRC channel...
>>
>> [18:09] <bjacob> ggael: so i got help on ##c++
>> [18:09] <bjacob> the only idea that seems to have a chance of working,
>> [18:09] <bjacob> is to define a separate vector type inheriting Vector4f,
>> [18:10] <bjacob> this vector type has a copy constructor that doesn't
>> use SSE insns
>> [18:10] <bjacob> and a default constructor that doesn't do the
>> unaligned array assert
>> [18:10] <bjacob> and use inheritance and implicit conversions to let
>> the user use std::vector on that vector type
>> [18:11] <bjacob> while using it as std::vector<Vector4f>
>> [18:13] <bjacob> so could make this templated .... template<typename
>> MatrixType> class AllowUnaligned : public MatrixType;
>> [18:13] <bjacob> std::vector < AllowUnaligned <Vector4f> >
>> [18:14] <ggael> ok, I see
>> [18:17] --> alexs_ a rejoint ce canal (n=alexs@unaffiliated/alexs).
>> [18:17] <alexs_> Looks interesting :)
>> [18:19] <bjacob> ok some backlog pasting....
>> [18:19] <bjacob> http://rafb.net/p/C27reW66.html
>> [18:20] <bjacob> alexs_: ^
>> [18:20] <alexs_> yeah :)
>> [18:20] <bjacob> ggael: http://rafb.net/p/TDr0X549.html
>> [18:25] <alexs_> You could probably use a specialisation of
>> vector<Vector4> that statically sets the value_type to the right
>> thing, to hide it from the user?
>> [18:29] <bjacob> hm. and by the way set an aligned allocator. good idea.
>> [18:30] <bjacob> this will mean inheriting from std::vector, never
>> tried, hope it's easy (don't know what's the best way to preserve the
>> ctors, assignment operators, etc, that don't get inherited)
>> [18:30] <alexs_> composition should work ok
>> [18:30] <alexs_> it's not too many things :)
>> [18:31] <alexs_> operators are not members of vector anyway
>> [18:31] <bjacob> you'd recommend composition (i guess this means
>> having-as-a-member) over inheritance?
>> [18:31] <bjacob> not even assignment operators?
>> [18:31] <alexs_> composition for the things that inheritance doesnt bring in
>> [18:32] <bjacob> oh, i see
>> [18:46] <bjacob> alexs_: by the way it is not just MSVC that doesn't
>> allow align attribute on function parameters
>> [18:46] <bjacob> here, gcc 4.3.2 allows this code to compile but the
>> attribute isn't honored and i get my assertion at runtime saying the
>> object is unaligned
>> [18:48] <alexs_> bjacob: Oh :(
>> [18:49] <alexs_> is it a function parameter if you want aligned arguments?
>> [18:49] <alexs_> -mpreferred-stack-boundary=num
>> [18:50] <bjacob> hm good idea
>> [18:50] <alexs_> default is 16 bytes
>> [18:50] <bjacob> oh -- so it's not what we want then -- as 16 bytes should be OK
>> [18:51] <alexs_> Unless you use -Os
>> [18:51] <bjacob> ++ -mpreferred-stack-boundary=16 -I
>> kde/kdesupport/eigen2/ a.cpp -o a && ./a
>> [18:51] <bjacob> a.cpp:1: error: -mpreferred-stack-boundary=16 is not
>> between 2 and 12
>> [18:51] <alexs_> Yeah, it is raised to a power of 2
>> [18:51] <bjacob> oops, "++" should be "g++"
>> [18:51] <alexs_> you want 4 :)
>> [18:51] <bjacob> ah ok
>> [18:51] <alexs_> but my man page says that is the default
>> [18:51] <bjacob> yes and with 4 is still get the same problem
>> [18:52] <bjacob> "preferred" is probably not strictly honored
>> [18:52] <alexs_> So it's not aligning them...
>> [18:52] <alexs_> It does say "attempt"
>>
>> Cheers,
>> Benoit
>>
>
> ---
>
>
---