将 __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 寄存器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AVX 寄存器上打包 16 个 16 位寄存器/变量
将 16 位值的 __m256i 打包(饱和)到 8 位值的 __m128i?
SIMD (AVX2) - 将 uint8_t 值加载到多个浮点 __m256 寄存器