如何使用_mm256_shuffle_epi8对元素进行排序

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

我尝试以下代码。我知道随机播放功能有一些车道限制。但我不知道如何正确处理。有人有想法吗?

#include <immintrin.h>

int main() {
  auto vals = _mm256_setr_epi8(
    0, 3, 6, 9,
    1, 4, 7, 10,
    2, 5, 8, 11,
    0, 0, 0, 0,
    12, 15, 18, 21,
    13, 16, 19, 22,
    14, 17, 20, 23,
    0, 0, 0, 0
  );
  auto mask = _mm256_setr_epi8(
    0, 4, 8,
    1, 5, 9,
    2, 6, 10,
    3, 7, 11,
    16, 20, 24,
    17, 21, 25,
    18, 22, 26,
    19, 23, 27,
    -1, -1, -1,
    -1, -1, -1,
    -1, -1);

  auto res = _mm256_shuffle_epi8(vals, mask);
  /*res is:
  0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 3 12 17 18 19 20 21 22 23 0 0 0 0 0 0 0 0 0
  but should
  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 0 0 0 0 0 0 0 0
  */
  return 0;
}
c++ intrinsics avx
1个回答
0
投票

问题是,

_mm256_shuffle_epi8
无法在向量的 16 字节通道上移动这些字节。

一种可能的解决方法是随后执行另一个随机指令,这是一个示例。

__m256i collectRgb( __m256i vals )
{
    // Move the bytes within 16-byte pieces of the vector
    const __m128i gather16 = _mm_setr_epi8(
        0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, -1, -1, -1, -1 );
    const __m256i gatherMask = _mm256_broadcastsi128_si256( gather16 );
    vals = _mm256_shuffle_epi8( vals, gatherMask );

    // Shuffle 4-byte pieces across the complete AVX vector
    const __m256i perm = _mm256_setr_epi32( 0, 1, 2, 4, 5, 6, 7, 7 );
    return _mm256_permutevar8x32_epi32( vals, perm );
}
© www.soinside.com 2019 - 2024. All rights reserved.