利用sse2neon头文件将应用程序移植到Windows on Snapdragon(第1部分/共2部分)
发表于 2024-10-15 17:59:53

是否一直致力于将您的应用程序从x86移植到Windows on Snapdragon 上?当您开始移植应用程序时,会面临什么样的挑战?其中一个挑战是针对x86的程序库不能直接移植到Windows on Snapdragon上,在这种情况下,您需要考虑其他选择。在本系列文章(由两部分组成)中,我们将探讨一个替代方案:sse2neon.h。

在本文中,我们会简要介绍一下x86指令集,看看该指令集与在Windows on Snapdragon平台上运行的与之相似的指令集的比较情况。在下一篇文章中,我们会介绍如何基于sse2neon头文件,将应用程序从x86移植到Windows on Snapdragon。

什么是英特尔SSE(流式单指令多数据结构扩展)?

英特尔SSE(流式单指令多数据结构扩展)是一种针对x86架构的单指令多数据(SIMD)指令集扩展。流式单指令多数据结构扩展指令可处理单精度浮点数据,英特尔将流式单指令多数据结构扩展指令扩展至SSE2、SSE3、SSSE3和SSE4。

以_mm开头的函数调用(例如:_mm_add_ps()和_mm_storeu_ps())均属于英特尔流式单指令多数据结构扩展的内置函数,典型的英特尔SSE应用程序可进行数字信号处理和图形处理。

什么是NEON

Windows on Snapdragon平台以精简指令集计算机(RISC)架构为基础,NEON是在Windows on Snapdragon平台上对高级单指令多数据结构架构的实现。

Windows on Snapdragon平台支持64位架构和32位架构的执行状态,两者均支持单指令多数据结构和浮点指令。

NEON提供的内置函数在其头文件中定义,典型的NEON应用程序包括多媒体和信号处理、3D图形、语音、图像处理以及高性能定点/浮点应用程序应用程序。

什么是内置函数?

内置函数(在编译器理论中也称为内建函数)是指由编译器实现的函数。

内置函数看起来像是函数调用,但其并不需要实际的函数调用。当编译器遇到内置函数时,就会替换一系列自动生成的指令,如同内联函数一样。内置函数用于直接通过C/C++访问流式单指令多数据指令,以提高应用程序的性能。

内置函数的使用比汇编语言更为容易。当程序请求优化时,实现了对应函数的编译器可以启用优化,否则,应当使用系统所提供的默认实施。将代码表示为内置函数而不是原程序集可以让编译器帮助函数生成,在遍历函数调用边界时,编译器负责控制寄存器分配并协商调用约定。编译器还可以优化生成的代码。

如要获得有关英特尔流式单指令多数据结构扩展内置函数的更多信息,请参阅英特尔内置函数指南;如要获得有关NEON内置函数的信息,请参阅 内置函数 – 开发人员网站

英特尔流式单指令多数据结构扩展和NEON之间有何差别?

英特尔流式单指令多数据结构扩展代码通常在桌面和服务器环境中运行,而NEON代码则在边缘设备和移动硬件上运行。

以下代码利用英特尔流式单指令多数据结构扩展内置函数添加了两个128位向量:

#include <xmmintrin.h>
__m128 add(__m128 c, __m128 d)
{
    return _mm_add_ps(c, d);
}

 

利用NEON内置函数编写的相同函数为:

#include <header file name>
 
float32x4_t add(float32x4_t c, float32x4_t d)
{
    return vaddq_f32(a, b);
}

英特尔流式单指令多数据结构扩展内置函数和NEON内置函数之间的一个区别是输入参数和输出结果。英特尔流式单指令多数据结构扩展使用__m128型内置函数,而NEON则使用float32x4_.SSE型内在内置函数描述了整个向量寄存器的宽度(128),而NEON型内置函数描述了每个组件的宽度(32)和组件计数(4)。

英特尔流式单指令多数据结构扩展和NEON型内置函数之间的另一个区别是对无符号量的处理。流式单指令多数据结构扩展只提供一个寄存器(__m128i)来存储4个32位有符号和无符号整数,而NEON通过提供类似uint32x4_和int32x4_t这样类型的寄存器,在该类型本身中对有符号性质的数据进行编码。

sse2neon头文件有何优点?

如果您使用仿真模式将应用程序从英特尔流式单指令多数据结构移植到NEON,则与本机端口相比,您的应用程序的性能及热效率将会下降,sse2neon头文件解决了这些问题。

在移植应用程序时,您可以手动将流式单指令多数据结构的内置函数替换为NEON内置函数,但这种方式会很耗时。虽然这种方式适合于简短、隔离的代码片段,但通过使用sse2neon头文件可以更快地进行移植。

后续内容

请继续关注本系列的第2部分,了解如何使用sse2neon.h更有效、更快速地将应用程序从x86移植到Windows on Snapdragon上。

Windows on Snapdragon

计算机

嵌入系统

在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通公司或其子公司(以下简称为“高通公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通公司或任何其他方的赞同或表述。本网站同样可以提供非高通公司网站和资源的链接或参考。高通公司对于可能通过本网站引用、访问、或链接的任何非高通公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。

骁龙与高通品牌产品均为高通科技公司和/或其子公司的产品。

关于作者

拉米亚·坎蒂·波利塞蒂

应用程序工程师,高通科技公司

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】