我有array
名为A
,其中包含32个unsigned char
值。
我希望使用此规则在4个__m256
变量中解压缩这些值,假设我们有一个关于A
的所有值的0到31的索引,解压缩的4变量将具有以下值:
B_0 = A[0], A[4], A[8], A[12], A[16], A[20], A[24], A[28]
B_1 = A[1], A[5], A[9], A[13], A[17], A[21], A[25], A[29]
B_2 = A[2], A[6], A[10], A[14], A[18], A[22], A[26], A[30]
B_3 = A[3], A[7], A[11], A[15], A[19], A[23], A[27], A[31]
为此,我有这段代码:
const auto mask = _mm256_set1_epi32( 0x000000FF );
...
const auto A_values = _mm256_i32gather_epi32(reinterpret_cast<const int*>(A.data(), A_positions.values_, 4);
// This code bellow is equivalent to B_0 = static_cast<float>((A_value >> 24) & 0x000000FF)
const auto B_0 = _mm256_cvtepi32_ps(_mm256_and_si256(_mm256_srai_epi32(A_values, 24), mask));
const auto B_1 = _mm256_cvtepi32_ps(_mm256_and_si256(_mm256_srai_epi32(A_values, 16), mask));
const auto B_2 = _mm256_cvtepi32_ps(_mm256_and_si256(_mm256_srai_epi32(A_values, 8), mask));
const auto B_3 = _mm256_cvtepi32_ps(_mm256_and_si256(_mm256_srai_epi32(A_values, 0), mask));
这很好用,但我想知道是否有更快的方法可以做到这一点,特别是关于右移和我用来检索值的运算符。
另外,为了澄清,我说array
A
的大小为32,但事实并非如此,此数组包含更多值,我需要访问它&# 39;来自不同位置的元素(但总是来自4 uint8_t
的块),这就是我使用_mm256_i32gather_epi23
来检索这些值的原因。为简单起见,我只是在此示例中限制array
大小。