Re: [eigen] Decrease in performances

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


>>> I guess it can easily be replaced by 128bit integer multiplication. I
>>> suggested that back then, but I guess it was ignored due to portability
>>> concerns:
>>>
>>> http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2011/10/msg00041.html
>>
>>
>
> Yet another alternative might be to just check for the highest bit of both
> factors (__builtin_clz in gcc; _BitScanReverse in MSVC). If the sum is <=
> sizeof(size_t)*8-2, the integer multiplication should not overflow,
> otherwise at least a*b*sizeof(float) would overflow.

Implemented using __builtin_clz in the attached patch. Looks like it's
supported with recent gcc and clang compilers -- other compilers will
simply fall through to the less optimized code path. I didn't
implement a _BitScanReverse version, since (a) I don't have a Windows
machine to test on, and (b) searching suggested there was
_BitScanReverse and _BitScanReverse64, and I didn't know how to make
that play nicely with C++ templating. :)

The relevant test passes, and a back-of-the-envelope has convinced me
of the new code's correctness, but more eyeballs/brains are always
welcomed!

-josh

Attachment: avoid_integer_division.patch
Description: Binary data



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