gpt4 book ai didi

c++ - 确保 Eigen 对特定操作使用 AVX 矢量化

转载 作者:行者123 更新时间:2023-12-02 01:38:03 33 4
gpt4 key购买 nike

我使用 Eigen 的工具编写了一些当前成为算法瓶颈的函数的矢量化版本。

我还检查了 AVX 是否已启用,方法是确保 EIGEN_VECTORIZE_AVX是在包含 Eigen 之后定义的。

但是,我的函数似乎永远不会被 Packet8f 调用。 (AVX),如果数据大小不是 8 的倍数。相反,它会被调用 Packet4f (上交所)。

这是一个小重现:https://gist.github.com/bitonic/e89561cb21837b4dee8b5f49e1303919 。这里我使用 Packet4f 定义一个操作和Packet8f ,然后计算大小为 8 和 9 的数组分别调用的次数。当数组大小为 8 时,Packet8f正如预期的那样,版本被调用一次。当尺寸为 9 时,Packet4f version 被调用两次,再加上对非向量化版本的一次调用。我已经在 Eigen 当前的 master 1d0c45122a5c4c5c1c4309f904120e551bacad02 上测试了这段代码.

我挖了一点,我相信数据包选择发生在这里:https://gitlab.com/libeigen/eigen/blob/1d0c45122a5c4c5c1c4309f904120e551bacad02/Eigen/src/Core/util/XprHelper.h#L197 .

如果我理解正确的话,如果数据的大小不是动态的并且不是 8 的倍数(即 unpacket_traits<Packet8f>::size 的值),则将选择半数据包,这与上面的再现显示的内容相匹配。

如果我的理解是正确的,为什么会这样呢?难道不应该选择完整的数据包,而其余元素则用于非矢量化操作吗?

是否该条件是错误的,应该是 >= 比较,例如类似的东西

template<int Size, typename PacketType,
bool Stop = Size==Dynamic || Size >= unpacket_traits<PacketType>::size || is_same<PacketType,typename unpacket_traits<PacketType>::half>::value>
struct find_best_packet_helper;

而不是

template<int Size, typename PacketType,
bool Stop = Size==Dynamic || (Size%unpacket_traits<PacketType>::size)==0 || is_same<PacketType,typename unpacket_traits<PacketType>::half>::value>
struct find_best_packet_helper;

我已经验证,通过上述修复,问题就消失了。

但是,我可能会误解这里发生的事情,因为我不太熟悉 Eigen 内部结构。

最佳答案

我已经确认这是由于 Eigen 选择数据包类型的方式造成的,请参阅 https://gitlab.com/libeigen/eigen/merge_requests/46进行修复。

关于c++ - 确保 Eigen 对特定操作使用 AVX 矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59709148/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com