---
title: Fortran语言场景
description: "计算精度分析 工具用于定位x86和鲲鹏指令引起的Fortran语言精度差异问题。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/development/affinityanalyzer/KunpengDevKitCli_0086.html
sourcePath: /source/zh/kunpengdevps/development/affinityanalyzer/KunpengDevKitCli_0086.html
indexId: a6ca8a4531eacfd0bfc2959ec1d1d1803302dc0f11d43c5a1344c03046a1e6c979
---
# 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，若使用毕昇的Flang、Intel的ifort或ifx编译器，需要重新编译libcruiser。
- 暂不支持：

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


#### 使用示例

此处以扫描“/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

  回显信息如下：

```
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/test/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/
3) run the executable file: LD_PRELOAD=libcruiser.so.2:/usr/lib64/libcrypto.so.1.1 ./XXX
```


  若使用毕昇的Flang、Intel的ifort或ifx编译器，请前往libcruiser仓库(https://gitee.com/panjingxu/libcruiser/blob/master/README.md)查看README文件，重新编译libcruiser。 在执行编译插桩模式前，必须保证项目是未编译过的，否则在增量编译的情况下，编译命令获取不完整，会导致程序执行失败。 “/Path_to_DevKit_CLI/”：DevKit命令行工具路径。 “-p”指定项目源码路径（“/home/test/demo1/”），“-e”参数指定项目源码路径下的插桩入口文件和对应的函数（test.f90:main）。 执行编译插桩后，会在插桩入口文件所在路径下生成同名的.bak文件（test.f90.bak），会在“build”目录下生成编译数据库文件（dev_compile_commands.json）、可执行文件以及其他的文件。 编译插桩模式下txt文件（precision_时间戳.txt）中若有Error相关信息，请参见项目使用gfortran编译时出现Rank mismatch错误的解决方法进行处理。

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

  a. 根据编译器类型添加对应的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
```


  b. 添加生成日志文件路径。
    1 export CRUISER_LOG=/LOGPATH/

    “/LOGPATH/”：生成的日志文件存放路径，存放路径下必须为空。

  c. 运行可执行文件。
    1 ./myprogram

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

    1 [WARNING] The remaining space is less than 5 GB in /home/test, please clear enough space and run the program again.

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

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

3. 在鲲鹏或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/test/demo1/build/precision_20250213110835_5b7a.txt The analysis result is in /home/test/demo1/build/analysis_diff_20250213110840_935b.txt

4. 请查看3生成的txt文件，定位源码，查找潜在精度差异问题。若存在差异，文件内的定位格式如下：

```
file [文件相对路径]:  //存在潜在精度差异的文件
function [函数名]:  //存在潜在精度差异的函数
variable [变量名]:  //存在潜在精度差异的变量
arm line [行号]   //差异变量所在位置为赋值语句
arm line [行号] Called function: [被调用函数]  //差异变量所在位置为函数调用
x86 line [行号]
x86 line [行号] Called function: [被调用函数]
```
