可以从一个来源获取 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 是 movssmovsdshufpsunpckl/hps/dmovhlps 和类似的非灵活指令。

palignr might be useful,即使在 FP 指令之间使用 int shuffle 的绕过延迟,如果您的数据移动需要适合其模式。

AVX512 为各种元素大小添加了 2 源全随机播放(车道交叉,带有矢量选择器)。 vpermi2wvpermt2b 之类的东西

正如 Paul 所指出的,混合是组合来自 2 个 reg 的数据而无需改组的灵活方式。


请参阅Agner Fog's Optimizing Assembly guide,了解按数据移动类型组织的指令表。另请参阅sse 标签 wiki。

【讨论】:

以上是关于可以从一个来源获取 3 个元素的 _mm_shuffle_ps 的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

如何从javascript中的列表中获取音频元素的src

[M哈希表] lc1743. 从相邻元素对还原数组(哈希表+递推+周赛226_2)

如何从 MongoDB 集合中获取具有匹配键的最后 N 个元素

如何从 MongoDB 集合中获取具有匹配键的最后 N 个元素

18.3.2从Class上获取信息(注解)

如何使用 PHP 获取请求的来源?