建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

DreamingIn...

发帖: 1粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-21 00:08:47 2198 6 楼主 显示全部楼层
华为云鲲鹏ARM服务器台风自动定位科学计算程序改造小结

华为云鲲鹏ARM服务器台风自动定位科学计算程序改造小结

     

      知道鲲鹏服务器上线后,先去了解了鲲鹏社区,看到很多中间件比如数据库等已经被移植完毕,但由于下手不够快RC6资源被飞快申请完了,还好华为云很贴心的提供了RC3资源,比RC6性能稍微弱一点,但完全不影响使用.

      登录服务器检查了各种环境,看起来基于ARM64的linux和X86的没有太多区别,鲲鹏芯片的主频并不比服务器版比如至强X86低多少,但是由于指令集不一致,对比主频并没有实际意义

     考虑了很久选择哪个程序进行移植测试,直接上MPI程序可能一两周也没有结果,从写过和改过的程序中选一个代码量中等比如2W行左右,自己比较熟悉的程序,同时很有代表性的程序,科学计算类的程序往往包含大量的数学库,需要一些相对小众的依赖库

      根据这个标准最终选择了台风自动定强软件包ADT进行测试,该软件包含了Fortran和C/C++代码,运行需要编译和安装HDF5和NC库,同时包含不少图形学计算和动力学计算,涉及了卫星红外和微波处理流程,是一个相对典型的应用,自己也做过这个程序的容器化封装,基本看遍了大部分代码,因此选择这个程序在CentOS 7.5的ECS RC3实例上试水。


移植过程:

第一步,编译依赖库前

    首先安装libcurl、gcc-gfortran、libtool等软件


第二步,编译HDF5

    这个时候会有第一个坑,如果用时HDF5.1.8版本,默认configure文件不支持arm64,需要去HDF对应官网上的论坛上下载,这是我验证后可用的configure.sub和guess文件

wget 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' -O bin/config.guess
wget 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' -O bin/config.sub

    注意需要在编译选项中打开fortran接口支持,否则无法编译fortran程序


第三步,编译NetCDF4.5.1 

          同样注意需要打开fortran接口,但NC库编译链接库的位置设置的方法和HDF5文件不一致,需要通过设置环境变量的方式,而不是像h5一样--with-XXlib=XX\XX的方式,强烈推荐编译完成后make test,看一下哪些样例能跑通,如果有Warning或者error需要特别留意,因为,后面应用程序很可能会有类似的问题无法编译通过 


第四步,开始应用程序编译


    修改makefile,指定编译器,建议首先去掉编译优化选项,打开-Wall
    这个时遇到了真正有挑战的问题,代码编译不过去
         看到这个问题的时候一脸懵逼,这是一个Fortran程序和C进行动态联接编译时出的错误,同样的程序在X86下编译完全没有问题,经过对代码分析,整个注释掉这个模块,确认是delaunay三角网构建C版本的程序中的 一些自定义的方法和声明没有在fortran调用程序中显式声明,gfortran 4.8.5 arm版本似乎不会自动去匹配.o和.mod中没有显示声明函数,这个看可能是arm gcc和gfortran的bug,也或者是没有找到对应的编译选项。
       但是这个是重要计算过程,又不愿意放弃ADT中的微波数据处理模块,于是开始大量的修改代码中不规范的部分,所有引用显示声明,去掉typedef这种用法,经过大概2天的修改,终于能编译通过,同时还需要注意char类型的转换问题,arm64平台的有符号和无符号似乎是x86不一致,在处理一些卫星ID、标号时需要注意


第五步,运行测试最终结果

     ldd查看链接库是否正常

     file确认是生成了 arm64的可执行程序

     使用FY2数据进行测试,顺利运行得到结果,

     可喜的是同样内存配置的X86 ecs,测试并没有发现arm版本运行显著变慢

小结:
     从开始做到可以正确运行结果,大概花了30多个小时,充分说明了就算是熟悉的程序,进行移植很可能也是不小的工作量,如果对要移植的代码不熟悉,同时对ARM系统不熟悉,很可能会束手无策,因此还是要提前分析和测试。
       这个过程让我想起了多年前一个卫星正射影像计算程序需要移植到小型机,在power芯片上用xlc编译gdal的过程,大量的改库的代码,大约一个月才做出了一个勉强能跑,但由于对编译器和平台不熟悉,处理时长了3-4倍,性能比x86差一截的惨痛经历。
     相比Power,ARM的生态看来确实好了很多, 如果希望建设ARM国产芯片的生态,更多的应该倡导鲲鹏而不是飞腾或者申威的方式,毕竟绝大多数人都没有机会和能力去做超算程序的改造,2019年基于x86的Scientific Linux 不再继续开发,或许是ARM构建科学计算生态的一个机遇。
     未来还是很期待鲲鹏+昇腾芯片的服务器,如果这种产品的软件生态可以做起来,可以部分改变现在AI强烈依赖NVIDIA的现状,这样才能开始真的自主可控。


举报
分享

分享文章到朋友圈

分享文章到微博

阿奇@汪汪...

发帖: 10粉丝: 6

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2019-8-21 11:15:05 沙发 显示全部楼层

分析挺赞。

弱问一下,为啥要去掉编译选项呢 ?

点赞 引用 举报

DreamingIn...

发帖: 1粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-21 13:18:29 板凳 显示全部楼层
阿奇@汪汪队 发表于 2019-8-21 11:15 分析挺赞。弱问一下,为啥要去掉编译选项呢 ?

一般需要先保证不加编译优化跑通程序和测试,然后加上后验证结果正确性,很多很老的程序编码不够规范,编译优化经常会造成浮点数运行结果错误等问题

点赞 引用 举报

寻水的鱼

发帖: 92粉丝: 19

级别 : 管理员

Rank: 9Rank: 9Rank: 9

发消息 + 关注

发表于2019-8-21 14:58:04 地板 显示全部楼层

不错!!

点赞 引用 举报

wemecn

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-26 20:48:36 5# 显示全部楼层

非常实用,点赞。学习了,希望能看到更多这样迁移的实践

点赞 引用 举报

hongson

发帖: 11粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-9-10 15:07:00 6# 显示全部楼层

谢谢分享,文章很有干货、

点赞 引用 举报

sailiang

发帖: 6粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-9-11 10:27:33 7# 显示全部楼层

一看就知道是高手了~

点赞 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册