Re: [eigen] AVX/LRB and SSE with SoA support

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


Hi,

first things first, supporting a new vector engine in eigen is
relatively easy. However, you won't be able to right code
"templatized" on the vector engine, and even with a custom library I
doubt that's doable. The choice of the vector engine has to be
compiler options. So, the way to support multiple vector engines at
runtime (I guess this is what you want?), is to have a trivial
function foo(...) selecting the right implementation function e.g.,
foo_sse(...), foo_sse4(...), etc. The foo_* functions are implemented
only once, by putting it in its own file which will be compiled
multiple times with different compiler options (e.g., -msse, -msse4,
etc.). The actual of the function (foo_sse) will be built using the
preprocessor, e.g.:

EIGEN_CAT(foo_,VECTOR_ENGINE_SUFFIX)(...) { .... }

Now regarding the special interleaved packing of the data, there is
currently no such thing in eigen, however, I think you can easily add
that on top of, e.g., a
Array<float,Dynamic,ei_packet_traits<float>::size,RowMajor>. It will
be initialized with dimension *
((size/ei_packet_traits<float>::size)+((size%ei_packet_traits<float>::size)==0
? 0 : 1) rows where dimension is three in your example, and size is
the number of element. You can easily get the i-th element as follow:

underlying_array.block<dimension,1>((i/ei_packet_traits<float>::size)*dimension,
i%ei_packet_traits<float>::size) = Vector3f(x,y,z);

The idea would be to add a class warping this underlying_array to make
it convenient to use. The main questions are what is the set of
features which have to be supported? How do we want to use it? through
a manual loop over the (e.g., 3x4) blocks? through functors? through
high level expression template code? etc.

To finish, this is definitely something I planed to do the future, so
I'd be glad to discuss with you its design and help you to get it
right regarding Eigen.

cheers,

gael

On Fri, Jul 2, 2010 at 11:56 PM, keller <christoph-keller@xxxxxx> wrote:
> Hello,
>
> I have to implement a raytracer that uses the Vector units of modern x86
> cpus.
>
> Intel will introduce AVX soon. I have to support AVX and SSE and i do not
> want all of my code replicated. I currently use the Intels intrinsics. If
> Intel adds the Larrabee extensions into normal x86 CPUs one would even have
> to write three versions.
>
> As i use Eigen in parts of the software i wonder if one could support this
> with Eigen. The typical situation is like this.
> -One has a ray bundle with 16 rays that are arranged in SoA format:
> x1,..,x4
> y1,...,y4
> z1,...,z4
> .....
> x13,..,x16
> y13,...,y16
> z13,...,z16
> This format has to be changed when using AVX/LRB of course.
> -One source of the rays and an object like a sphere
>
> Ideally i have a function like testCut(Bundles, Sphere) that uses a template
> parameter to set the Vector extension to use. I do not want to partially
> specialize this function but use some structures and functions in testCut
> that depend on the template parameter.
>
> The question for me is: Develop a small library of my own, or use Eigen
> (where i can contribute this functionality). I know i can do this with a
> custom library, but i dont know if it is easy to add this functionality to
> Eigen.
>
> I think a lot of people will have the same problem soon.
>
> Greetings,
> Christoph
>
>
>
>



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