avoid selecting half-packets when unnecessary
See https://stackoverflow.com/questions/59709148/ensuring-that-eigen-uses-avx-vectorization-for-a-certain-operation for an explanation of the problem this solves.
In short, for some reason, before this commit the half-packet is
selected when the array / matrix size is not a multiple of
unpacket_traits<PacketType>::size
, where PacketType
starts out
being the full Packet.
For example, for some data of 100 float
s, Packet4f
will be
selected rather than Packet8f
, because 100 is not a multiple of 8,
the size of Packet8f
.
This commit switches to selecting the half-packet if the size is less than the packet size, which seems to make more sense.
As I stated in the SO post I'm not sure that I'm understanding the
issue correctly, but this fix resolves the issue in my program. Moreover,
make check
passes, with the exception of line 614 and 616 in
test/packetmath.cpp
, which however also fail on master on my machine:
CHECK_CWISE1_IF(PacketTraits::HasBessel, numext::bessel_i0, internal::pbessel_i0);
...
CHECK_CWISE1_IF(PacketTraits::HasBessel, numext::bessel_i1, internal::pbessel_i1);