如果我有一个包含 32 个无符号 8 位整数的
__m256i
向量,我怎样才能最有效地解包和转换它以便我得到四个 __m256
向量,每个向量包含八个 32 位 float
数字?
我想,一旦我以 32 位有符号整数形式获得它们,我就可以通过
_mm256_cvtepi32_ps
将它们转换为浮点数,所以问题可能归结为我如何最有效地从 8 位无符号整数(epu8
) 表示为带符号的 32 位有符号整数 (epi32
) 表示。
存在
_mm256_cvtepu8_epi32(__m128i a)
,但这似乎只适用于__m128i
输入的低(64位)一半,而我有一个__m256i
输入。
有没有比通过两次调用
__m256i
将我的 __m128i
输入变成四个 _mm256_extracti128_si256(__m256i a, const int imm8)
向量,然后以某种方式交换这些 __m128i
向量的上半部分和下半部分(64 位)更好的方法(总共四个 __m128i
向量,每个向量在其下半部分都有初始 __m256i
向量的不同 64 位四分之一),然后执行 _mm256_cvtepu8_epi32(__m128i a)
,然后在每个向量上执行 _mm256_cvtepi32_ps(__m256i a)
?
看起来很乱,我想知道是否有更好的方法。我对矢量内在函数完全陌生,所以我肯定在这里遗漏了一些东西。
编辑更多上下文:
所以设置是有三对数组,
R1
,G1
,B1
和R2
,G2
,B2
uint8_t
像素值和要完成的计算是总和通道方差的平方,即square(R1 - R2) + square(G1 - G2) + square(B1 - B2)
。目前,差异以 uint8_t
形式 max(R1, R2) - min(R1, R2)
(等)进行矢量化,这样 32 uint8_t
差异可以在单个 _mm256_sub_epi8
中一次计算。在我获得这些差异 R_diff
、G_diff
和 B_diff
之后以及对它们进行平方之前,我的问题就出现了,因为 8 位整数太小了。