---
title: 计算精度分析
description: "计算精度分析工具用于定位x86和鲲鹏指令引起的Fortran语言精度差异问题。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/devkit_24_t50/cliuserguide/KunpengDevKitCli_0086.html
sourcePath: /source/zh/kunpengdevkithistory/devkit_24_t50/cliuserguide/KunpengDevKitCli_0086.html
indexId: f41f27100f3d530ac67f8a2a841f39865a52d93327b234f126f5d2d9a6e2958e85
---
# 计算精度分析

计算精度分析工具用于定位x86和鲲鹏指令引起的Fortran语言精度差异问题。

支持：

- 平台：支持鲲鹏、x86（Intel和AMD）。
- 语言版本格式：支持Fortran77、90、95、03、08、18，支持fix-form、free-form。
- 插桩对象类型：REAL与COMPLEX类型的单个变量或者可获得形状长度的数组。
- 插桩位置：实际赋值、调用语句之后对变量插桩。
- 编译器版本：支持GFortran-10.3.1、BiShengCompiler-4.0.0 flang。

暂不支持：

- 某些编译器指令暂不支持，例如循环展开操作!dir$ unroll n、内联操作!DIR$ ATTRIBUTES FORCEINLINE :: XXX指令等。
- 多节点运行环境暂不支持。
- 无法获取长度的星号数组、指针、自定义结构体类型，以及它们的复杂嵌套表达式暂不支持插桩。
- 由于不同Fortran编译器、同一Fortran编译器不同版本的mod文件格式存在兼容性问题，建议使用支持的编译器版本。


#### 命令功能

定位x86和鲲鹏平台上Fortran语言的精度差异。


#### 命令格式

编译插桩：

```
devkit advisor precision [-h | --help] {-instrument | --instrument} {-c COMMAND COMMANDS | --commands COMMANDS} {-p PROJECT | --project PROJECT} {-e ENTRY | --entry ENTRY} [-d DEPTH | --depth DEPTH] [-b BLACK_LIST | --black-list BLACK_LIST] [-L | --loops] [-l {0,1,2,3} | --log-level {0,1,2,3}] [--set-timeout TIMEOUT]
```

日志差异分析：

```
devkit advisor precision [-h | --help] {-analysis | --analysis} {-i INPUT_LOG | --input INPUT_LOG} [-l {0,1,2,3} | --log-level {0,1,2,3}] [--set-timeout TIMEOUT]
```


使用计算精度分析工具，需先在不同平台（鲲鹏、x86）上执行编译插桩操作，执行完成后再进行日志差异分析操作。


#### 参数说明


**表1 编译插桩模式参数说明**

| 参数 | 参数选项 | 参数说明 |
| --- | --- | --- |
| \-h/\-\-help | \- | 获取帮助信息。 |
| \-instrument/\-\-instrument | \- | 必选参数，指定编译插桩模式。 |
| \-c/\-\-commands | COMMANDS | 必选参数，源码的构建命令，若存在多个构建命令需使用英文分号分隔并用英文双引号包住，命令中如有空格，也需要用英文双引号包住。 例如："make all"或"cd /home/test;make"。 说明： 不接受直接执行cmake命令，需预先执行。 命令行工具源码构建命令不支持设置变量和export环境变量。 例如："CFLAGS='\-O0 \-g';make"或"export CFLAGS='\-O0 \-g';make"。 |
| \-p/\-\-project | PROJECT | 必选参数，项目源码的绝对路径。 例如：/home/test/project1/或/home/project2/。 |
| \-e/\-\-entry | ENTRY | 必选参数，指定插桩入口文件和对应的函数，该选项允许多次输入。每个文件和对应的函数需要用英文冒号“:”分隔，多个函数需要用英文逗号“,”分隔。 入口文件需输入其在项目路径下的相对路径（\-p/\-\-project指定），文件实际参与编译，不能为预处理前的源文件。函数为指定Fortran文件中存在的Mainprogram、Function或Subroutine。 例如：\-e demo.f90:main \-e demo2.f90:func。 |
| \-d/\-\-depth | DEPTH | 从入口函数向下连续插桩的深度，默认为0，取值范围为0至99。 |
| \-b/\-\-black\-list | BLACK\_LIST | 指定不参与插桩的文件，不能包含\-e参数所指定的文件。 例如："/home/test/demo1.f90;/home/test/demo2.f90" |
| \-L/\-\-loops | \- | 指定进行循环内插桩。在此选项下，插桩后运行可执行文件生成的精度日志文件大小会增加，请合理安排插桩入口（入口文件、入口函数）和深度。 |
| \-l/\-\-log\-level | 0/1/2/3 | 设置日志级别，默认为1。 0：日志级别为DEBUG。 1：日志级别为INFO。 2：日志级别为WARNING。 3：日志级别为ERROR。 |
| \-\-set\-timeout | \- | 任务超时时间，单位为分钟，若执行时间超过超时时间则退出执行。默认无超时时间，任务将持续执行直到结束。 |


