1. 工具简介

EFSMI (Enflame System Management Interface)是用于管理 GCU 设备的Linux命令行工具。 可以实时查询各种 GCU 设备信息:包含温度、功耗、时钟频率等。 有关EFSMI命令的详细用法,请参考 EFSMI 命令。 EFSMI是基于 EFML (Enflame Management Library)开发的,EFML是提供给用户的一套访问底层GCU硬件的代码库。 请参阅章节 EFML - Enflame 管理库

2. 参考文献

2.1. 词汇表

表 2.1.1 词汇表

名称

说明

EFSMI

EnFlame System Management Interface Tool which is based on EFML library for monitoring GCU device in system

EFML

EnFlame Management Library, a C/C++/Script library providing system management APIs

GCU

General Compute Unit, refer to PCIe based computing Devices delivered by Enflame

UUID

Universally Unique Identifier

DPM

Dynamic Power Managerment

TDP

Thermal Design Power

ECC

Error Correcting Code

MCM

Multi Chip Modules

RMA

Return Merchandise Authorization

3. 分发包

3.1. 支持的OS类型

EFSMI仅支持 Linux 操作系统。所测试的系统如下所示。

表 3.1.2 支持操作系统类型

系统

内核

架构

Ubuntu 18.04.4 Server LTS

4.15.0

x86_64/amd64

Ubuntu 20.04.2 Desktop LTS

5.15.0

x86_64/amd64

TLinux

4.14.105

x86_64/amd64

kylinos

4.19.90

x86_64/amd64

kylinos

4.19.90

aarch64

3.2. 安装包内容

包含 efsmi 在内的所有内容在TopsPlatform安装包中提供。其中有 efsmiefml RPM/DEB包, 以及python语言的开发库 pyefml。 具体内容如下表所示:

表 3.2.2 驱动安装包包含的文件列表

内容

说明

efsmi-x.x.x.x86_64.rpm

EFSMI RPM 软件包

efsmi_x.x.x_amd64.deb

EFSMI DEB 软件包

efml_x.x.x.x86_64.rpm

EFML RPM 软件包

efml_x.x.x_amd64.deb

EFML DEB 软件包

pyefml-x.x.x-py3-none-any.whl

EFML Python开发库软件包

Attention

各组件安装包现已不再单独提供,如有特殊需求请联系客户支持工程师。

4. 安装步骤

请参考TopsPlatform 安装指南进行安装。

5. 使用须知

5.1. 在宿主机中运行

Attention

  1. efsmi 的部分功能仅支持特权模式下执行

  2. efsmi 在非特权模式下运行,需要依赖 enflame 提供的设备驱动程序

5.2. 在容器中运行

efsmi 支持在容器中运行, 可以通过以下方式:

赋予容器特权模式

Attention

  1. 在宿主机上以特权用户身份启动容器

  2. 启动容器时, 使能 --privileged=true 参数以赋予容器内用户特权

不赋予特权模式

Attention

  1. 宿主机需要加载 enflame 提供的内核模块设备驱动程序

  2. 启动容器时, 使能 --device 选项映射 enflame 设备到容器内

5.3. 在虚拟机中运行

Attention

  1. efsmi 不支持在使用mdev虚拟设备的虚拟机中运行

6. EFSMI 命令

EFSMI是用于监控 GCU 状态的可执行程序,它基于 EFML 库。 EFSMI当前支持的命令如下表所示。

Attention

EFSMI 不支持在宿主机和docker 里面同时运行。

当前支持的命令列表:

表 6.1 命令列表

参数

说明

-h, --help

显示此帮助说明

“”

不带参数执行 ‘sudo efsmi’ , efsmi 将显示包含 版本号/驱动/功耗/频率/温度

e.g. 'sudo efsmi -i 0'
显示 GCU 卡 0 的信息

-L, --list

显示所有支持的 GCUs

--version

显示 efsmi 版本号

-i, --index

选择指定的 GCU 卡

e.g. 'sudo efsmi -i 0'
显示 GCU 卡 0 的信息

--dmon

监控 GCU 设备的各种数据,刷新率为 1s。
Ctrl + C 退出监控。
子命令:
a. -s XXX

选择显示部分数据,XXX 可以是 “p”, “c”, “m”, “t” 及其组合, “all” 为所有信息。

