ARM64 Windows 10 IoT工控主板运行x86程序效率测试

        ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序,而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400,可预装正版Windows 10 IoT企业版操作系统,x86程序可无需修改而直接在ESM8400上运行。

        下会将编写一个小程序,分别构建成x86ARM64格式来测试其运行效率。所设计的测试程序代码如下,其中的TestSmp函数有两个输入参数,第一参数表示要创建测试线程的数量,第二个参数为所创建线程的运行时长。cbTestSmp是被创建的测试线程,测试线程主要是在一个while循环中,反复读取内存变量然后与预设值进行比较,在运行设定的时间后自动退出循环,其中的threadParam->loops变量会记录下while循环总共执行的次数。

typedef struct _SMP_THREAD_PARAM
{UINT32 durationMs;UINT32 cpuId;UINT64 loops;BOOL   bSetAffinity;UINT32 sandBoxSize;LPVOID sandBoxStart;
}SMP_THREAD_PARAM, * PSMP_THREAD_PARAM;DWORD WINAPI cbTestSmp(LPVOID param)
{PSMP_THREAD_PARAM threadParam = (PSMP_THREAD_PARAM)param;DWORD tStart = GetTickCount();UINT8* buffer = (UINT8*)threadParam->sandBoxStart;wprintf(L"Ahou, Thread %d, running for %d ms\r\n", threadParam->cpuId, threadParam->durationMs);// Write to sandboxfor (UINT32 i = 0; i < threadParam->sandBoxSize; i++){buffer[i] = (UINT8)(i);// * (UINT32)threadParam->loops);}while ((GetTickCount() - tStart) < threadParam->durationMs){// Read back from sandboxfor (UINT32 i = 0; i < threadParam->sandBoxSize; i++){//if (buffer[i] != (UINT8)(i * (UINT32)threadParam->loops) )if (buffer[i] != (UINT8)(i))// * (UINT32)threadParam->loops) ){wprintf(L"Thread %d : error at byte %d for loop %I64d !!\r\n",threadParam->cpuId, i, threadParam->loops);}}threadParam->loops++;}wprintf(L"Thread %d : terminating\r\n", threadParam->cpuId);return 0;
}void TestSmp(UINT32 nCpus, UINT32 durationMs)
{UINT32 i;PSMP_THREAD_PARAM threadParams;HANDLE* threadHandles;UINT64 totalLoops = 0;UINT32 sandBoxSize = 1024 * 128; // 128 kBHANDLE h_array[1];threadParams = (PSMP_THREAD_PARAM)malloc(nCpus * sizeof(SMP_THREAD_PARAM));if (threadParams == NULL){wprintf(L"Failed allocating thread params !\r\n");return;}threadHandles = (HANDLE*)malloc(nCpus * sizeof(HANDLE));if (threadHandles == NULL){wprintf(L"Failed allocating thread handles !\r\n");return;}for (i = 0; i < nCpus; i++){threadParams[i].bSetAffinity = TRUE;threadParams[i].cpuId = i;threadParams[i].durationMs = durationMs;threadParams[i].loops = 0;threadParams[i].sandBoxSize = sandBoxSize;threadParams[i].sandBoxStart = malloc(sandBoxSize);threadHandles[i] = CreateThread(NULL, 0, cbTestSmp, &threadParams[i], 0, NULL);wprintf(L"Thread handle %d : 0x%x\r\n", i, threadHandles[i]);}h_array[0] = threadHandles[0];DWORD res = WaitForSingleObject(h_array[0], INFINITE);Sleep(500);if (res == WAIT_TIMEOUT){wprintf(L"Timeout waiting for threads !\r\n");}else{wprintf(L"All threads exited\r\n");}for (i = 0; i < nCpus; i++){wprintf(L"Thread %d did run %I64d loops\r\n", i, threadParams[i].loops);totalLoops += threadParams[i].loops;free(threadParams[i].sandBoxStart);CloseHandle(threadHandles[i]);}wprintf(L"Total number of loops %I64d (%I64d millions)\r\n", totalLoops, totalLoops / 1000000);free(threadHandles);free(threadParams);
}

        将上述代码分别编译构建成x86格式和ARM64模式,设置while循环执行10000ms,在ESM8400上的测试结果如下:

