从 SSE 到 ARM Neon 的指令转换
Posted
技术标签:
【中文标题】从 SSE 到 ARM Neon 的指令转换【英文标题】:Instructions conversion from SSE to ARM Neon 【发布时间】:2013-07-23 13:58:58 【问题描述】:我正在尝试将一段代码从 SSE 转换为 ARM Neon 以进行优化。对于代码的大多数 SSE 指令,我发现了一些明显等效的 Neon 指令。不过,我遇到了一些问题:
result1_shifted = _mm_srli_si128 (result1, 1);
result=_mm_packus_epi16 (res1,res2);
_mm_storeu_si128 (p_dest, result);
你能帮帮我吗?
【问题讨论】:
这种 SIMD 内在函数的 1:1 转换不适用于 SSE -> Neon - 您确实需要回到标量参考实现,然后在 Neon 中从头开始实现它。通常有更好的方法更适合可用的指令/内在函数。 你能给我一些更具体的信息吗?我从来没有这样做过,我只需要转换几个指令,但我真的很挣扎。谢谢。 分两个阶段进行:(1) 将 SSE 代码反向工程为标量形式(即直接 C 代码),然后对其进行测试/基准测试/配置文件以 (a) 确保其正常工作并且(b) 确定是否确实存在需要优化的性能热点;那么 (2) 如果 (1b) 表明代码需要优化,那么您将需要通过 Neon 学习曲线并使用 Neon SIMD 内部函数或汇编程序来实现代码。理想情况下,您希望尽可能避免 (2)。 【参考方案1】:我同意 cmets 的观点,即回到“C”(或其他任何东西)参考设计可能是个好主意,也许从头开始。特别是您会发现,在某些情况下,NEON 可能有一些更优化的做事方式。但是如果你发现你需要做几乎相同的事情,这里有一些提示:
_mm_srli_si128 (result1, 1);
试试VEXT.S8 Qdst, Qsrc, Qsrc2, #1,其中src2已经清0了。
_mm_packus_epi16 (res1,res2);
试试VQMOVN.S16 Ddst,Qsrc。寻找替代品时的关键词是“狭窄”。你正在缩小范围内。 “Q”是 NEON 饱和度的命名法。您可能会遇到问题,因为您正在对未签名进行签名,我不确定 NEON 是否支持,但您的用例可能没问题,但这就是为什么有参考和测试是好的!
_mm_storeu_si128 (__m128i *p, __m128i a);
显然有VSTM,这里有很多选择。您可能想详细了解一下。
【讨论】:
以上是关于从 SSE 到 ARM Neon 的指令转换的主要内容,如果未能解决你的问题,请参考以下文章
SSE (Intel) 到 NEON (ARM) 数据类型类似物