p: 显示功耗/温度/使用率的监控信息

c: 显示频率的监控信息

m: 显示内存信息, 此功能依赖 enflame 提供的设备驱动程序, 在缺少驱动程序时, 内存信息为 0

t: 显示 PCIe/GCU-LARE 吞吐量的监控信息, GCU-LARE 在部分产品上不支持

all: 在同一行显示所有信息

e.g. 'sudo efsmi --dmon -s c -i 0'
显示 GCU0 的频率信息

b. -c X

设置循环次数

e.g. 'sudo efsmi --dmon -c 10'
打印10次设备监控信息

--dmon



c. -o

显示时间戳信息

d. -w X

以秒为单位设置刷新时间间隔

--pmon

监控使用 GCU 设备的进程的各种数据,刷新率为 1s。
Ctrl + C 退出监控。
子命令:
a. -c X

设置循环次数

e.g. 'sudo efsmi --pmon -c 10'
打印10次设备监控信息

b. -o

显示时间戳信息

c. -w X

以秒为单位设置刷新时间间隔

-q, --query

获取 GCU 状态信息
列出 GCUs 状态的详细信息,以 TAB 对齐


支持的子命令:

a. -d XXX

选择要显示的内容
XXX 可以设定为以下之一:
“POWER”, “CLOCK”, “DRIVER”, “DEVICE”, “PCIE” “MEMORY” “TEMP” “VOLT”
“USAGE”, “CABLE”, “ECC”, “RMA”, “VPU”
e.g. 'sudo efsmi -q -d CLOCK -i 0'


选择显示GCU0 的频率信息

注意:
内存信息依赖 enflame 提供的设备驱动程序

b. -c X

设置循环次数

--ptopo

显示 设备的PCIE 拓扑信息

-r, --reset

该指令会复位目标 GCU 设备,在一些场景下可以用来重置 GCU 硬件状态。否则需要重启机器。
重置操作并不保证在所有情况下都能正常工作,应谨慎使用。
此命令需要依赖 enflame 提供的设备驱动程序

支持的子命令:

a. -y

自动确认提示。默认以“yes”作为所有提示的答案,并以非交互方式运行。

注意:
复位运行期间,请不要强杀 efsmi 进程,否则可能会导致设备复位失败。

-e, --ecc

设置设备的ECC 状态
ECC 状态变更后需 GCU 复位方可生效(使用’-r hot’命令)

用法:
--ecc # 查询 ECC 状态
--ecc on|off # 打开/关闭 ECC 模式

该命令不支持在虚拟化环境的VF下使用。请确保在切换ECC 状态前,所有的任务都已经退出。

--sleep

设置设备的功耗状态进入或者退出睡眠模式.
默认情况下,设备会在空闲一段时间后自动进入睡眠模式,并在有新的任务下发后自动退出睡眠模式。
该命令可手动使设备进入或者退出睡眠模式。

用法:
--sleep # 查询设备是否在睡眠模式
--sleep on|off # 设置设备进入/退出睡眠模式
# 切换结束后,设备大约会有10秒的延迟才能进入睡眠模式

在虚拟化环境下,该命令不支持在PF上切换设备功耗状态。当所有VF进入睡眠模式后,PF会自动进入睡眠模式。
而当有任意VF退出睡眠模式时,PF会自动退出睡眠模式。

--mcm

(仅支持GCU300设备)设置设备的MCM 状态
该命令会自动触发设备复位,以使新的MCM 状态生效。

用法:
--mcm # 查询 MCM 状态
--mcm single|dual # 设置设备MCM 状态为单芯片/双芯片模式

注意:
在虚拟化环境下不支持切换MCM 状态。请确保在切换MCM 状态前,所有的任务都已经退出。状态切换期间,请不要强杀 efsmi 进程。
否则可能会导致状态切换失败。

Attention

GCU-LARE 1 在部分产品上不支持。 ECC 在部分产品上不支持。

6.1. 信息概览

不带参数执行 'sudo efsmi', 将显示如下的看板信息:

$ sudo efsmi
------------------------------------------------------------------------------
-------------------- Enflame System Management Interface ---------------------
--------- Enflame Tech, All Rights Reserved. 2024-2025 Copyright (C) ---------
------------------------------------------------------------------------------

