【发布时间】:2019-08-05 17:39:23
【问题描述】:
我正在为我制作的算法的 arm64 实现 NEON 版本。
我面临的问题是:
- 如何将 int8x16 解压缩为两个 int16x8_t,这意味着字节有点“投射”到短裤?
- 如何将这两个 @987654326 打包@回到int8x16_t?
我尝试这样做的原因是对几个矢量化短裤应用操作,不会溢出,最后将结果打包回int8x16_t。
这是我针对这个问题的 SSE2 实现:
SSE2 开箱:
__m128i a1 = _mm_srai_epi16(_mm_unpacklo_epi8(input, input), 8);
__m128i a2 = _mm_srai_epi16(_mm_unpackhi_epi8(input, input), 8);
SSE2 包装:
__m128i output = _mm_packs_epi16(a1, a2);
【问题讨论】:
-
您可能已经知道这一点,但对于 x86 SSE4.1,您将使用
pmovsx(cvtepi8_epi16(input)) 作为下半部分。您正在实施的操作是“符号扩展”,因此为将来的搜索者提及这一点很有帮助。 -
@PeterCordes 是的,我知道,但感谢您的精确,它总能提供帮助!
-
相关:Loading 8-bit values using NEON/ARM 表明 ARM SIMD 具有扩展的 add/sub,如果它可以满足您的要求,它可能比首先进行符号扩展更有效。
标签: c++ arm simd intrinsics neon