AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

华为 DevRun 开发者沙龙—湖南省鲲鹏生态创新中心专场技术干货分享

  • 2020-07-14
  • 本文字数:4413 字

    阅读完需:约 14 分钟

华为DevRun开发者沙龙—湖南省鲲鹏生态创新中心专场技术干货分享

新基建风口下,计算产业的重要程度不言而喻,算力上的投入不仅直接带来 ICT 行业的增长,还对制造、交通、能源、零售等诸多行业带来创新改变,为了追求经济稳固增长,满足市场多元化算力需求,企业对算力要求越来越高,传统 x86 架构渐渐难以满足企业算力需求。


功耗大、通用寄存器数量少、计算机硬件利用率低、寻址范围小等问题凸显,使得 x86 架构劣势渐显难以跟上算力发展的速度,与此同时,ARM 架构在移动互联网盛行的当下开始焕发出别样的生命力,在 ARM 优势极速凸显后,x86 应用向 ARM 的迁移已成为一种趋势,但计算世界终究是牵一发而动全身,应用迁移过程中出现的众多痛点,使得 ARM 应用迁移陷入被动之地。


基于 ARM 架构来设计的鲲鹏,很早前便看到了未来计算机算力架构的迭代之路,建设了鲲鹏社区和华为云学院,指导和帮助开发者进行应用迁移的工作。


7 月 11 日,华为「18 城鲲鹏创新中心开发者创享日·湖南省鲲鹏生态创新中心专场」圆满落地,本场沙龙是由湖南省鲲鹏生态创新中心与华为技术有限公司联合面向湖南 ICT 行业从业人员开展,旨在培养开发者基于鲲鹏底座开发适配应用软件的高阶能力,激发开发者的创新潜能,为湖南省企业的数字化转型积蓄了力量。



本场沙龙以现有的鲲鹏平台软件迁移成功案例为基础,向与会者介绍 x86->ARM 平台软件迁移思路、难点和应对策略,以及迁移后的性能调优方法讲解,帮助开发者更好更快地上手鲲鹏应用迁移。

SO 库迁移

迁移工作中免不了对自己不熟悉的应用进行迁移,当开发者拿到一个不太熟悉的应用时,如何准备迁移工作?需要遵循哪些流程?碰到这种情况不用慌,本次课程向开发者们传授关键的迁移思路及分析过程。


第一个案例是加速库的迁移:ShengBTE 迁移。当拿到一款不太熟悉的软件,首先查看这个软件大概的功能、作用在哪些方面,通过搜索得知 ShengBTE 是一个专业性较强的应用,它被用于计算晶体的热传导率,整个应用使用 C 语言进行编写,配合一些数学函数库来使用。



有了基本了解后,开发者可按照以下 3 个迁移关键步骤来完成 ShengBTE 迁移分析:


1、 获取依赖信息。通过官方文档获取应用的依赖栈信息,源码获取方式、编译安装方法,也可结合第三方网站 Archlinux 来搜寻信息。


通过此方法了解到 ShengBTE 包含三个依赖栈,MPI 一个基于 GCC 的编译器,MKL 经过 intel 优化的一个数学函数库,spglib 一个常用的开源数学计算库。


2、 分析依赖兼容情况,找出不兼容的依赖分析移植方法。得知了依赖栈,开发者需要根据依赖栈的开源与否和软件平台的兼容情况,对依赖栈进行选择性替换。


MPI 作为 intel 平台使用的编译器,并不兼容鲲鹏,这里使用 Openmpi 作为编译器替换。spglib 作为开源数学计算库,可在鲲鹏直接安装使用。最后一个 MKL 的依赖栈用 lapack 来作为替换,但实际替换完后,编译过程中发现缺少部分函数无法直接使用,这时需要更换替换案例。


3、 移植依赖库,将不兼容的依赖替换成 ARM 下兼容的依赖库。经过对 MKL 替换案例的查询,发现可使用 OpenBLAS 做到完美替换,最终安装 OpenBLAS 然后在编译脚本中做相关修改,替换掉链接库完成整个迁移。


以上三点是应用迁移的 3 个关键步骤,从依赖信息的获取,依赖情况分析替换,再到一些没办法使用的依赖栈是怎样去替换的,这些需要开发者心中有清晰的迁移分析流程,才不至于因不熟悉的软件迁移而手忙脚乱。



