我有一个 32 位整数数组,我想将其转换为双精度数,并希望使用
_mm256_cvtepi32_pd()
来执行转换。
我的问题是这个内在函数仅将寄存器中 8 个整数中的 4 个转换为双精度数。
源数组实际上是来自 FPGA 的 64 位结构,其中我的整数值只有结构前 32 位顶部的 24 位,我使用
_mm256_i32gather_epi32()
和 _mm256_srli_epi32()
来提取和将数据移入适当的 8 元素 32 位整数 YMM 寄存器,我也将存储该寄存器(使用 _mm256_store_si256()
)并希望保留一份副本。
我想知道将 YMM 寄存器中的所有 8 个元素转换为双精度的“最佳实践”是什么。
最好的计划是采用 YMM,转换为双精度(使用
_mm256_cvtepi32_pd()
),用 _mm256_store_si256()
存储,然后将 YMM 逻辑右移 64 位并在另一半重复转换?或者还有其他更好的方法吗?
使用适当的指令集 利用 AVX 提供的转换指令,例如“vcvtps2pd”和其他相关指令。它们可以有效地将打包单精度浮点数转换为双精度浮点数。如果初始数据是32位整数,则可能需要使用适当的指令逐步执行转换(例如,先将整数转换为单精度,然后再转换为双精度)。根据具体处理器的指令集支持选择最合适的。