+2025-03-17, 11:02:10 CST----------------------------------------------------+
| EFSMI    1.4.0           Driver Ver: 1.4.0                                 |
|----------------------------------------------------------------------------|
|----------------------------------------------------------------------------|
| DEV    NAME                 | FW VER           | BUS-ID      ECC           |
| TEMP   Dpm   Pwr(Usage/Cap) | Mem     GCU Virt | DUsed       SN            |
|----------------------------------------------------------------------------|
| 0      Enflame S60          | 33.6.5           | 00:23:00.0  Disable       |
| 38℃    Sleep    94W / 300W  | 49120MiB Disable | 0%          A807J405I.... |
+----------------------------------------------------------------------------+
表 6.1.1 看板信息详细说明

字段

字段内容

EFSMI Ver:

EFSMI 版本号

Driver Ver:

Driver 版本号

DEV:

GCU 设备的ID号,根据设备BDF升序排序

NAME:

GCU 设备型号

FW Ver:

固件版本

Bus-ID:

PCIe 设备 Domain/Bus/Device/Function ID

ECC:

Memory ECC 开/关 状态

TEMP:

GCU 设备当前温度

Dpm:

动态功耗管理, 详情参考下面表格

Pwr (Usage/Cap):

当前功耗/额定功耗

DUsed:

设备瞬时使用率

SN:

设备序列号

GCU Virt:

GCU虚拟化状态

表 6.1.2 DPM等级详情

DPM等级

详情

Active

正常模式,GCU满功耗运行。 一旦有任务运行,GCU将切换至Active

Sleep:

低功耗模式。在闲置若干秒后,GCU将从Active切换为Sleep

Attention

默认条件下将展示所有设备的信息。 参数 “-i X” 可以用来获取指定的设备信息。

6.2. 信息查询

下图显示了执行命令 'sudo efsmi -q' 时得到的查询信息。 部分内容定义与EFSMI 看板中定义的相同。另有更多信息展示: 例如PCIe Tx/Rx 实时吞吐量信息、GCU/Mem信息。 默认情况下, “-q” 命令将查询并显示所有检测到的 GCU 设备, 参数 “-i X” 可用于选择特定的 GCU 。 支持的子命令请参见本章 EFSMI 命令

$ sudo efsmi -q
------------------------------------------------------------------------------
-------------------- Enflame System Management Interface ---------------------
--------- Enflame Tech, All Rights Reserved. 2024-2025 Copyright (C) ---------
------------------------------------------------------------------------------

DEV ID 0
   Driver Info
      Ver                     : 1.4.0
   Device Info
      Dev Name                : S60
      Dev UUID                : T6R231010508
      Dev SN                  : A029C30510020
      Dev PN                  : EFB-0088800-00
      Dev MFD                 : 2023-9-12
      Health                  : True
   PCIe Info
      Vendor ID               : 1e36
      Device ID               : c033
      Domain                  : 0000
      Bus                     : 07
      Dev                     : 00
      Func                    : 0
      Link Info
      Max Link Speed          : Gen5
      Max Link Width          : X16
      Cur Link Speed          : Gen4
      Cur Link Width          : X16
      Tx Throughput           : 0 MiB/s
      Rx Throughput           : 0 MiB/s
   Clock Info
      Mem CLK                 : 7000 MHz
   Power Info
      Power Capa              : 300 W
      Cur Power               : 90 W
      Dpm Level               : Active
   Device Mem Info
      Mem Size                : 49120 MiB
      Mem Usage               : 1129 MiB
      Mem Ecc                 : disable
   Temperature Info
      GCU Temp                : 39 C
   Voltage Info
      VDD GCU                 : 0.896 V
      VDD SOC                 : 0.846 V
      VDD MEMQC               : 1.347 V
   ECC Mode
      Current                 : Disable
      Pending                 : Disable
   RMA Info
      Flags                   : False
      Total DBE               : 0
            MC0 DBE             : 0
            MC1 DBE             : 0
            MC2 DBE             : 0
            MC3 DBE             : 0
            MC4 DBE             : 0
            MC5 DBE             : 0
            MC6 DBE             : 0
            MC7 DBE             : 0
            MC8 DBE             : 0
            MC9 DBE             : 0
            MC10 DBE            : 0
            MC11 DBE            : 0
   Power Cable
      Status                  : Normal
   VPU Info
      Encoder Usage           : 0 %
      Decoder Usage           : 0 %
   Error Records
      Total Error Count       : 0
      Reset Count             : 0
      Last Reset Date         : N/A
   Error Details
      User Triggered Reset    : 0
      Internal Error          : 0
      SIP Error               : 0
      Bus Error               : 0
      FW Error                : 0
      DTE Error               : 0
      DRAM HBM Error          : 0
      PCIE Error              : 0
      Unknown Error           : 0