在迁移分析完成之后,要对编译脚本进行修改,上图中左面插入的图片是官方提供的 Makefile 脚本,右图是修改后的脚本,整个脚本修改涉及到编译参数、编译器、依赖库三项修改。


在编译参数上,Openmpi 的编译命令同样是 MPIF90 无需进行修改,但是 intel MPI 有自己特殊的编译参数 static_intel,在 Openmpi 上并不兼容,需要对其进行相关屏蔽。修改脚本的最后一步,使用之前找到的 OpenBLAS 来完美替换 MKL 依赖库,整体的编译脚本修改就完成了。



最后回顾下整体迁移思路:


分析软件依赖,通过查阅官方文档或者是查阅第三方的网站。


找到依赖后可通过鲲鹏自带的工具去扫描依赖软件是否兼容。


不兼容则需要考虑软件是否开源,如果能得到源代码进行编译是可以适配鲲鹏平台的。


如果软件不开源则需要进行依赖替换,在功能满足的情况下,实在找不到可替换的依赖,就需要开发者进行相关屏蔽,然后再进行编译安装,这就是应用迁移的整体思路。

Maven 工程迁移

NiFi 软件移植,大数据开发者比较了解 NiFi 是一个开源大数据工作平台,将各个数据处理环节模块化,主要目标是简化大数据开发工作量。



在 NiFi 软件迁移过程中,通过命令进行编译打包时发现红字报错,显示没有找到 Jar 包。首先需要排查网络原因,因为在第一次编译时是从国外网站拉取 Jar 包,存在网络不通的情况,经过排查发现网络正常,此时就把目光聚集在 Jar 包本身。


根据相关配置 Pom.xml 去找到 Jar 包相关配置是否正常,详细配置看右边截图展示,groupID 可以理解成 Jar 包在仓库中的具体路径,kudu-binary 代表 Jar 包的名称,version 表示版本,classifier 是个具体的限制条件,在这里主要是用于区分环境,要求找到 aarch64 这样一个版本。


执行 mvn install 之后,系统会解析 Pom.xml 配置信息,先根据 Scope 去判断需不需要拉取,执行相关的测试用例,经过一系列尝试发现 kudu-binary 这个 Jar 包是无法打包出来的,获取不到相关的源码,但这个过程其实不是一无所获的,从官方文档得到的信息是说 kudu-binary 这个 Jar 包是用于测试用例的执行,影响的范围只是 NiFi 下 kudu 的一个小模块里面的一个功能的调用,这部分功能是可以手动做相关测试和执行的,所以尝试将其屏蔽,然后再将两个相关测试用例屏蔽掉,屏蔽以后再进行编译安装,最后完成整体迁移。



在这里回顾下 Maven 迁移整体思路:


如果 Maven 打包失败,首先应该排除网络原因,然后检查 pom.xml 相关配置,确认能从仓库中能找到相关 Jar 包,找不到需要修正相关配置,找得到就要看看是不是其他问题,如果 Jar 包调用报错了,可以根据鲲鹏开发套件 Dependency Advisor 等去做相关扫描,扫描出哪些依赖是否有问题。


如果是 Jar 包一般来说是含 x86 下的 SO 库,如果是含 C 的依赖,就需要对相关 Jar 包进行处理。处理的方法与依赖栈替换一样,要去获取相关的源码,编译得到相关的依赖 Jar 包,编译完之后,替换到本地仓库之中来完成整体打包。

Python 迁移

Python 的通用的迁移思路,主要围绕 Python 特有的配置文件 setup.py 文件,去查看相关的依赖,关注的它的依赖所存放的一些源或者仓库,如果这些源是国外的,没有办法拉取使用则可更换源再次尝试,源没有问题可直接使用 pip 一键安装。


除此之外,开发者可能会遇到一些 SO 包加载不了的问题,可能是域名访问不通,或者是本地解析有问题,这些基本上都是网络的问题,通过把网络问题排查清楚以后,就可以进行安装编译 Python 移植相对简单。



此次软件移植案例主要分享了三类场景,主要是针对 Maven、pom.xml 文件和 setup.py 三类文件进行修改,这些可以解决大部分的迁移问题,主要思路就是定位不兼容的依赖,不兼容依赖可以通过一些手段安装或者替换。


