• [迁移系列] TD迁移之金融家算法
    GaussDB(DWS)暂不支持“四舍六入五成双”/"奇进偶舍"(金融家算法)建议暂采用函数进行替换--参数1:需要取小数点精度的数值;--参数2:指小数点后取多少位;CREATE OR REPLACE FUNCTION public.Banker_Rounding(num numeric,i integer)RETURNS numericLANGUAGE sqlNOT FENCED SHIPPABLEAS $$/*逻辑:四舍六入五成双,五后有数就进一,五后无数看五前,五前为偶应舍弃,五前为奇要进一*/select case when abs(num-round(num,i))*(10^(i+1))::numeric=5 thenround(num,i)-(right(round(num,i),1)%2)*0.1^ielseround(num,i)end;$$;Select Banker_Rounding(9.115,2), Banker_Rounding(9.125,2), Banker_Rounding(9.1250000000000001,2); --返回结果 9.12, 9.12, 9.13*注:主要修正了18位以上小数异常问题,显式强转(10^(i+1))::numeric
  • [调优经验] 记一次网络中MatMul溢出调试
    背景一个encoder-decoder结构的网络,主干网络里面有很多矩阵乘MatMul和LayerNorm,由于在Ascend平台上跑的,如果使用float32进float32出,性能会慢的难以接收,但是使用float16会训着训练连续溢出导致训练失败。排查策略加loss scale由于不确定溢出是上溢还是下溢,一般可以添加动态的loss scale来排查是哪种溢出情况:iterator = dataset.create_tuple_iterator() for i, data in enumerate(iterator): loss, overflow, scaling_sens = train_net(*data) print("step: {}, loss: {}, overflow:{}, scale:{}".format(i, loss, overflow, scaling_sens))train_net参考官网迁移指南-调试调优篇 包装训练网络和loss scale。注意需要使用动态的loss scale,默认scale值要大一点才好做判断。如果一直持续overflow,但是到scale值小到一定值就不overflow了,那之前应该是上溢,用小一点的loss scale就行;如果持续overflow,直至scale值到1还是会持续溢出,那不确定是上溢还是下溢,需要开溢出dump来继续排查了。溢出dumpMindSpore 异步dump有个dump溢出算子输入输出的功能,只需要将op_debug_mode设置成3就行,其他按需配置。按教程执行训练,整个过程会慢一点,并且需要dump目录留有足够的硬盘空间,当发生溢出时会dump该算子的输入和输出,可以直接用numpy打开看下输入数据是否合理,如果有不合理的数据的话,在代码里加措施规避,比如:Sqrt的输入是0,反向溢出,除法的除数是0等等。如果输入是合理的,那需要看下计算算子精度表达范围,float16表达范围:-65504~65504,超出这个范围也会有溢出,这时需要对计算输入加clip或者Norm操作缩小输入的范围。我这次遇到的情况就是数值超过float16能表达的上线了,接MatMul的Cast操作溢出。解决策略由于不想让网络变慢,保留了MatMul float16计算,增加了MatMul之前的LayerNorm的eps,从1e-5 -> 1e-3,保证MatMul输入不要过大,另外给MatMul的两个输入除一个系数,我这次是除了32,由于MatMul后面接的SoftMax,线性操作不影响其分布,所以可以这么做,这样修改完之后溢出情况基本解决。
  • [SQL] 【Oracle语法迁移】存储过程入参及过程中table%Rowtype语法迁移
    > Oracle原存储过程Procedure xxxLog ( p_row test1%ROWTYPE ) IsBegindelete from test1 awhere a.t_period = p_row.t_period and (a.t_code=p_row.t_code or p_row.t_code is null);insert into test1 values p_row;commit;end xxxLog;> 改写GaussDB(DWS)语法示例CREATE FUNCTION xxxLog ( p_row test1 ) AS $$Begindelete from test1 awhere a.t_period = p_row.t_period and (a.t_code=p_row.t_code or p_row.t_code is null);insert into test1 values (p_row.*);END;$$ LANGUAGE plpgsql;即:1、入参时 p_row test1%ROWTYPE 调整为 p_row test1,即可表示引用test1表的字段类型;2、插入全部数据时 values p_row 调整为 values (p_row.*),即表示当前行所有信息;3、其它对于ROWTYPE定义的用法一致。> 实验示例create table test1 ( a int,b int);create table test2 ( a int,b int);CREATE FUNCTION merge_fields(t_row public.test1) RETURNS text AS $$DECLARE t2_row public.test2%ROWTYPE;BEGIN select * INTO t2_row FROM public.test1 where a=t_row.a; delete from public.test1 where a=t_row.a; insert into public.test2 values (t2_row.*); return 'from:'||t_row.a||'-'||t_row.b||' to:'||t2_row.a||'-'||t2_row.b;END;$$ LANGUAGE plpgsql;insert into test1 values(444000,2);select merge_fields(t1.*) from test1 t1 WHERE a=444000;select * FROM public.test1 where a=444000;select * FROM public.test2 where a=444000;
  • [其他] pink galaxy
    醉后不知天在水,满船清梦压星河
  • [问题求助] DevKit 代码迁移工具实验无法正常使用,portadv web端无法正常访问
    我申请了远程实验室,按照申请的指引进行代码迁移实现。但是遇到了问题如下:远程服务器中部署的portadv服务虽然启动,端口 8084  也是通的。但是通过指引https://xxx.xx.xx.xx:8084 的地址访问,显示无法访问服务器。希望得到帮助解答问题
  • [API使用] MS 中有没有和 torch 中的 view 算子类似的 inplace 的算子
    MS 提供了 view 算子,但其似乎和 torch 中的 view 算子不太一样。torch 中的 view 算子是 inplace 的,view 操作后的 tensor 和原tensor 在底层仍是同一份数据。MS 中的 view 算子则会复制一份原tensor的数据,因此 view 操作后的 tensor 和原 tensor 就是两份不一样的数据了。那 MS 中有没有类似的 inplace 的 view 算子呢?
  • [技术干货] gpg使用
    gpg使用问题发现以下报错是在openeuler20.03系统下发现的在鲲鹏社区下载鲲鹏代码迁移工具下载完成后进行解压安装执行./install web安装web界面开始出现报错原来是因为我的gpg检查导致我的部分软件包无法成功下载当关闭了gpgcheck之后便可以正常安装了那么什么是gpgcheck呢?gpgcheck介绍gpgcheck是gpg签名是否开启的选项名称,1是开启,0是不开启,一般内部部署软件包下载可以关掉。gpg签名主要用来在Linux实现官方发布的包的签名机制,主要为了软件下载使用的安全。添加gpgcheck有效的防止了软件包被篡改的情况gpg使用gpg采用的是非对称加密方式,简单理解就是用公钥加密文件,用私钥解密文件。如果你需要发送加密信息,首先获取接收者的公钥,然后利用该公钥加密后传递,对方利用对应的私钥就可解密。也就是说,公钥是锁,私钥是钥匙。非对称加密方式很好地解决了传递信息的问题。查看gpg信息gpg --version查看gpg版本信息生成主密钥使用如下命令生成主密钥gpg --full-generate-key显示如下内容这一段是版权声明,选择自己使用的加密算法,默认选择第一个选项,表示加密和签名都使用RSA算法这里系统询问密钥长度 同样默认长度为2048 长度越长则越安全接着开始设定密钥的有效期:这里默认是没有期限的之后就需要提供个人的信息GnuPG needs to construct a user ID to identify your key. Real name: Email address: Comment: 姓名填入英语拼音,下面的地址填入电子邮箱comment这一项可以不用填写输入O就表示确定Q表示放弃这里可以通过N、C、E对名字和邮箱进行修改这里我们输入O进入到下一步稍后系统就会要求你做一些随机的举动,以生成一个随机数We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy.稍后密钥就生成成功了密钥管理列出密钥gpg --list-keys第一行显示公钥文件名(pubring.kbx),第二行显示公钥特征(2048位,Hash字符串和生成时间),第三行显示"用户ID",第四行显示私钥特征。删除密钥gpg --delete-secret-keys [用户ID]删除用户私钥gpg --delete-keys [用户ID]删除用户公钥注意在删除公钥时必须要先删除对应的私钥部分才能成功过删除删除子密钥gpg --expert --edit-key [pud下方的字符]gpg --expert --edit-key D2673C470EDD2A1EE169781C86A5F36CA4FAD524 gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Secret key is available. sec rsa3072/86A5F36CA4FAD524 created: 2022-01-10 expires: never usage: SC trust: ultimate validity: ultimate ssb rsa3072/87E977522ACB63C9 created: 2022-01-10 expires: never usage: E ssb rsa2048/6DC53EC22366279E created: 2022-01-10 expires: never usage: S [ultimate] (1). zhaoyl gpg> key 6DC53EC22366279E sec rsa3072/86A5F36CA4FAD524 created: 2022-01-10 expires: never usage: SC trust: ultimate validity: ultimate ssb rsa3072/87E977522ACB63C9 created: 2022-01-10 expires: never usage: E ssb* rsa2048/6DC53EC22366279E created: 2022-01-10 expires: never usage: S [ultimate] (1). zhaoyl gpg> delkey 6DC53EC22366279E Do you really want to delete this key? (y/N) y sec rsa3072/86A5F36CA4FAD524 created: 2022-01-10 expires: never usage: SC trust: ultimate validity: ultimate ssb rsa3072/87E977522ACB63C9 created: 2022-01-10 expires: never usage: E [ultimate] (1). zhaoyl gpg> save输出密钥公钥文件(.gnupg/pubring.kbx)以二进制形式储存,armor参数可以将其转换为ASCII码显示;gpg --output public-key.txt --export [用户ID]"用户ID"指定哪个用户的公钥,output参数指定输出文件名(public-key.txt)。 类似地,export-secret-keys参数可以转换私钥导入密钥gpg --import [密钥文件]公钥文件可以上公钥服务器上寻找gpg --keyserver keys.openpgp.org --search-keys [用户ID]参考文章gpg使用
  • [问题求助] 代码迁移工具(鲲鹏服务器安装)报错
    以下报错是在openeuer20.03系统出现的下载完成后进行解压进入到解压好的目录中去执行./install web安装web界面开始出现报错安装失败应该是我的yum源没有配置好,不知道上哪里找合适的yum源
  • [问题求助] 模型迁移pb2om
    运行结果如上这是日志
  • [问题求助] 鸿蒙手表开发中,使用JAVA UI的话,用什么组件实现安卓中那种在应用的上方向下拖动(或从下向上拖动)就可以拖出来一个菜单的效果?
    在安卓中是使用“androidx.wear.widget.drawer.WearableDrawerView”来实现,可是在鸿蒙中没有找到类似的组件,也没有任何这类的说明。是说鸿蒙的手表,不可能实现这样的显示方式吗?
  • [API使用] Pytorch中的torch.device该如何迁移到MindSpore中
    想把一个用PyTorch写的UNet网络转成用MindSpore写的,其中一个torch.device的API找不到MindSpore的映射,请问应该怎么改?torch写的代码如下:torch写的代码的运行结果如下:​尝试用ms.set_context(device_target="GPU\cpu\acsend"),但是运行结果输出为None.
  • [API使用] Pytorch中的torch.device该如何迁移到MindSpore中
    想把一个用PyTorch写的UNet网络转成用MindSpore写的,其中一个torch.device的API找不到MindSpore的映射,请问应该怎么改?torch写的代码如下: torch写的代码的运行结果如下:​尝试用ms.set_context(device_target="GPU\cpu\acsend"),但是运行结果输出为None.
  • [技术干货] Go应用迁移
    HCIP-Kunpeng Application Developer考证体验——Go应用迁移第一步购买服务器本次实验需要在两个不同的平台运行GO应用程序,需要两个不同的服务器首先先看看两个服务器的基础配置x86服务器:1、x86计算2、通用计算增强型3、c6.latge.2 2vCPUs | 4GB,openEuler 20.03 64bit鲲鹏服务器:1、鲲鹏计算2、鲲鹏通用计算增强型3、kc1.2xlarge.2 8vCPUs | 16GB,Ubuntu 18.04 server 64bit with ARM尝试在x86服务器上运行GO Wed服务器首先安装GO可能有些人会将两台服务器弄混,使用以下命令可以查看系统信息uname -a1、下载GO软件包,命令行输入以下命令https://kunpeng-ip.obs.cn-north-4.myhuaweicloud.com/实验资源/3.2%20Goè¯­è¨€ä»£ç ç§»æ¤/go1.15.3.linux-amd64.tar.gz2、将下载好的软件包解压到指定的目录,输入如下命令,这里解压到/usr/local目录下tar -C /usr/local -xzvf go1.15.3.linux-amd64.tar.gz3、为GO添加环境变量,编辑文档/etc/profilevim /etc/profile在文件的最后添加上如下的代码(根据自己解压位置编写)export GOPATH=/usr/local/goexport PATH=$PATH:/usr/local/go/bin然后返回到根目录使配置生效:source /etc/profile4、使用命令验证go 安装成功go version可以返回以下版本信息表明安装成功go version go1.15.3 linux/amd64在Web服务上运行go应用1、在根目录下创建go文件,命名为hello-world.go,开始编写go程序vim hello-world.go2、输入以下简单代码作为第一个简单运用package mainimport ("fmt""net/http")func main() {http.HandleFunc("/", HelloServer)http.ListenAndServe(":8080", nil)}func HelloServer(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])}3、运行go文件,注意不要停止运行go run hello-world.go4、使用本地浏览器访问x86 ECS的EIP:8080/{string},如http://EIP:8080/x86。其中{string}可以替换为任意字符串,EIP代表ecs的公网地址Build Web服务器1、使用CTRL+c停止web服务器2、查看编译过程go build -x hello-world.go主要的编译过程如下WORK=/tmp/go-build389519517mkdir -p $WORK/b001/cat >$WORK/b001/importcfg.link << 'EOF' # internalpackagefile command-line-arguments=/root/.cache/go-build/b6/b6b1dd0c1f72d9a5d4fee29a84b4b03b5e11311a7bf56f9a3c8763fefbf0207c-dpackagefile fmt=/usr/local/go/pkg/linux_amd64/fmt.apackagefile net/http=/usr/local/go/pkg/linux_amd64/net/http.a…packagefile unicode/utf16=/usr/local/go/pkg/linux_amd64/unicode/utf16.aEOFmkdir -p $WORK/b001/exe/cd ./usr/local/go/pkg/tool/linux_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=SorAHn0T2Skvlp1JWBKs/R3Uv0wV9aW3nbbiABvZ5/Ls8w5Ac4hNlunE_gSND6/SorAHn0T2Skvlp1JWBKs -extld=gcc /root/.cache/go-build/b6/b6b1dd0c1f72d9a5d4fee29a84b4b03b5e11311a7bf56f9a3c8763fefbf0207c-d/usr/local/go/pkg/tool/linux_amd64/buildid -w $WORK/b001/exe/a.out # internalcp $WORK/b001/exe/a.out hello-worldrm -r $WORK/b001/3、查看文件,生产了hello-world4、运行可执行文件./hello-world5、使用本地浏览器访问x86 ECS的EIP:8080/{string},EIP代表x86服务器的私网ip使用ctrl+c停止web服务器在鲲鹏云服务器运行Go Web服务器安装GO1、下载GO安装包wget https://kunpeng-ip.obs.cn-north-4.myhuaweicloud.com/实验资源/3.2%20Goè¯­è¨€ä»£ç ç§»æ¤/go1.15.3.linux-amd64.tar.gz2、解压到指定的目录下tar -C /usr/local -xzvf go1.15.3.linux-arm64.tar.gz3、安装上一个服务器的配置添加环境变量vim /etc/profile在文件最后添加如下配置export PATH=$PATH:/usr/local/go/binexport GOROOT=/usr/local/goexport GOPATH=$HOME/goexport PATH=$PATH:$GOPATH/bin返回根目录,使用如下命名使配置生效:source /etc/profile4、验证GO是否安装成功go version如果返回版本信息代表安装成功go version go1.15.3 linux/arm64运行Web服务器1、从x86服务器拷贝可执行文件到鲲鹏ecsscp root@EIP:/root/hello-world /root/ (EIP代表x86服务器的私网ip)这里直接拷贝到了根目录下第一个红框位置,输入YES后按回车;第二个红框位置,输入x86的root密码后按回车。使用命令查看文件已经拷贝到鲲鹏服务器ll2、运行可执行文件./hello-world会发现在这里会报错,这是因为x86和鲲鹏平台差异导致执行格式错误,无法执行x86的二进制文件,需要在鲲鹏平台重新编译源码。Build web服务器1、从x86拷贝源码文件,同样拷贝到根目录下scp root@EIP:/root/hello-world.go /root/2、重新编译源码,这里注意这次编译将编译后的文件命名为hello-world-kpgo build -x -o hello-world-kp hello-world.go主要的编译过程WORK=/tmp/go-build858683415mkdir -p $WORK/b001/cat >$WORK/b001/importcfg.link << 'EOF' # internalpackagefile command-line-arguments=/root/.cache/go-build/a8/a813454c9a5fa88725dce14a80aa5dcf0e8a86c23b87c8085aec03a3173c4495-dpackagefile fmt=/usr/lib/golang/pkg/linux_arm64/fmt.apackagefile net/http=/usr/lib/golang/pkg/linux_arm64/net/http.a…packagefile vendor/golang.org/x/text/transform=/usr/lib/golang/pkg/linux_arm64/vendor/golang.org/x/text/transform.aEOFmkdir -p $WORK/b001/exe/cd ./usr/lib/golang/pkg/tool/linux_arm64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=XFj__tL-9CaZ6vOMXHrY/qWDDtRnClpz5sw1UnAQT/qu7Q7CWlnhkC24dw2YLs/XFj__tL-9CaZ6vOMXHrY -extld=gcc /root/.cache/go-build/a8/a813454c9a5fa88725dce14a80aa5dcf0e8a86c23b87c8085aec03a3173c4495-d/usr/lib/golang/pkg/tool/linux_arm64/buildid -w $WORK/b001/exe/a.out # internalcp $WORK/b001/exe/a.out hello-world-kprm -r $WORK/b001/3、查看文件ll4、这里试着运行新编译的hello-world-kp文件 ./hello-world-kp5、浏览器访问鲲鹏ecs的EIP:8080/{string}
  • [技术干货] python应用迁移
    ✨✨服务器配置ecs的具体配置我就不再去说明了,详细可以去参考汇编代码的迁移本次实验使用的是鲲鹏平台进行python代码的一个应用迁移✨✨首先我们先下载本次实验所需要的代码下载完成后我们需要将代码报进行解压并放入/home/python-porting/目录下进入python-porting目录下输入ls查看文件 code难点在于python编译环境的配置接下来我们首先看看如何配置python编译环境1、首先我们可以去先检查目前python版本号输入:Python3 --version这里返回的版本号是3.7.42、尝试运行python脚本我们需要进入到code目录下运行Nevnetwork.py输入命令:cd /home/python-porting/codepython3 Nevnetwork.py在这里就会发现系统出现以下错误:报错原因是当我们在鲲鹏平台并没有相匹配的Numpy模块,于是我们需要去找到相匹配的Numpy模块现在我们解决该报错的方法有两种:1、从华为云开源镜像站中查找是否有适用于ARM平台上的NumPy,如果有,直接进行安装即可。2 、对NumPy进行源码移植。大部分情况下使用第一种方式即可解决,少数情况下需要第二种方式。🎁🎁从镜像源获取适配Numpy接下来我们先看看从华为云开源镜像站中寻找是否存在适配的arm平台的Numpy1、为使用华为开源镜像源,我们需要配置华为镜像源路径修改pip的配置文件,文件位于~/.pip/pip.conf, 如果没有这个文件,可以新创建一个具体命令如下:mkdir ~/.pip #创建目录touch ~/.pip/pip.confvim ~/.pip/pip.conf 编辑pip.conf编辑内容如下:[global]index-url = https://repo.huaweicloud.com/repository/pypi/simpletrusted-host = repo.huaweicloud.comtimeout = 120编辑完成后数:wq保存退出2、安装Numpy接下来就可以使用yum命令安装Numpy依赖包yum install -y python3-devel为了确保安装成功,我们先升级以下pippip3 install --upgrade pip使用以下命令安装Numpy3、验证Numpy安装结果进入python的开发界面,调用Numpy,测试Numpy是否安装完成pyton3import numpy这个时候没有发生报错就表明安装完成4、到这里就已经说明Numpy安装成功,为了展示方法二我们先将Numpy移除使用以下命令。移除Numpypip3 uninstall numpy5、验证Numpy是否移除🎁🎁使用源码包移植Numpy这种方法比上面的方法可能要复制一点1、配置鲲鹏编译环境,安装gcc-gfortranyum -y install gcc-gfortran2、获取Numpy源码包cd /usr/local/srcwget cid:link_03、进行编译配置我们将上面获取的源码目录进行解压,记住自己解压到那个目录解压并进入源码目录cd numpypython3 setup.py install5、最后我们就可以返回根目录去验证Numpy是否安装成功使用方法一,进入启动python进行编辑终于不再报错,接下来我们就可以安装依赖库了1、使用以下命令安装依赖库pip3 install selenium tqdmpip3 install --upgrade pippip3 install matplotlib2、进入到刚刚我们的code目录中,进行代码运行python3 Traing.py这一步需要很长时间等待,请耐心等待。。。。这段时间给大家放个烟花看看🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇🎇终于在漫长的等待后我们的训练终于结束了3、接下来又是漫长的等待python3 Dy-test.py4、好了,开始查看结果进入到img目录内,发现很多图片。5、使用命令开启端口服务:python3 -m http.server打开安全组释放端口80006、打开浏览器打开浏览器输入公网IP地址。ip + 端口。打开点击链接,查看图片到这里实验结束✨✨
  • [技术干货] 汇编代码迁移
    ✨✨获取实验资源🎁🎁购买ecs实验资源ecs的配置如下:计费模式:按需计费基础配置:鲲鹏计算,鲲鹏通用计算增强型,kc1.xlarge.2 4vCPUs | 8GB(两核就可用)镜像选择:centos系统,版本在7就可以网络配置:进入弹性云服务器的网络配置页面,网络选择“vpc-default”,子网选择“subnet-default”,安全组选择“Sys-FullAccess”,公网带宽选择“按流量计费”,带宽大小选择“5”, 单击“下一步:高级配置”。使用密码登录,便于后续操作单击“下一步:确认配置”。进入弹性云服务器的确认配置页面,核对信息无误后,勾选下方的“我已经阅读并同意《华为镜像免责声明》”,单击“立即购买”,完成鲲鹏云服务器的购买。点击“返回弹性云服务器列表”,查看刚刚购买的弹性云服务器,等待约30秒,其状态变为“运行中”,并显示弹性公网IP地址。在此弹性云服务器“IP地址”中,获取该服务器的弹性公网地址使用MobaXterm登录服务器安装porting-advisor使用如下命令下载Portting-advisor安装包wget https://mirrors.huaweicloud.com/kunpeng/archive/Porting_Dependency/Packages/Porting-advisor_2.2.T2.SPC300_Kunpeng-linux.tar.gz使用解压命令对压缩包进行解压tar -zxvf Porting-advisor_2.2.T2.SPC300_Kunpeng-linux.tar.gz进入到解压后的文件中cd Porting-advisor_2.2.T2.SPC300_Kunpeng-linux使用命令安装./install web安装完成后就可以在本地浏览器登录porting-advisor,刚进去可以设置初始密码,这是你以后的登录密码检查所需要的代码这里我们需要把我们需要检查的代码上传过来,我们以2048小游戏为例进行实验(文件上传到附件中)将所需要的文件进行解压tar -xvzf 文件名称使用cp命令将2048文件拷贝到/opt/portadv/portadmin/sourcecode/目录下(一定要是这个目录,只有在这个目录当中才可以呗代码迁移工具扫描到)备份src目录下的main.c文件,具体命令如下:cd /opt/portadv/portadmin/sourcecode/2048/cp src/main.c src/main.c.bk因为我们需要对迁移的代码进行扫描,所以我们需要使目录具有可读的权限,可以使用如下命令chmod -R 755 *✨✨代码迁移🎁🎁登录鲲鹏代码迁移工具在本机浏览器中,输入https://弹性云服务器弹性公网地址:8084如果碰到安全问题告警,请点击“高级”,然后选择忽略,继续浏览。在弹出的页面输入用户名和密码,其中用户名为:portadmin,然后点击“登录”。登录完成后首页内容如下接下来我们设置分析源码的参数在“源码文件存放路径”对话框中,指定需要分析的源码——src和so_src(选中后点击即可)。源码类型:C/C++编译器版本:GCC 7.3(一定要在7以上)构建工具:make编译命令:make目标操作系统:centos 7(左右)然后开始分析,等待分析结束源码分析完成,点击查看报告🎁🎁报告分析在报告中指出,需要迁移的依赖库(so库)为两个,源文件三个,代码12行其中,依赖库具体为libhighscore.so和libcurses.so,在后面实验中,这两个库需要重新编译。需要迁移的代码所在的文件分别为main.c及两个Makefile。切换到“源码迁移建议”中,查看具体情况。关于Makefile的迁移,系统给出了迁移建议汇编代码的迁移需要根据PPT内中的内容进行迁移。具体需要迁移的代码如下图所示:✨✨代码移植🎁🎁Makefile代码移植修改Makefile文件在“源码迁移建议”的页签中,找到Makefile的路径(由于两个Makefile需要修改的内容一致,因此只做一次步骤描述)。按照提示进入该路径,进行Makefile的修改,命令如下:cd /opt/portadv/portadmin/sourcecode/srcvim Makefile按照工具的提示,添加对应的参数,具体如下:然后重复以上步骤修改/opt/portadv/portadmin/sourcecode/so_src下的Makefile🎁🎁汇编代码移值修改main.c文件同样在“源码迁移建议”的页签中,找到main.c的路径按照提示进入该路径,进行main.c的修改,命令如下:cd /opt/portadv/portadmin/sourcecode/srcvim main.c对main.c中的汇编代码进行修改,具体如下:删除#后的源代码,然后增加适用于鲲鹏平台的、相同功能的汇编代码。"mrs %0, midr_el1": "=r"(s1)::"memory"修改后的文件如下:🎁🎁编译测试依赖库重新编译进入so_src目录下,使用make命令对程序所需的依赖库进行重新编译,命令如下:cd /opt/portadv/portadmin/sourcecode/so_srcmake源代码编译进入源代码主目录,使用make命令对应用进行重新编译,命令如下:cd /opt/portadv/portadmin/sourcecodemake使用以下命令修改依赖库环境变量:export LD_LIBRARY_PATH=/opt/portadv/portadmin/sourcecode/lib:$LD_LIBRARY_PATH🎁🎁测试运行在/opt/portadv/portadmin/sourcecode目录下使用下面命令运行程序:./2048正常运行
总条数:40 到第
上滑加载中