Attention

efsmi 中的 RMA Info 仅为参考值,不作为最终判断依据,其只受GCU设备内存错误数量影响。当 RMA flag为 False 时,并不表示整个设备处在健康状态。

对于 S60,当下列条件中的任意一条满足时,RMA flag 会被置为 True:

  1. 当前设备单个内存控制器上的不可自动纠正错误数量超过8个

  2. 当前设备总的不可自动纠正错误数量超过64个

  3. 发生了一次页表替换故障

当开启SRIOV虚拟化时,只有PF上会显示RMA信息,VF上不会显示。

6.3. 设备监控

下面的图片显示了执行 'sudo efsmi --dmon' 时得到的设备监视器信息,它将显示功耗,GCU/Mem温度,频率等的实时抓取的板卡信息 详细的子命令请参见本章中的表格 EFSMI 命令

收集的数据将显示在一行,每秒刷新一次。循环数和刷新周期可以通过子命令 “-c X” 和 “-w X” 调整。 ` Ctrl + C ` 可退出显示 。

$ sudo efsmi -dmon
------------------------------------------------------------------------------
-------------------- Enflame System Management Interface ---------------------
--------- Enflame Tech, All Rights Reserved. 2024-2025 Copyright (C) ---------
------------------------------------------------------------------------------

*Dev Pwr   DTemp  Sip   DUsed Dpm      MUsed Mem    Mclk   TxPci   RxPci
*Idx W     C      %     %     L        %     Mib    MHz    MiB/s   MiB/s
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    38     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    38     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    38     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    38     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    38     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    38     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    38     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    38     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    38     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
0    90    39     0.0   0.0   Active   2.4   42976  7000   0       0
表 6.3.1 监控功能数据详细介绍

字段

字段内容

Dev Idx:

GCU卡序号

Pwr:

板卡功耗(瓦)

DTemp:

板卡温度

Sip:

一个采样周期内,SIP的平均利用率

DUsed:

一个采样周期内,设备工作时间占比

Dpm:

动态功耗管理,对应于GCU频率等级

MUsed:

GCU 内存使用率

Mem:

GCU 内存的大小

Ecc:

ECC 状态

Mclk MHz:

内存频率

TxPci/RxPci:

PCIe 传输/接受 吞吐量

TxE/RxE:

GCU-LARE 传输/接受 带宽, 部分产品不支持

Attention

GCU 卡序号:按PCI 总线上Enflame GCU 设备bdf信息排列。

6.4. PCIE 拓扑

在PCIe的树形结构里, 每个GCU设备都是一个EP、endpoint,它会跟PCIe Switch 的下游端口相连。 PCIe Switch的上游端口会继续跟别的Switch或者CPU的RC(Root Complex)/Host Bridge的下游端口相连。 这样构建出一个树形的topo结构。

‘sudo efsmi --ptopo’ 命令可以展示这种结构的详细信息

$ sudo efsmi --ptopo
------------------------------------------------------------------------------
-------------------- Enflame System Management Interface ---------------------
--------- Enflame Tech, All Rights Reserved. 2024-2025 Copyright (C) ---------
------------------------------------------------------------------------------

