NEON、SSE 和交错负载与随机播放
Posted
技术标签:
【中文标题】NEON、SSE 和交错负载与随机播放【英文标题】:NEON, SSE and interleaving loads vs shuffles 【发布时间】:2016-05-09 01:03:43 【问题描述】:我正在尝试理解“Iwillnotexist Idonotexist”在SIMD optimization of cvtColor using ARM NEON intrinsics 发表的评论:
...为什么不使用映射到 VLD3 指令的 ARM NEON 内部结构?这样可以省去所有的改组,简化和加速代码。英特尔 SSE 实施需要 shuffle,因为它缺少 2/3/4 路去交错加载指令,但您不应在它们可用时传递它们。
我遇到的麻烦是该解决方案提供了非交错的代码,并且它在浮点上执行融合乘法。我正在尝试将两者分开并仅了解交错的负载。
根据另一个问题的评论和Coding for NEON - Part 1: Load and Stores,答案大概会使用VLD3
。
不幸的是,我只是没有看到它(可能是因为我对 NEON 及其内在功能不太熟悉)。看起来VLD3
基本上每个输入都会产生 3 个输出,所以我的金属模型很混乱。
鉴于以下 SSE 内在函数对 BGR BGR BGR BGR...
格式的数据进行操作,需要对 BBBB GGGG RRRR ...
进行洗牌:
const byte* data = ... // assume 16-byte aligned
const __m128i mask = _mm_setr_epi8(0,3,6,9,12,15,1,4,7,10,13,2,5,8,11,14);
__m128i a = _mm_shuffle_epi8(_mm_load_si128((__m128i*)(data)),mask);
我们如何使用 NEON 内部函数执行交错加载,以便我们不需要 SSE shuffle?
另请注意...我对内在函数感兴趣,而不是 ASM。我可以在 MSVC、ICC、Clang 等下的 Windows Phone、Windows Store 和 Linux 驱动的设备上使用 ARM 的内在函数。我不能用 ASM 做到这一点,而且我不想将代码专门化 3 次(Microsoft 32-位 ASM、Microsoft 64 位 ASM 和 GCC ASM)。
【问题讨论】:
我也不知道 NEON,所以我有兴趣阅读它具有去交错负载。很明显,是的,vld3
产生三个输出寄存器。您的 SSE pshufb
将您的数据洗牌为 6 个字节的 B、5 个字节的 G,然后是 5 个字节的 R,全部在一个寄存器中。这与vld3
给你的不同,而且似乎没那么有用。为什么需要在同一个寄存器中混合不同的颜色成分?
@PeterCordes - 为什么需要在同一个寄存器中混合不同的颜色分量..." - 实际问题是 BLAKE2 哈希压缩函数。SSE2 和 SSE4 可在blake2.cpp;我们正在削减 NEON。我使用另一个 Stack Overflow 问题作为参考点来帮助理解和避免混淆。我还猜测更多人通过 BLAKE2 压缩函数了解 RGB 颜色。
“看起来vld3
基本上为每个输入产生 3 个输出” - 是的,因为输入是指向交错数据的基地址。假设它指向一组 ABCABCABCABC... 那么你得到的是一个满是 As 的寄存器,一个满是 B,一个满是 C。如果您特别需要 一个 单个寄存器来包含 AAAAAABBBBBBCCCCC 模式,那么我认为您将需要一些 vtbl
排列,无论您如何加载它。
【参考方案1】:
根据这个页面:
您需要的 VLD3 内在函数是:
int8x8x3_t vld3_s8(__transfersize(24) int8_t const * ptr);
// VLD3.8 d0, d1, d2, [r0]
如果在ptr
指向的地址你有这个数据:
0x00: 33221100
0x04: 77665544
0x08: bbaa9988
0x0c: ffddccbb
0x10: 76543210
0x14: fedcba98
你最终会进入寄存器:
d0: ba54ffbb99663300
d1: dc7610ccaa774411
d2: fe9832ddbb885522
int8x8x3_t结构定义为:
struct int8x8x3_t
int8x8_t val[3];
;
【讨论】:
这与原始 SSE 代码之间唯一重要的区别在于传输的大小。 SSE 代码似乎置换 128 位数据,而 NEON 将置换 3*64 位或 3*128 位负载,因此要使其适合原始问题可能需要一些数据大小改组以使事情适合新的数据大小。以上是关于NEON、SSE 和交错负载与随机播放的主要内容,如果未能解决你的问题,请参考以下文章
使用 javascript 为每个 wordpress 帖子应用交错和随机的左/右放置