比方说通过源代码进行安装,拉取它的源代码在鲲鹏平台上进行编译安装。如果没有开源就去寻找替代的方案,通过去查阅相关的资料,找到替换的方案以后寻找相关的文件,将它适配到鲲鹏平台上,通过三种主流的应用迁移案例分享,希望能够帮助开发者在软件迁移过程中能有清晰的迁移分析思路。

硬件性能调优

从冯·诺伊曼架构看性能调优方向,基于硬件方面进行性能调优的有四个方向:CPU/内存、磁盘、网卡、应用,以编译器为例,如何优化才能打破 CPU/ 内存瓶颈?这里展开讲解一下编译器的性能优化:


指令布局优化:拆分函数代码,按照冷热指令重新排布,提升指令 Cache 命中率。


内存布局优化:按照内存数据访问频度,组合热数据区域,提升数据 Cache 命中率。


循环优化:分析循环迭代间数据访存依赖关系, 对无依赖的循环并行到多核执行,无依赖的数据自动矢量化计算,加速程序运行。


针对 SMP 系统下核数的扩展受到内存总线限制的问题:鲲鹏处理器支持 NUMA 架构,能够很好的解决 SMP 技术对 CPU 核数的制约,NUMA 架构将多个核结成一个节点 (Node),每一个节点相当于是一个对称多处理机,一块 CPU 的节点之间通过 On-chip Network 通讯,不同的 CPU 之间采用 Hydra Interface 实现高带宽低时延的片间通讯,在 NUMA 架构下,整个内存空间在物理上是分布式的,所有这些内存的集合就是整个系统的全局内存。每个核访问内存的时间取决于内存相对于处理器的位置,访问本地内存(本节点内)会更快一些。



从上图可以看到,不同 NUMA 内的 CPU core 访问同一个位置的内存,性能是不同的。内存访问时延从高到低为:跨 CPU > 跨 NUMA 不跨 CPU > NUMA 内,因此在应用程序运行时要尽可能的避免跨 NUMA 访问内存,此时可以通过 NUMA-Aware 亲和性资源规划,让内存访问最短路径。



在此介绍三种 NUMA 绑核配置的方法:


使用系统工具 numactl 设置。numactl -C 0-15 process name-C:Core scope


在代码中调用亲和性设置参数。pid_t pid, size_t cpusetsize, cpu_set_t *mask


多数开源软件中提供了配置接口。nginx.conf 文件中 worker_cpu_affinity 参数


以上均为 CPU/内存的优化方法,受篇幅所限只能遴选出一二知识点进行概述,性能调优是一个长期的过程,需要开发者们选择一个合理的性能优化平衡点,例如在调整网卡中断聚合上,低中断高吞吐与高中断低时延的选择,需要根据实际情况进行取舍,只有最合适的才能达到最好的性能。

写在最后

此次湖南省鲲鹏生态创新中心面向湖南 ICT 行业从业人员开展的鲲鹏技术沙龙,不仅让线下的参会者对鲲鹏生态有了更加深入的了解,也让鲲鹏计算产业收获了一批忠实的粉丝,鲲鹏计算产业生态的同行者和共建者越来越多,意味着鲲鹏计算体系生态圈的进一步扩大。



在沙龙现场,华为鲲鹏技术专家们针对鲲鹏计算生态及软件迁移与调优过程中可能遇到的问题为开发者们答疑解惑,并通过分享相关技术原理、实践经验和对应方法论,让开发者了解到如何在鲲鹏芯的基础上打造更具优势的解决方案。


同时,在鲲鹏计算生态的高校推广中,湖南省鲲鹏生态创新中心联合湖南本土优质高校,如国防科技大学、中南大学、湖南大学进行鲲鹏技术、鲲鹏人才进校园活动,各高校开设了选修课、理论课、实训课从高等教育中培养开发者基于鲲鹏底座开发适配应用软件的高阶能力,激发了开发者的创新潜能。

百舸争流 鲲鹏扬帆-鲲鹏应用创新大赛 2020(湖南赛区)

