可以从一个来源获取 3 个元素的 _mm_shuffle_ps 的替代方案?
Posted
技术标签:
【中文标题】可以从一个来源获取 3 个元素的 _mm_shuffle_ps 的替代方案?【英文标题】:Alternative to _mm_shuffle_ps that can take 3 elements from one source? 【发布时间】:2011-05-02 19:16:42 【问题描述】:_mm_shuffle_ps 只能从 a
复制 2 个浮点数,从 b
复制 2 个浮点数,对吗?有什么简单的方法可以从a
获得 3 个浮点数,从b
获得 1 个浮点数?我还注意到_mm_move_ss
可以完成部分工作,但不能转换。
参考:
__m128 _mm_shuffle_ps(__m128 a, __m128 b, unsigned int imm8)
【问题讨论】:
这取决于您是否可以假设最低 SSE 版本,例如SSSE3 还是 SSE4 ? 我可以使用 SSE3 和 SSE4。 【参考方案1】:如果您有 SSE4,则使用 BLENDPS,其内在函数是:
__m128 _mm_blend_ps (__m128 v1, __m128 v2, const int mask);
【讨论】:
_mm_shuffle_ps 的美妙之处在于它可以做一些轮班工作,但 _mm_blend_ps 不能。 @echo:如果这是您需要的,那么您可能应该编辑您的问题以包含该要求【参考方案2】:不幸的是,仅有的 2 源 shuffle 是 movss
、movsd
、shufps
、unpckl/hps/d
、movhlps
和类似的非灵活指令。
palignr
might be useful,即使在 FP 指令之间使用 int shuffle 的绕过延迟,如果您的数据移动需要适合其模式。
AVX512 为各种元素大小添加了 2 源全随机播放(车道交叉,带有矢量选择器)。 vpermi2w
和 vpermt2b
之类的东西
正如 Paul 所指出的,混合是组合来自 2 个 reg 的数据而无需改组的灵活方式。
请参阅Agner Fog's Optimizing Assembly guide,了解按数据移动类型组织的指令表。另请参阅sse 标签 wiki。
【讨论】:
以上是关于可以从一个来源获取 3 个元素的 _mm_shuffle_ps 的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章
[M哈希表] lc1743. 从相邻元素对还原数组(哈希表+递推+周赛226_2)
如何从 MongoDB 集合中获取具有匹配键的最后 N 个元素