---
title: DBI玄武
description: "DBI玄武是一款动态精度分析工具，可以针对应用的运行进行汇编指令层面的插桩，用于自动化定位HPC精度问题。其关键特性如下："
url: https://www.hikunpeng.com/document/detail/zh/perftuning/precisionopt/kunpengprecision_12_0030.html
sourcePath: /source/zh/perftuning/precisionopt/kunpengprecision_12_0030.html
indexId: 0c67683211c4e9bf6c423f47fbade6af7a96dbef88add4bce6b7f7dd99c8e1fc64
---
# DBI玄武

#### 工具介绍

DBI玄武是一款动态精度分析工具，可以针对应用的运行进行汇编指令层面的插桩，用于自动化定位HPC精度问题。其关键特性如下：

- 毕昇编译器支持生成函数参数列表，并由人工删改部分参数后，获得最终的函数参数列表。
- DBI工具自动读取函数参数列表，并在应用运行时对函数的入口和出口进行自动插桩，无需重新编译即可定位精度差异的来源。


#### 约束条件

源代码可以在x86平台和鲲鹏平台编译并成功运行。


#### 使用指导：

1. 利用编译器生成函数参数列表，或者人工编写函数参数列表
2. 人工调整函数参数列表

  - 删除需要被排除的函数参数（例如随机数，时间等参数）
  - 部分编译器无法建立映射关系的指针长度，需要人工指定
3. 分别在x86与ARM的机器上通过精度调优工具运行程序，获取输出
4. 对比两种平台的输出，发现某个函数存在异常点
5. 修改函数参数列表，仅保留异常函数，并将异常函数的所有函数参数wrap属性设置为false。
6. 这样会将该函数所有的参数的原始值打印出来，可以比较具体是哪个值出现问题


#### 配置文件关键字汇总：

| 关键字 | 含义 | 是否可选 | 默认值 |
| --- | --- | --- | --- |
| arg\_idx | 参数索引 | 必选 | 无 |
| arg\_name | 参数名 | 可选 | 默认为arg\#arg\_idx |
| ele\_size | 元素大小(bits) | 可选 | 默认为8bits，即只检查1byte |
| is\_ptr | 是否指针 | 可选 | 默认为true |
| ele\_nums | 元素个数 | 可选 | 默认为1，即只检查一个元素 |
| has\_ret | 是否有返回值 | 可选 | 默认为false，即不检查返回值 |
| ptr\_level | 指针级别 | 可选 | 默认为1，即只做一级访存 |
| md5\_level | 参数输出形式 | 可选 | 0：所有参数全部输出原始值 1：每个参数生成一个MD5值并输出 2：每个函数的所有参数共同生成一个MD5值并输出 默认为false，即不打印，只作为生成MD5的一个值 |
| is\_struct | 是否结构体 | 可选 | 默认为false，即不是结构体 |
| struct\_type | 结构体类型 | 可选 | 默认为"" |
| check\_at\_ret | 是否在函数返回时检查该参数（必须是指针） | 可选 | 默认为true，即在函数返回时检查该参数 |


- 对于一级指针，只检查数据是否一样，不检查数据的地址是否一样。同样地，对于高级指针，只检查最终的数据是否一样，不检查各级地址是否一样。
- Fortran语言中，所有的函数参数实际上都是以地址方式传入的，所以务必设置“is_ptr”= true。
- 如果需要忽略某个函数，可采用以下两种方式：

  - 直接不填写该参数的相关信息
  - 设置该参数的“ele_size”= 0
- 结构体形式的参数将在下一个版本中支持。
- 即使由于一些因素导致某函数的所有参数都无需检查，仍建议保留该函数名，以便于构建完整函数调用栈，从而定位精度差异点。