ESM8400 Win10 ARM工控主板运行x86和ARM64程序效率对比

        可以看到相同的代码,构建成本机ARM64格式的运行效率是x86格式的2.2倍以上。

        基于微软系统以及其开发工具良好的兼容性,我很容易做了另一个对比实验,将上述代码不经修改直接在VS2008中编译成WEC7应用程序,在英创的几款WEC7工控主板上做了同样的测试,测试结果如下:

        ESM3354是英创10年前推出的第一款预装WEC7的工控主板,主CPU采用了TI的单核Cortex-A8芯片——AM3354,ESM3354目前仍在批量供货。而安装Windows 10 IoT的ESM8400工控主板,主CPU为NXP的i.MX8M Plus四核Cortex-A53,与10年前的ESM3354相比,ESM8400的性能有超过10倍的提升。

         ARM上的 Windows IoT 企业版可以让习惯使用 x86/x64 的设备开发人员快速进行软件开发,大多数适用于 Windows IoT 企业版的文档都适用于 ARM64 x86/x64。通过仿真技术,ARM上的 Windows IoT可按原样运行x86/x64程序而无需修改,而直接构建本机ARM64应用程序能获得最佳的性能、响应能力和能耗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【信息系统项目管理师】第14章:项目沟通管理过程详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划沟通管理1、输入2、工具与技术3、输出二、管理沟通1、输入2、工具与技术3、输出三、监督沟通1、输入2、工具与技术3、输出一、规划沟通管理 定义:规划沟通管理是基于每个干系人或干系人群体的信息需求…

小程序组件 —— 23 组件案例 - 轮播图图片添加

上一节实现了轮播图的最外层结构&#xff0c;但是没有通过轮播图来渲染图片&#xff0c;这一节我们先讲一下小程序中怎么来渲染图片&#xff0c;讲解完之后会通过轮播图来展示图片&#xff1b; 在微信小程序中&#xff0c;如果需要渲染图片&#xff0c;需要使用 image 组件&am…

QEMU监控器简介

QEMU监控器&#xff08;monitor&#xff09;是QEMU实现与用户交互的一种控制台&#xff0c;一般用于为QEMU模拟器提供较为复杂的功能&#xff0c;包括为客户机添加和移除一些媒体镜像&#xff08;如CD-ROM、磁盘镜像等&#xff09;&#xff0c;暂停和继续客户机的运行&#xff…

【ubuntu】安装OpenSSH服务器

参考:https://blog.csdn.net/fanjufei123456/article/details/139264814 要在Ubuntu上使用SSH连接&#xff0c;需要确保系统上安装并运行了SSH服务器。SSH服务器负责接受来自其他计算机的SSH连接请求&#xff0c;并提供对目标系统的访问权限。 在Ubuntu上&#xff0c;默认情况…

阿克曼(Ackmann)函数

时间限制&#xff1a;C/C 1000MS&#xff0c;其他语言 2000MS 内存限制&#xff1a;C/C 256MB&#xff0c;其他语言 512MB 难度&#xff1a;中等 分数&#xff1a;100 OI排行榜得分&#xff1a;12(0.1*分数2*难度) 描述 阿克曼(Ackmann)函数A(m&#xff0c;n)中&#xff0c;m&…

Python-Pdf转Markdown

使用pdfminer.sixmarkdownify pdfminer.six可以提取Pdf文本内容markdownify可以将文本内容写markdown文件 安装 pip install pdfminer.six pip install markdownify实现 from pdfminer.high_level import extract_text from markdownify import markdownifydef pdf2markdo…

JS之BOM,DOM

简介&#xff1a; BOM:Browser Object Model:浏览器对象模型,BOM中的顶级对象就是window DOM:Document Object Model 文档对象模型。页面中有一个顶级对象:Document window----皇上 document–总管太监,window对象下的属性,有的时候也是一个对象, 对象可以调用属性或者方法 w…

rem em rpx px vw的区别

在前端开发中&#xff0c;rem、em、rpx、px 和 vw 是常用的单位&#xff0c;它们各自的用途和计算方式不同&#xff0c;适用于不同的场景。以下是它们的详细对比&#xff1a; 1. px (像素) 定义&#xff1a;绝对单位&#xff0c;表示设备屏幕上的实际像素点。特点&#xff1a;…

自动驾驶新纪元:城区NOA功能如何成为智能驾驶技术的分水岭

目录 一、NOA 的定义 二、NOA 的主要特点 导航集成 场景覆盖 智能决策 高级感知能力 驾驶员参与 三、NOA 的优势 四、NOA的衡量指标 定性评价指标 安全性评价指标定义 可靠性评价指标定义 舒适性评价指标定义 通行效率评价指标 定量评价指标 五、代表厂商的实测…

