1. MLU设备初始化与版本查询

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驱动是否已安装且设备未被其他进程独占。