我正在尝试将一段代码从SSE转换为ARM Neon进行优化。对于代码的大部分SSE指令,我发现了一些明显相当于Neon的指令。我对这些问题有些疑惑:
result1_shifted = _mm_srli_si128 (result1, 1);
result=_mm_packus_epi16 (res1,res2);
_mm_storeu_si128 (p_dest, result);
你能帮我吗?
答案 0 :(得分:2)
我同意这些评论,回到“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的饱和度命名法。您可能遇到问题,因为您签署的是unsigned,我不确定NEON是否支持,但您的用例可能没问题,但这就是为什么参考和测试很好!
_mm_storeu_si128 (__m128i *p, __m128i a);
显然有VSTM,这里有很多选项。您可能希望详细了解这一点。