1. MLU设备初始化与版本查询
任务目标
编写一个C程序,完成寒武纪MLU设备的初始化,并查询设备名称、驱动版本及运行时版本。程序需在MLU环境下可编译运行,输出结果用于验证设备访问是否正常。
环境依赖
本案例需要寒武纪CNToolkit运行时库(libcnrt.so)及对应头文件(cnrt.h)。确保已安装CNToolkit并设置环境变量:
export CNRT_HOME=/path/to/cntoolkit
export LD_LIBRARY_PATH=$CNRT_HOME/lib64:$LD_LIBRARY_PATH
export PATH=$CNRT_HOME/bin:$PATH
完整实现代码
#include <stdio.h>
#include <stdlib.h>
#include <cnrt.h>
#define CHECK_CNRT(call) \
do { \
cnrtRet_t ret = (call); \
if (ret != CNRT_RET_SUCCESS) { \
fprintf(stderr, "CNRT error at %s:%d, code=%d\n", __FILE__, __LINE__, ret); \
exit(EXIT_FAILURE); \
} \
} while (0)
int main() {
// 初始化MLU设备
CHECK_CNRT(cnrtInit(0));
// 查询设备数量
unsigned int devCount = 0;
CHECK_CNRT(cnrtGetDeviceCount(&devCount));
if (devCount == 0) {
fprintf(stderr, "No MLU device found.\n");
cnrtDestroy();
return EXIT_FAILURE;
}
// 设置当前设备为第一个MLU
CHECK_CNRT(cnrtSetDevice(0));
// 查询设备名称
char devName[256] = {0};
CHECK_CNRT(cnrtGetDeviceName(0, devName, sizeof(devName) - 1));
// 查询驱动版本
char driverVer[128] = {0};
CHECK_CNRT(cnrtGetDriverVersion(driverVer, sizeof(driverVer) - 1));
// 查询运行时版本
char runtimeVer[128] = {0};
CHECK_CNRT(cnrtGetRuntimeVersion(runtimeVer, sizeof(runtimeVer) - 1));
// 输出查询结果
printf("MLU device count: %u\n", devCount);
printf("Device name: %s\n", devName);
printf("Driver version: %s\n", driverVer);
printf("Runtime version: %s\n", runtimeVer);
// 释放资源
CHECK_CNRT(cnrtDestroy());
return EXIT_SUCCESS;
}
编译与运行
# 编译
gcc -o mlu_query mlu_query.c -I$CNRT_HOME/include -L$CNRT_HOME/lib64 -lcnrt
# 运行
./mlu_query
验证方法
程序正常执行后,标准输出应包含以下四行信息:
MLU device count:数值应大于等于1,表示系统识别到MLU设备。Device name:返回设备型号字符串(如MLU370等),非空。Driver version:返回驱动版本号字符串,非空。Runtime version:返回CNRT运行时版本号字符串,非空。
若程序退出码为0且上述字段均有实际内容,则判定初始化与查询功能通过。若输出No MLU device found或CNRT错误码,请检查驱动是否加载(ls /dev/mlu*)及CNToolkit环境配置。
常见问题
- 编译时找不到cnrt.h:确认
-I路径指向CNToolkit的include目录。 - 运行时提示找不到libcnrt.so:确认
LD_LIBRARY_PATH已包含CNToolkit的lib64目录。 - 设备数量为0:检查MLU驱动是否已安装且设备未被其他进程独占。