内存一致性静态检查
内存一致性检查就是检查源码迁移在鲲鹏平台运行时可能存在的内存一致性问题,并提供插入内存屏障的建议。
- 由于运行内存一致性检查时,生成的中间文件较大,如果用户想要使用该功能,请确保安装工具的所在磁盘空间足够大,根据经验数据,每10w行代码需要100G左右的磁盘空间。
- 源码规模过大可能会导致占用资源过多,建议代码量不超过10万行。
- 内存一致性功能仅支持在鲲鹏平台上运行。
前提条件
- “/opt/DevKit”为工具默认安装目录,下文以此默认路径为例,请根据实际情况替换。
- 当前特性在Web界面中需要手动上传文件或压缩包,在插件工具中支持扫描本地工程。
操作步骤
- 在页面左侧,“亲和分析”下拉选项中选择“内存一致性静态检查”,点击创建任务,如图1所示。
- 选择“检查模式”。
- 静态检查,请继续执行3。
- 编译器自动修复,需要用户根据页面提供的操作步骤进行操作,详细请参见编译器自动修复工具使用指导。
静态检查的结果误报少、修复率最高为60%,编译器自动修复结果不会漏报,误报率比静态检查高,修复率可保证100%。误报越多,性能影响相对越大。不同软件下编译的修复率不同,性能影响也不同。
- 选择“文件上传类型”。
- 填写“源码文件存放路径”。可以通过以下两种方式实现:
- 手动填写源码文件的绝对路径。
- 单击右侧“选择文件夹”,选择源码文件存储文件夹。
- 填写编译命令,然后单击“下一步”。
解析编译命令后生成BC文件。
- 选择生成的BC文件后单击“确认检查”,开始内存一致性检查。图2 选择BC文件
检查完成后,单击“查看报告”可进入“检查报告”界面,如图3所示。
- 可点击对需要修改的源码文件按照路径或修改点数量进行排序。
- 如果选择了“生成编译器工具配置文件”,可点击“下载编译器配置文件”,下载编译器工具配置文件。也可将鼠标悬停在“历史报告”区域中对应报告的上,然后选择“下载编译器配置文件”。
- 如果下载编译器工具配置文件时系统提示“该编译器文件不是最新的”,点击“前往查看”到最新报告中下载。如果系统再提示“最新报告中没有编译器配置文件”,请按照提示操作。
- 单击顶部的“源码修改建议”进入源码修改建议页面,如图4所示。
- 支持多个用户同时创建内存一致性检查任务。
- 用户可在任务进行过程中单击关闭,取消任务。
- 用户可以单击原始源代码模块右上角的上下键,进行上下切换。
- 用户如使用快捷键进行源码操作,需注意因输入法或IDE环境导致的快捷键被占用问题。
- 检查失败或检查结果为无需修改时,会产生空白报告。
- 填写“BC文件存放路径”。可以通过以下两种方式实现:
- 选择“已上传的BC文件”:单击填写框选择下拉框中的BC文件即可,也可以手动填写BC文件。
- 选择“上传BC文件”:单击“上传”按钮上传BC文件。
- 单击“确认检查”,开始内存一致性检查。
BC文件检查报告中会显示建议修改点数量和建议修改代码的具体位置,可根据这些信息进行排查和修改。
编译器自动修复工具使用指导
工具支持的操作系统和GCC版本如表1所示。
操作系统 |
GCC版本 |
---|---|
BC-Linux 7.6/7.7 |
GCC 4.8.5/4.9.3/5.1.0/5.2.0/5.3.0/5.4.0/5.5.0/6.1.0/6.2.0/6.3.0/6.4.0/6.5.0/7.1.0/7.2.0/7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
CentOS 7.4/7.5/7.6/7.7 |
GCC 4.8.5/4.9.3/5.1.0/5.2.0/5.3.0/5.4.0/5.5.0/6.1.0/6.2.0/6.3.0/6.4.0/6.5.0/7.1.0/7.2.0/7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
CentOS 8.0 |
GCC 8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
CentOS 8.1/8.2 |
GCC 8.3.0/9.1.0/9.2.0/9.3.0 |
Debian 10 |
GCC 8.3.0/9.1.0/9.2.0/9.3.0 |
Deepin 15.2 |
GCC 6.3.0/6.4.0/6.5.0/7.1.0/7.2.0/7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
iSoft 5.1 |
GCC 7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
Kylin V10 SP1/SP2 |
GCC 7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
LinxOS 6.0.90 |
GCC 6.3.0/6.4.0/6.5.0/7.1.0/7.2.0/7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
NeoKylin V7U6 |
GCC 4.8.5/4.9.3/5.1.0/5.2.0/5.3.0/5.4.0/5.5.0/6.1.0/6.2.0/6.3.0/6.4.0/6.5.0/7.1.0/7.2.0/7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
openEuler 20.03/LTS SP1/LTS SP2/LTS SP3 |
GCC 7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
SUSE SLES15.1 |
GCC 7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
Ubuntu 18.04.x |
GCC 7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
Ubuntu 20.04.x |
GCC 9.3.0 |
UOS 20 SP1 |
GCC 8.3.0/9.1.0/9.2.0/9.3.0 |
uosEuler 20 |
GCC 7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
UOS 20-1020e |
GCC 7.3.0/7.4.0/8.1.0/8.2.0/8.3.0/9.1.0/9.2.0/9.3.0 |
- 以上列表以操作系统默认支持的GCC版本为准,如果服务器操作系统升级过GCC版本,可能存在兼容性问题。
- 以上支持的GCC版本都是指GNU官方的GCC分支,不推荐用户基于鲲鹏GCC来使用此编译器自动修复工具。
使用该功能需要配置对应的环境,可以通过以下步骤进行:
- 下载相关软件包。
- 安装内存一致性修复组件。
- 解压安装包。
1
tar xf gcctool.tar.gz
解压后确认“gcctool/bin”目录下有以下文件:
gcctool,gcctool-bin,libstdc++.so.6
- 解压安装包。
- 合入GCC patch。
如果提示“‘patch’command not found”,则请先安装:
Debian系列:
1
apt install patch
RHEL系列:
1
yum install patch
1 2
cd /gcc/source/root/dir patch -p1 < /path/to/gcc/patch/file
- 编译GCC。
GCC源码编译操作请参考GCC官方文档,合入的patch对GCC编译依赖组件和编译过程没有影响,任何GCC编译问题可以询问GNU社区。
准备好环境之后再执行以下步骤使用工具:
- 设置内存一致性修复组件优化等级。
1
export HW_DEBUG=[ 0 | 1 | 2 ]
编译组件支持通过环境变量配置修复优化等级,默认级别为0。
- 0表示关闭内存一致性修复功能。
- 1表示应用组件优化规则,可以减少性能损失。
- 2表示使用最安全的修复策略,性能损失较大。
- (可选)定义自动修复源码范围。
- 工具允许用户自定义源码修复范围,以文件或函数为单位。配置允许列表后,修复组件只对列表内的内容进行修复。允许列表的格式如下:
- 文件列表以“files:”开头,每个文件独占一行。
- 文件使用绝对路径。
- 支持C/C++/Fortran格式的文件,不支持纯汇编文件。
- 函数列表以“functions:”开头,每个函数独占一行。
- 支持C/C++普通函数,不支持模板或具有abi_tag属性的函数。
以下为允许列表的格式示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
files: /path/to/file/a /path/to/./file/b /path/to/../file/c /path/to/file/d functions: func_a func_b() func_c(int xxx) int func_d() classA::func_e ns::classB::func_f() std::string nsA::nsB::classC::func_g(int xxx)
- 修复组件获取允许列表路径。
“export AUTOFIXLIST=/path/to/allowlist”
- 工具允许用户自定义源码修复范围,以文件或函数为单位。配置允许列表后,修复组件只对列表内的内容进行修复。允许列表的格式如下:
- 编译软件。
用户可以编译软件,编译过程没有变化。(之前的编译过程如果使用了-pipe编译选项,需要移除,不会影响原编译结果。)