Skip to content

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 floats, 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);

Merge request reports