目前鲲鹏应用创新大赛 2020(湖南赛区)已经如火如荼展开,现面向全产业开发者开放报名通道,共同打造鲲鹏全栈解决方案,实现技术与商业创新应用。参赛队伍需基于鲲鹏计算技术构建产品与解决方案,包含华为云鲲鹏云服务、鲲鹏主板、鲲鹏服务器等产品,打造各个不同场景的软硬件解决方案。

奖金设置

赛题设置

比赛时间安排

总决赛和半决赛:8 月 7 日-8 月 12 日



最后,希望开发者们能够踊跃参赛,祝大家势如破竹,金榜题名!


点击链接进入湖南赛区官网。


2020-07-14 16:361606

评论

发布
暂无评论
发现更多内容

TOP 5!望繁信科技获评WAIC2022全球创新项目路演优胜项目

望繁信科技

WAIC2022

主流定时任务解决方案全横评

阿里巴巴云原生

阿里云 Serverless 云原生

i++需要多少QPS才能测出BUG

FunTester

软件测试 | 测试开发 | 如何模拟真实使用场景?mock 技术来帮你

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | Jenkins 踩坑(三)| Email 配置与任务邮件发送

测吧(北京)科技有限公司

测试

长沙!《学习的学问》长沙分享会

博文视点Broadview

行业案例|长安汽车质量管理数据分析实践

Kyligence

质量管理 数据管理 长安汽车

中文稀疏GPT大模型落地——通往低成本&高性能多任务通用自然语言理解的关键里程碑

阿里云大数据AI技术

自然语言处理 多任务 企业号九月金秋榜 GPT

找准风口,如何从运维转向 DevOps?

飞算JavaAI开发助手

OpenHarmony中的HDF单链表及其迭代器

OpenHarmony开发者

Open Harmony

Spring源码分析(九)lazy-init 在Spring中是怎么控制加载的

石臻臻的杂货铺

spring 9月月更

C语言_3 选择结构

泾箐

c 9月月更

「工作小记」多个批量操作的链式实现

叶一一

前端 设计思维 React Hooks 9月月更

FreeRTOS记录(二、FreeRTOS任务API认识和源码简析)

矜辰所致

源码分析 FreeRTOS 9月月更 任务API

小六六学Netty系列之Netty群聊

自然

Netty 网络 9月月更

leetcode 104. Maximum Depth of Binary Tree 二叉树的最大深度(简单)

okokabcd

LeetCode 算法与数据结构

C语言_2 变量

泾箐

c 9月月更

源于加速,不止加速-阿里云加速引擎的10年演化之路

阿里云CloudImagine

CDN CDN加速 CDN技术

软件测试 | 测试开发 | 想测试入门就必须要懂的软件开发流程

测吧(北京)科技有限公司

测试

微信Windows端IM消息数据库的优化实践:查询慢、体积大、文件损坏等

JackJiang

sqlite 微信 网络编程 即时通讯 IM

小六六学Netty系列之Java NIO(二)

自然

Netty 网络 9月月更

Netty高并发处理架构设计介绍

孙大卫

架构 Netty 开发框架 9月月更

软件测试 | 测试开发 | 数据持久化技术(Java)

测吧(北京)科技有限公司

测试

数据治理的内核:数据标准

小鲸数据

数据治理 大数据平台 数据管理平台 数据标准 大数据仓库

易周金融分析 | 多家银行试水特色网点揽客;自动驾驶颠覆传统车险模式

易观分析

自动驾驶 金融 银行 网点

软件测试 | 测试开发 | RPC接口测试技术-Tcp 协议的接口测试

测吧(北京)科技有限公司

SAP UI5 ManagedObject 的 Association 讲解

汪子熙

JavaScript typescript SAP UI5 ui5 9月月更

软件测试 | 测试开发 | 一文带你了解K8S 容器编排(上)

测吧(北京)科技有限公司

测试

云游戏产业链深度解析

Finovy Cloud

云计算 5G 云渲染 云游戏

小六六学Netty系列之Java 零拷贝

自然

Netty 网络 9月月更

阿里云弹性计算技术专家樊毅伟:云上成本优化实践

阿里云弹性计算

自动化运维 资源利用

华为DevRun开发者沙龙—湖南省鲲鹏生态创新中心专场技术干货分享_架构_马红伟_InfoQ精选文章