gcu 0-0000:20:00.0 --> ... --> bridge-pci0000:16 --> cpu
gcu 1-0000:35:00.0 --> ... --> bridge-pci0000:30 --> cpu
gcu 2-0000:36:00.0 --> ... --> bridge-pci0000:30 --> cpu
gcu 3-0000:39:00.0 --> ... --> bridge-pci0000:30 --> cpu
gcu 4-0000:3d:00.0 --> ... --> bridge-pci0000:30 --> cpu
gcu 5-0000:9c:00.0 --> ... --> bridge-pci0000:97 --> cpu
gcu 6-0000:9d:00.0 --> ... --> bridge-pci0000:97 --> cpu
gcu 7-0000:a0:00.0 --> ... --> bridge-pci0000:97 --> cpu
gcu 8-0000:a4:00.0 --> ... --> bridge-pci0000:97 --> cpu
gcu 9-0000:bd:00.0 --> ... --> bridge-pci0000:b0 --> cpu

6.5. ECC 状态

各个 GCU 的ECC状态可能不同,以’-q’ 命令获取当前模式, 可以通过 'sudo efsmi --ecc on|off -i 0' 设置设备0的ECC状态,’off’是禁用,’on’是启用; 设置后需按照提示复位设备方可生效。 该命令不支持在虚拟化环境中的VF上使用。

7. EFML - Enflame 管理库

EFML是一套基于C/C++语言开发的程序库,使用这套程序库,应用软件可以很方便的实现对Enflame 硬件设备的访问。 EFML公开提供的API可以被C/C++/Python/Go… 等语言开发的程序使用。

EFSMI 就是利用 EFML 实现硬件监控和管理的应用之一 。 EFML 是与 EFSMI 包一起发布的,包括它的头文件、库文件、脚本,还有一些示例代码 。

7.1. EFML包含的文件

下表是 EFML 库包含的文件列表

表 7.1.1 EFML 包包含的文件列表

名称:

说明

efml.h

提供API 支持的C头文件

libefml_static.a

静态链接库

libefml.so

动态链接库

pyefml.py

python binding APIs

pyefml/samples

python 示例

7.2. C/C++ 示例

下面的例子展示了如何使用EFML库开发C/C++程序获取系统中GCU设备个数。

#include <iostream>
#include <string>
#include <string.h>
#include <stdint.h>
#include "efml.h"

int main(void)
{
   int ret = 0;

   // init library
   ret += static_cast<int>EfmlInit(false);

   // device info structure
   efmlDeviceInfo_t dev_info;

   // call 'EfmlGetDevCount' to get total device counts in system
   uint32_t dev_cnt = 0;
   ret += static_cast<int>EfmlGetDevCount(&dev_cnt);
   std::cout << "device count = " << dev_cnt << std::endl;

   // loop through each device get and print device VID/DID and Bus/Dev/Func info
   for (uint32_t i = 0; i < dev_cnt; i++)
   {
      memset(&dev_info, 0, sizeof(efmlDeviceInfo_t));
      ret += static_cast<int>EfmlGetDevInfo(i, &dev_info);
      std::cout << "dev id = " << i << std::endl;
      std::cout << "name = " << dev_info.name << std::endl;
      std::cout << "vendor id = " << std::hex << dev_info.vendor_id << std::endl;
      std::cout << "device id = " << std::hex << dev_info.vendor_id << std::endl;
      std::cout << "domain = " << std::hex << dev_info.domain_id << std::endl;
      std::cout << "bus = " << std::hex << dev_info.bus_id << std::endl;
      std::cout << "dev = " << std::hex << dev_info.dev_id << std::endl;
      std::cout << "func = " << std::hex << dev_info.func_id << std::endl;
   }

   // check if error returned in above steps
   if (ret != static_cast<int>(EFML_SUCCESS))
      std::cout <<  "execute failed! check log"  << std::endl;

   // shutdown library
   EfmlShutdown();

   return ret;
}

上述代码是C++ 代码, 编译上述代码, 请注意以下事项:

Attention

a.包含头文件efml .h b.首先调用API ‘EfmlInit()’来初始化库 c.在所有进程结束时,调用API ‘EfmlShutdown()’来释放库使用的资源 d.编译时使用’-L DIR_TO_EFML_LIB’来指定库文件存在的目录 e.编译时使用’-lefml’链接库文件 当使用静态链接库进行链接时,需要使用’-lpthread’

7.3. Script Bindings

Python

在人工智能行业中,Python 是开发应用程序的主要语言之一 。 EFML 还提供了python语言开发库。通过驱动安装包安装。目前最低支持python3.6。

安装完成后,pyefml.py已经作为python模块安装到系统操作系统中,您可以导入该模块。

