在本人上一篇文章中,我从将应用程序移植到Windows on Snapdragon的角度描述了x86英特尔流式单指令多数据结构扩展(英特尔SSE)内置函数和NEON内置函数之间的区别。在本文中,我们将介绍如何使用sse2neon头文件将应用程序从英特尔流式单指令多数据结构扩展移植到Windows on Snapdragon上。
基于NEON实现英特尔流式单指令多数据结构扩展相关功能
头文件sse2neon.h将英特尔流式单指令多数据结构扩展内置函数转换为NEON,即在Windows on Snapdragon平台上实现高级SIMD(单指令多数据)架构。
sse2neon.h包含英特尔头文件提供的宏和函数。宏和函数将流式单指令多数据结构扩展内置函数转化为其相当的NEON内置函数。头文件支持将SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2和AES扩展转换为相当的NEON内置函数。
首先,您可以了解如何设置开发环境,以便为Windows on Snapdragon编译应用程序。然后,您可以编译一个示例应用程序。
准备开发环境
根据以下步骤准备您的Windows开发环境:
1. 将sse2neon.h头文件下载到您的应用程序源目录中。
2. 在您的应用程序源中,将所有名称中包含SSE的头文件(例如 <xmmintrin.h>、<emmintrin.h>、<pmmintrin.h>、<tmmintrin.h>、<smmintrin.h>和<nmmintrin.h>)替换为sse2neon.h。
使用sse2neon将示例应用程序移植到Windows on Snapdragon上
创建一个示例应用程序—— sampleNeonApp.cpp ——并对其进行编译,以便在Windows on Snapdragon上运行。
1. 将以下源代码复制到您的编辑器中:
#include <iostream>
#include "sse2neon.h"
int main(int argc, char **argv)
{
__m128 a = _mm_set_ps(2.0, 3.0, 4.0, 5.0);
__m128 b = _mm_set_ps(7.0, 6.0, 2.0, 1.0);
__m128 c = _mm_add_ps(a, b);
__m128 d = _mm_mul_ps(a, b);
__m128 e = _mm_sqrt_ps(a);
float f[4];
_mm_storeu_ps(f, c);
std::cout << "result of addition " << f[0] << "," << f[1]
<< "," << f[2] << "," << f[3] << std::endl;
_mm_storeu_ps(f, d);
std::cout << "result of multiplication " << f[0] << "," << f[1]
<< "," << f[2] << "," << f[3] << std::endl;
_mm_storeu_ps(f, e);
std::cout << "result of square root " << f[0] << "," << f[1]
<< "," << f[2] << "," << f[3] << std::endl;
return 0;
}
2. 将sse2neon.h下载并保存在您的源目录中。
3. 将以下内容复制到文本文件中,并将该文件重新命名为CMakeLists.txt:
project(neonSample)
cmake_minimum_required(VERSION 3.10)
add_compile_options(/Zc:preprocessor)
add_executable(sampleNeonApp sampleNeonApp.cpp)
4. 创建一个建立文件夹,并切换至该文件夹:
mkdir build
cd build
5. 运行以下命令,对代码进行交叉编译,以便在Windows on Snapdragon电脑上运行:
cmake ../ -G "Visual Studio 17 2022" -A <Specify_64bit_architecture>
6. 构建应用程序:
cmake --build ./ --config Release
7. 如能成功构建,则可以在<Path_to_SampleApp>\build\中找到一个Release文件夹。Release文件夹包含一个可执行文件,即sampleNeonApp.exe。
8. 当您在Windows on Snapdragon设备上运行可执行文件时,您可以看到以下输出:
如果您按照上面的步骤执行,而没有在代码中包含sse2neon.h,您会发现许多“未声明标识符”语法错误,如下图所示:
后续步骤
某些已经移植到Windows on Snapdragon平台上的应用程序目前使用sse2neon.h。您可以在Windows On Arm (WOA) - Confluence网站上找到该类应用程序的列表。
帮助您将应用程序移植到Windows on Snapdragon上是本公司开发人员优先关注的重要组成部分。请访问Windows on Snapdragon开发人员门户网站,并查看本公司提供的各种工具和资源。
是否缺少任何内容?请在开发人员Discord上提出问题或建议,并通过您的技术团队及时获得支持。
在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通公司或其子公司(以下简称为“高通公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通公司或任何其他方的赞同或表述。本网站同样可以提供非高通公司网站和资源的链接或参考。高通公司对于可能通过本网站引用、访问、或链接的任何非高通公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。
骁龙与高通品牌产品均为高通科技公司和/或其子公司的产品。
关于作者
拉米亚·坎蒂·波利塞蒂
应用程序工程师,高通科技公司