我正在尝试构建在aws graviton3
上运行的软件。为了最大限度地利用这个性能,aws建议使用sse2neon来移植代码,并将SSE的本质部分移植到neon (porting-codes-with-sseavx-intrinsics-to-neon)
在修改标头时,我发现当检测到arm_neon.h
体系结构时,arm64也包括在内。使用sse2neon
而不是arm_neon.h
有什么好处吗?应该并排包含两个标题吗?
他们之间到底有什么区别?
发布于 2022-08-22 10:00:50
是否有任何使用
sse2neon
而不是arm_neon.h
的方法?
这样做的好处是,您可以编译编写的代码,使用x86 SSE的本质,如_mm_add_epi32
on __m128i
vectors (英特尔本质指南),而不必手动移植来使用uint32x4_t
和vaddq_u32
(手臂本质指南已过滤,用于在AArch64上添加NEON整数)。
霓虹灯和SSE2是不同的指令集,有一些不同的指令,例如不同的洗牌。和霓虹灯有很多水平配对的东西,如加法。但是x86需要_mm_movemask_epi8
每字节取一位向量,并将其放入int
中;x86 CPU可以相当有效地在SIMD和整数域之间获取数据,当您想在SIMD上比较结果时,对于memcmp
或strlen
之类的东西很有用。ARM / AArch64 CPU没有等效的指令。
当然,对于简单的垂直操作这样的简单操作,替换量会下降1:1,因此手工移植没有好处。但是对于sse2neon
内部的x86实现需要多个ARM本质的东西来说,手动移植是值得的,尤其是在循环中,而不仅仅是运行一次的清理。
https://stackoverflow.com/questions/73442988
复制相似问题