Fortran语言场景
计算精度分析工具用于定位x86和鲲鹏指令引起的Fortran语言精度差异问题。
使用要求
- 支持:
- 平台:支持鲲鹏、x86(Intel和AMD)。
- 语言版本格式:支持Fortran77、90、95、03、08、18,支持fixed-form、free-form。
- 源码文件后缀:支持f77、f、F、ff、for、FOR、fpp、FPP、f90、F90、ff90、f95、F95、ff95、f03、F03、f08、F08、f18、F18。
- 插桩对象类型:REAL与COMPLEX类型的单个变量或者可获得形状长度的数组。
- 插桩位置:实际赋值、调用语句之后对变量插桩。
- 编译器版本:默认支持GFortran 10.3.1、BiShengCompiler 4.0.0 flang,若使用Intel的ifort、ifx编译器,需要重新编译libcruiser。
- 暂不支持:
- 某些编译器指令暂不支持,例如循环展开操作!dir$ unroll n、内联操作!DIR$ ATTRIBUTES FORCEINLINE :: XXX指令等。
- 无法获取长度的星号数组、指针、自定义结构体类型,以及它们的复杂嵌套表达式暂不支持插桩。
- 由于不同Fortran编译器、同一Fortran编译器不同版本的mod文件格式存在兼容性问题,建议使用支持的编译器版本。
使用示例
此处以扫描“/home/test/demo1”路径下源码文件为例,编译命令为cmake ..、make,请根据实际情况进行修改,也可参考Fortran语言场景的学习视频。
demo1文件目录结构:
1 2 3 4 5 6 |
demo1 ├── build ├── CMakeLists.txt ├── funcparam_utils.f90 ├── shape_utils.f90 └── test.f90 |
- 分别在鲲鹏环境和x86环境的项目目录下运行编译插桩操作。
1 2 3
cd /home/test/demo1/build cmake .. devkit advisor precision -instrument -c make -p /home/test/demo1 -e test.f90:main -d 1
回显信息如下:
Perform the instrumentation and compilation mode. Finish run precision check tool. For detail logs on the tool, see /Path_to_DevKit_CLI/advisor/logs/preccheck.log and /home/test1/demo1/build/precision_20241106111820_6193.txt Please check whether error information exists in above two files to ensure that the project can run properly. Before running the project to get the log file, please add: 1) the libcorrect.mod file path: export LD_LIBRARY_PATH=/Path_to_DevKit_CLI/advisor/devkitplugins/affinity/tools/compileopt/libcruiser/gnu_lib:$LD_LIBRARY_PATH 2) the log file path: export CRUISER_LOG=/LOGPATH/
- 若使用的是ifort或者ifx编译器,请前往libcruiser仓库查看README文件,重新编译libcruiser。
- 在执行编译插桩模式前,必须保证项目是未编译过的,否则在增量编译的情况下,编译命令获取不完整,会导致程序执行失败。
- “/Path_to_DevKit_CLI/”:DevKit命令行工具路径。
- -p指定项目源码路径(“/home/test1/demo1/”),-e参数指定项目源码路径下的插桩入口文件和对应的函数(test.f90:main)。
- 执行编译插桩后,会在插桩入口文件所在路径下生成同名的.bak文件(test.f90.bak),会在“build”目录下生成编译数据库文件(dev_compile_commands.json)、可执行文件以及其他的文件。
- 编译插桩模式下txt文件(precision_时间戳.txt)中若有Error相关信息,请参见项目使用Gfortran编译时出现Rank mismatch错误的解决方法进行处理。
- 在鲲鹏和x86环境下重新运行编译后的可执行文件。
- 根据编译器类型添加对应的libcruiser库路径。
Gfortran:
export LD_LIBRARY_PATH=/Path_to_DevKit_CLI/advisor/devkitplugins/affinity/tools/compileopt/libcruiser/gnu_lib:$LD_LIBRARY_PATH
Flang:
export LD_LIBRARY_PATH=/Path_to_DevKit_CLI/advisor/devkitplugins/affinity/tools/compileopt/libcruiser/bisheng_lib:$LD_LIBRARY_PATH
ifort或者ifx:
export LD_LIBRARY_PATH=/Path_to_DevKit_CLI/advisor/devkitplugins/affinity/tools/compileopt/libcruiser/user_lib:$LD_LIBRARY_PATH
- 添加生成日志文件路径。
1
export CRUISER_LOG=/LOGPATH/
“/LOGPATH/”:生成的日志文件存放路径,存放路径下必须为空。
- 运行可执行文件。
1
./myprogram
运行可执行文件后若有以下输出信息,表示日志文件所在路径磁盘空间已不满足5G,请清理磁盘空间。
1
[WARNING] The remaining space is less than 5 GB in /home/test1, please clear enough space and run the program again.
myprogram:生成的可执行文件。
生成日志时请注意磁盘空间大小。
- 查看生成的日志文件,日志内容如下:
1 2 3 4 5 6
shape_utils.f90|absize|=|28|ins|998058|429d81ed2795e3c586906c6c335aa136 shape_utils.f90|absize|=|28|ins|998058|429d81ed2795e3c586906c6c335aa136 test.f90|main|absize|26|array1d|998058|22160b46bba283274412c4033f1f33fe shape_utils.f90|absize|=|28|ins|998058|429d81ed2795e3c586906c6c335aa136 test.f90|main|xysize|35|x2|998058|5d5ebe7707f02dec747fd0d111d0f83c test.f90|main|submain|41|array1d|998058|22160b46bba283274412c4033f1f33fe
日志文件中的每条日志分为七部分内容,以图中两条日志信息为例,对每部分内容进行解释。
1:文件名。
2:第三部分内容表达式语句所在的当前最小作用域名称,可能是函数、子例程或主程序。
3:当插桩变量位于函数调用语句(作为函数参数)时,此处为被调用函数名;当插桩变量位于赋值语句时,此处为“=”号。
4:行号。
5:插桩变量名。
6:线程ID。
7:插桩变量值对应的HASH值。
- 根据编译器类型添加对应的libcruiser库路径。
- 在鲲鹏或x86平台上进行日志差异分析操作。将鲲鹏平台上生成的日志文件目录改名为kunpeng,x86平台上生成的日志文件目录改名为x86,将其放到其中一个平台上。
1
devkit advisor precision -analysis -i "/home/kunpeng;/home/x86"
回显信息如下:
1 2 3 4
Perform the logs analysis mode. Finish run precision check tool. For detail logs on the tool, see /Path_to_DevKit_CLI/advisor/logs/preccheck.log and /home/test1/demo1/build/precision_20250213110835_5b7a.txt The analysis result is in /home/test1/demo1/build/analysis_diff_20250213110840_935b.txt
- 请查看3生成的txt文件,定位源码,查找精度问题。
父主题: 计算精度分析