石岩路边理发好去处

周末带娃去罗租公园玩&#xff0c;罗租公园旁边就是百佳华和如意豪庭小区&#xff0c;发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避&#xff0c;例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…

STM32-笔记24-智能开关垃圾桶盖

一、模块及接线 二&#xff0c;项目目的 以下几个事件触发时&#xff0c;自动开盖&#xff0c;并伴随蜂鸣器短响一声&#xff0c;同时 LED 灯闪烁一下&#xff0c;2秒后自动关盖&#xff1a; 检测到有人靠近检测到有震动按下按键 KEY1 实验框图如下&#xff1a; 三、项目前期…

从零开始开发纯血鸿蒙应用之UI封装

从零开始开发纯血鸿蒙应用 一、题引二、UI 组成三、UI 封装原则四、实现 lib_comps1、封装 UI 样式1.1、attributeModifier 属性1.2、自定义AttributeModifier<T>类 2、封装 UI 组件 五、总结 一、题引 在开始正文前&#xff0c;为了大家能够从本篇博文中&#xff0c;汲…

使用ArcGIS Pro自带的Notebook计算多个遥感指数

在之前的分享中&#xff0c;我们介绍了如何使用ArcPy将GEE下载的遥感影像转为单波段文件。基于前面创建的单波段文件&#xff0c;我们可以一次性计算多种遥感指数&#xff0c;例如NDVI、EVI、NDSI等。我这里直接在ArcGIS Pro中自带的Notebook进行的运行。如下图所示&#xff0c…

超大规模分类(一):噪声对比估计(Noise Contrastive Estimation, NCE)

NCE损失对应的论文为《A fast and simple algorithm for training neural probabilistic language models》&#xff0c;发表于2012年的ICML会议。 背景 在2012年&#xff0c;语言模型一般采用n-gram的方法&#xff0c;统计单词/上下文间的共现关系&#xff0c;比神经概率语言…

Python 实现 冒泡排序算法示例

冒泡排序算法示例 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历要排序的列表&#xff0c;比较相邻的元素&#xff0c;并交换它们的位置&#xff0c;如果它们的顺序错误。这个过程会重复进行&#xff0c;直到没有需要交换的元素为止&#x…

275-增强型多功能数据采集卡PCIe-6251-EX

产品特点&#xff1a; 高速高精度数据采集&#xff0c;16bit10MSPS&#xff0c;32路单端/16路差分高速高精度任意波形发生&#xff0c;14bit165MHz&#xff0c;2路完全独立完全可编程的I/O端口&#xff0c;33个完全可编程的量程选择&#xff0c;0~5V/0~10V/5V/10VPCIe通信接口…

Llama 3 后训练(三)

目录 4. 后训练 4.1 建模 图表解读 4.1.1 聊天对话格式 4.1.2 奖励建模 4.1.3 监督微调&#xff08;Supervised Finetuning&#xff09; 4.1.4 直接偏好优化&#xff08;Direct Preference Optimization&#xff09; 4.1.5 模型平均&#xff08;Model Averaging&#x…

机器人C++开源库The Robotics Library (RL)使用手册(四)

建立自己的机器人3D模型和运动学模型 这里以国产机器人天机TR8为例,使用最普遍的DH运动学模型,结合RL所需的描述文件,进行生成。 最终,需要的有两个文件,一个是.wrl三维模型描述文件;一个是.xml运动学模型描述文件。 1、通过STEP/STP三维文件生成wrl三维文件 机器人的…

聚类的主要算法和介绍

聚类是一种无监督学习算法&#xff0c;用于将数据集划分为多个组&#xff08;或簇&#xff09;&#xff0c;使得同一簇内的数据点更相似&#xff0c;不同簇之间的点差异更大。以下是主要的聚类算法及其特点、应用场景和局限性&#xff1a; 1. K-Means 聚类 特点&#xff1a; …

uniapp3 手写签名组件(vue3 语法)封装与应用

本文介绍了基于 uniapp3&#xff08;vue3 语法&#xff09;封装的手写签名组件。 包括父组件的调用方式&#xff0c;如通过条件判断展示签名图片或点击进入签名页面&#xff0c;以及接收签名照片的逻辑。子组件涵盖了自定义导航栏、清除、取消、确认等操作按钮&#xff0c;利用…