如果您想快速体验python中的pyefml,请尝试以下命令。

python
>>> import pyefml
>>> pyefml.efmlInit()
0
>>> pyefml.efmlGetDevCount()
1L
>>> pyefml.efmlShutdown()

第一条返回值 ‘0’ 表示 EFML 初始化正常。

第二条返回值 ‘1L’ 表示系统中检测到一张 GCU 卡。

下面的例子展示如何使用EFML python库的example.py脚本获取设备信息。 安装完成后命令行执行 ‘python ./example.py’即可。

# -*- coding: utf-8 -*-
import sys
from ctypes import *
import pyefml

# init and enumerate device
pyefml.efmlInit()

# get device counts
dev_cnt = pyefml.efmlGetDevCount()
print('total device count = {}'.format(dev_cnt))

for idx in range(dev_cnt):
   dev_info = pyefml.efmlGetDevInfo(idx)
   print('device idx: {}'.format(idx))
   print('name = {}'.format(dev_info.name))
   print('vendor_id = {:04x}'.format(dev_info.vendor_id))
   print('device_id = {:04x}'.format(dev_info.device_id))
   print('domain_id = {:04x}'.format(dev_info.domain_id))
   print('bus_id = {:02x}'.format(dev_info.bus_id))
   print('dev_id = {:x}'.format(dev_info.dev_id))
   print("func_id = {:x}".format(dev_info.func_id))

# shutdown
pyefml.efmlShutdown()

与 C++ 的示例一样,pyefml.efmlInit()/pyefml.efmlShutdown() 需在初始化/退出的时候加载。 示例中的代码会打印出系统中所有 GCU 设备的 厂商识别码/设备识别码 Bus/Dev/Func 信息。

Go

Go 是一款开源编程软件,它使得代码实现更加简单,可靠和高效,也因此越来越受欢迎。 我们也提供了支持Go语言的efml 库,默认会安装在 /usr/share/gocode/src/go-efml 路径。目前最低支持Go 1.13。

Attention

请参阅 Golang 的官方文档去搭建 Go 开发环境。

下面有一个简单的示例 “main.go” ,示例可以打印出基本的设备信息。

package main

import (
      "go-efml"
      "fmt"
)

func main() {
      efml.Init()
      cnt, _ := efml.GetDevCount()
      for dev_idx := uint(0); dev_idx < cnt; dev_idx++ {
               handle := efml.Handle{0}
               devInfo, _ := handle.GetDevInfo()

               fmt.Println("device idx:", dev_idx)
               fmt.Println("name = ", devInfo.Name)
               fmt.Printf("vendor_id = %4x\n", devInfo.Vendor_Id)
               fmt.Printf("device_id = %4x\n", devInfo.Device_Id)
               fmt.Printf("domain_id = %4x\n", devInfo.Domain_Id)
               fmt.Printf("bus_id    = %2x\n", devInfo.Bus_Id)
               fmt.Printf("dev_id    = %2x\n", devInfo.Dev_Id)
               fmt.Printf("func_id   = %2x\n", devInfo.Func_Id)
      }

      efml.Shutdown()
}

对于Ubuntu和其它Debian系统,上述代码可以直接编译运行。 对于其它系统,你需要正确的生成和放置库文件的源代码。 Golang 的源代码放置于名为“src”的文件夹, go-efml 库文件放在下面的子目录。 在 go-efml 目录,你可以找到如下文件:

表 7.3.1 Go 绑定文件

名称:

说明

dl.go

go binding 库文件

efml.go

go binding 文件

源文件的代码结构应类似于:

dev_info
|—src
|– go-efml
|– dl.go
|– efml.go
|– main.go

重定向 “$GOPATH” to “dev_info” 链接, 你可以执行如下命令:

'export GOPATH="/PATH/TO/dev_info"'

返回到 “dev_info” 目录,执行 “go build”, 代码将被编译成 “dev_info” 可执行文件。

在目标机器执行生成的 “dev_info” 程序,将会输出目标设备的基本信息。

如果开启了go module,请使用“go mod init”命令初始化module,并重定向go-efml依赖到本地文件夹,然后使用“go build”编译。

1

GCU-LARE TM 是为支持加速卡之间互联的燧原智能互联技术。