如何最有效地将包含 32 个无符号 8 位整数的 __m256i 向量转换为四个 32 位浮点数的 __m256 向量?

问题描述 投票:0回答:0

如果我有一个包含 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 位整数太小了。

c simd intrinsics avx avx2
© www.soinside.com 2019 - 2024. All rights reserved.