**表2 日志差异分析模式参数说明**

| 参数 | 参数选项 | 参数说明 |
| --- | --- | --- |
| \-h/\-\-help | \- | 获取帮助信息。 |
| \-analysis/\-\-analysis | \- | 必选参数，指定日志差异分析模式。 |
| \-i/\-\-input | INPUT\_LOG | 必选参数，指定日志文件，输入顺序为鲲鹏日志、x86日志（数量为2）。 例如：输入文件"/home/kp.log;/home/x86.log"或路径"/home/kp/;/home/x86/"。 |
| \-l/\-\-log\-level | 0/1/2/3 | 设置日志级别，默认为1。 0：日志级别为DEBUG。 1：日志级别为INFO。 2：日志级别为WARNING。 3：日志级别为ERROR。 |
| \-\-set\-timeout | \- | 任务超时时间，单位为分钟，若执行时间超过超时时间则退出执行。默认无超时时间，任务将持续执行直到结束。 |


#### 使用示例

此处以扫描“/home/test/demo1”路径下源码文件为例，编译命令为cmake ..、make，请根据实际情况进行修改。

demo1文件目录结构：

```
demo1
├── build
├── CMakeLists.txt
├── funcparam_utils.f90
├── shape_utils.f90
└── test.f90
```

1. 分别在鲲鹏环境和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

  回显信息如下：

  1 2 3 4 5 6 7 Perform the instrumentation and compilation mode. Finish run precision check tool. For detail logs on the tool, see /Absolute-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=/Absolute-Path-to-DevKit-CLI/advisor/devkitplugins/affinity/tools/compileopt/libcruiser/gfortran_lib(or flang_lib):$LD_LIBRARY_PATH 2) the log file path: export CRUISER_LOG=/absPATH/

  在执行编译插桩模式前，必须保证项目是未编译过的，否则在增量编译的情况下，编译命令获取不完整，会导致程序执行失败。 “/Path_to_Devkit_CLI/”：DevKit命令行工具路径。 -p指定项目源码路径（“/home/test1/demo1/”），-e参数指定项目源码路径下的插桩入口文件和对应的函数（test.f90:main）。 执行编译插桩后，会在插桩入口文件所在路径下生成同名的.bak文件（test.f90.bak），会在“build”目录下生成可执行文件。 编译插桩模式下txt文件中若有Error相关信息，请参见计算精度分析编译插桩模式下txt文件中显示Error的解决方法进行处理。

2. 在鲲鹏和x86环境下重新运行编译后的可执行文件。

  a. 根据编译器类型添加对应的libcruiser库路径。
    gfortran：

```
export LD_LIBRARY_PATH=/
Path_to_Devkit_CLI
/advisor/devkitplugins/affinity/tools/compileopt/libcruiser/gfortran_lib:$LD_LIBRARY_PATH
```


    flang：

```
export LD_LIBRARY_PATH=/
Path_to_Devkit_CLI
/advisor/devkitplugins/affinity/tools/compileopt/libcruiser/flang_lib:$LD_LIBRARY_PATH
```


  b. 添加生成日志文件路径。

```
export CRUISER_LOG=/
LOGPATH
/
```


    “/LOGPATH/”：生成的日志文件存放路径。

  c. 运行可执行文件。

```
./
myprogram
```


    运行可执行文件后若有以下输出信息，表示日志文件所在路径磁盘空间已不满足1G，请清理磁盘空间。

    1 [ERROR] Insufficient disk space in /home/test1/, please clean up the disk.

    myprogram：生成的可执行文件。 生成日志时请注意磁盘空间大小。

  d. 查看生成的cruiser.log日志文件，日志内容如下：
    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

    日志文件中的内容解释： 第一部分：文件名。 第二部分：第三部分内容表达式语句所在的当前最小作用域名称，可能是函数、子例程或主程序。 第三部分：当插桩变量位于函数调用语句（作为函数参数）时，此处为被调用函数名；当插桩变量位于赋值语句时，此处为“=”号。 第四部分：行号。 第五部分：插桩变量名。 第六部分：线程ID。 第七部分：HASH值。

3. 在鲲鹏或x86平台上进行日志差异分析操作。
  将鲲鹏平台上生成的cruiser.log日志文件改名为cruiser_kp.log，x86平台上生成的cruiser.log日志文件改名为cruiser_x86.log，将其放到其中一个平台上。 1 devkit advisor precision -analysis -i "/home/test1/cruiser_kp.log;/home/test1/cruiser_x86.log"

  回显信息如下：

  1 2 3 4 Perform the logs analysis mode. Finish run precision check tool. For detail logs on the tool, see /Absolute-Path-to-DevKit-CLI/advisor/logs/preccheck.log The analysis result is in /home/test1/demo1/build/precision_20241106113405_5b7a.txt

4. 请查看3生成的txt文件，定位源码，查找精度问题。
