将 __m256 拆分为两个 __m128 寄存器

Posted

技术标签:

【中文标题】将 __m256 拆分为两个 __m128 寄存器【英文标题】:Splitting __m256 into two __m128 registers 【发布时间】:2021-03-08 20:38:26 【问题描述】:

我有一个 __m256 包含 8 个浮点数,我想将其拆分为 2 个 __m128,一个包含前四个浮点数,另一个包含最后四个浮点数。这可能吗?

谢谢

【问题讨论】:

是的,有可能。您使用什么参考资料来了解 AVX 编程? 我正在查看英特尔关于 software.intel.com/sites/landingpage/IntrinsicsGuide 的文档。我想加载前 128 位,然后移位然后再次加载前 128 位,但不幸的是这不起作用:( 例如,仅选择 AVX 指令,然后搜索 __m128d,会得到一个少于 20 条指令的列表,很容易检查那些名称可能相似的指令。 【参考方案1】:

_mm256_extractf128_ps 可用于上下两部分。对于上半部分,这是提取它的最佳方法。但是,对于一些稍旧的 MSVC 版本,内在总是会产生相应的指令,即使索引为零(在这种情况下,实际上 没有指令 是必需的)。所以要提取下半部分,应该首选_mm256_castps256_ps128

【讨论】:

以上是关于将 __m256 拆分为两个 __m128 寄存器的主要内容,如果未能解决你的问题,请参考以下文章

将 __m256i 设置为两个 __m128i 值的值

如何在 AVX 寄存器上打包 16 个 16 位寄存器/变量

将 16 位值的 __m256i 打包(饱和)到 8 位值的 __m128i?

SIMD (AVX2) - 将 uint8_t 值加载到多个浮点 __m256 寄存器

将 __m256i 寄存器转换为 uint64_t 位掩码,以便每个字节值处的值是输出中的设置位

如何在 MSVC 中高效地将两个 __m128d 转换为一个 __m128i?