从SSE到ARM Neon的指令转换

从SSE到ARM Neon的指令转换,arm,sse,neon,intrinsics,Arm,Sse,Neon,Intrinsics,我正在尝试将一段代码从SSE转换为ARM Neon进行优化。对于代码中的大多数SSE指令,我发现了一些明显等效的霓虹灯指令。但我对这些有一些问题: result1_shifted = _mm_srli_si128 (result1, 1); result=_mm_packus_epi16 (res1,res2); _mm_storeu_si128 (p_dest, result); 你能帮帮我吗?我同意这些评论,回到“C”(或任何真正的)参考设计可能是个好主意,也许从头开始。特别是你会发现

我正在尝试将一段代码从SSE转换为ARM Neon进行优化。对于代码中的大多数SSE指令,我发现了一些明显等效的霓虹灯指令。但我对这些有一些问题:

result1_shifted = _mm_srli_si128 (result1, 1);

result=_mm_packus_epi16 (res1,res2);

_mm_storeu_si128 (p_dest, result);

你能帮帮我吗?

我同意这些评论,回到“C”(或任何真正的)参考设计可能是个好主意,也许从头开始。特别是你会发现,在某些情况下,霓虹灯可能有一些更为理想的做事方式。但如果你发现你需要做几乎相同的事情,这里有一些提示:

\u mm\u srli\u si128(结果1,1)尝试Qdst、Qsrc、Qsrc2、#1,其中src2已清除为0

\u mm\u packus\u epi16(res1、res2)尝试Ddst、Qsrc。寻找替代方案时的关键词是“狭窄”。你在缩小。“Q”是饱和度的氖命名法。您可能会遇到问题,因为您正在执行signed to unsigned(我不确定NEON是否支持),但您的用例可能还可以,但这就是为什么有引用和测试是好的


\u mm\u storeu\u si128(\u m128i*p,\u m128i a)显然有,这里有很多选择。您可能需要更详细地了解这一点。

这种SIMD intrinsic的1:1转换对于SSE->Neon不太有效-您确实需要回到标量引用实现,然后从头开始在Neon中实现它。通常有一种更好的方法更适合于可用的指令/内部函数。您能给我一些关于如何做到这一点的更具体的信息吗?我从来没有这样做过,我只需要转换几条指令,但我真的很挣扎。谢谢。分两个阶段来做:(1)将SSE代码反向工程为标量形式(即纯C代码),然后测试/基准测试/评测它,以(a)确保它能正确工作和(b)确定是否确实存在需要优化的性能热点;然后(2)如果(1b)表示需要优化代码,则需要通过Neon学习曲线,并使用Neon SIMD内部函数或汇编程序实现代码。理想情况下,如果可能,您希望避免(2)。