---
title: DCMI_MAIN_CMD_QOS
description: "int dcmi_set_device_info(int card_id, int device_id, enum dcmi_main_cmd main_cmd, unsigned int sub_cmd, const void *buf, unsigned int buf_size)"
url: https://www.hiascend.com/document/detail/zh/HDK/latest/A2/A2DCMI/dcmi_071.html
sourcePath: /source/zh/HDK/2610/A2/A2DCMI/dcmi_071.html
indexId: 122e781495787fc78f1dac69b4474d64a61378fec7778156a71727f2fa3d938d43
---
# DCMI_MAIN_CMD_QOS

#### 函数原型

int dcmi_set_device_info(int card_id, int device_id, enum dcmi_main_cmd main_cmd, unsigned int sub_cmd, const void *buf, unsigned int buf_size)


#### 功能说明

配置QoS相关信息，包括配置mpamid对应的QoS信息、配置master对应的QoS信息、配置带宽统计功能。


#### 参数说明

| 参数名称 | 输入/输出 | 类型 | 描述 |
| --- | --- | --- | --- |
| card\_id | 输入 | int | 设备ID，当前实际支持的ID通过dcmi\_get\_card\_list接口获取。 |
| device\_id | 输入 | int | 芯片ID，通过dcmi\_get\_device\_id\_in\_card接口获取。取值范围如下： NPU芯片：[0, device\_id\_max\-1]。 说明： device\_id\_max值为1，当device\_id为0时表示NPU芯片；当device\_id为1时表示MCU芯片。 |
| main\_cmd | 输入 | enum dcmi\_main\_cmd | DCMI\_MAIN\_CMD\_QOS |
| sub\_cmd | 输入 | unsigned int | typedef enum { DCMI\_QOS\_SUB\_MATA\_CONFIG, //配置指定mpamid的信息 DCMI\_QOS\_SUB\_MASTER\_CONFIG, //配置指定master的信息 DCMI\_QOS\_SUB\_BW\_DATA, //配置带宽的统计功能 DCMI\_QOS\_SUB\_GLOBAL\_CONFIG, //配置通用信息 } DCMI\_QOS\_SUB\_INFO; |
| buf | 输入 | const void \* | 详见本节约束说明。 |
| buf\_size | 输入 | unsigned int | buf数组的长度。 |


#### 返回值说明

| 类型 | 描述 |
| --- | --- |
| int | 处理结果： 成功：返回0。 失败：返回码请参见返回码。 |


#### 异常处理

无。


#### 约束说明


**表1 sub_cmd对应的buf格式**

| sub\_cmd | buf对应的数据类型 | size | 参数说明 |
| --- | --- | --- | --- |
| DCMI\_QOS\_SUB\_MATA\_CONFIG | struct dcmi\_qos\_mata\_config { int mpamid; unsigned int bw\_high; unsigned int bw\_low; int hardlimit; int reserved[DCMI\_QOS\_CFG\_RESERVED\_LEN]; }; | sizeof(dcmi\_qos\_mata\_config) | mpamid：取值范围是[0,127]。 bw\_high：上水线(GB/s)，取值范围是[0,1638]。【注意】取值范围上限随颗粒主频变化，计算公式为：bw\_high\_max=ddr\_freq \* 2 \* max\_chn \* 8 / 1000，以实际主频和通道数为准。 bw\_low：下水线(GB/s)，取值范围是[0, bw\_high] hardlimit ： 1表示开启 0表示不开启 用户通过该接口读取水线，可能同先前用户配置值存在误差。误差值计算方式为：处理器最大带宽/MAX\_REG\_VALUE。其中，MAX\_REG\_VALUE取值为1024。 |
| DCMI\_QOS\_SUB\_MASTER\_CONFIG | struct dcmi\_qos\_master\_config { int master; int mpamid; int qos; int pmg; unsigned long long bitmap[4]; /\* max support 64 \* 4 \*/ int reserved[DCMI\_QOS\_CFG\_RESERVED\_LEN]; }; | sizeof(dcmi\_qos\_master\_config) | master：master ID，表示芯片加速器的枚举值。支持项：vdec=1,vpc=2,jpge=3,jpgd=4,pcie=7,sdma=13 mpamid：识别芯片加速器数据流的标签，取值范围为[0,127]。 说明： 当master取值为pcie时，对应mpamid的取值范围为[0,31]。 qos：带宽调度优先级，取值范围[0,7]。 pmg：mpamid分组，取值范围是[0,3] bitmap：因框架限制，不支持。 |
| DCMI\_QOS\_SUB\_BW\_DATA | struct dcmi\_qos\_bw\_config { u8 mode; u8 state; u8 cnt; u8 method; u32 interval; u32 target\_set[16]; int reserved\_1[8]; }; | sizeof(dcmi\_qos\_bw\_config) | interval：带宽采样时间间隔（单位us），需要配置大于1000。 mode：带宽统计的模式，0表示自动模式，1表示手动模式。该配置只有在MATA/DHA侧生效，DDRC侧配置不生效且只支持手动模式。 method：选择带宽统计的节点，0表示在MATA/DHA侧对带宽进行统计。 state：带宽采样下发命令。 2表示开启，此时读取的值有效。 1表示初始化。 0表示关闭。 target\_set：采样对象的mpamid，最多可存放16个，实际支持的数量与昇腾AI处理器有关。 cnt：有效带宽统计对象的数量，最多可支持16个。 |
| DCMI\_QOS\_SUB\_GLOBAL\_CONFIG | struct dcmi\_qos\_gbl\_config { unsigned int enable; unsigned int autoqos\_fuse\_en; /\* 0\-\-enable, 1\-\-disable \*/ unsigned int mpamqos\_fuse\_mode; /\* 0\-\-average, 1\-\-max, 2\-\-replace \*/ unsigned int mpam\_subtype; /\* 0\-\-all, 1\-\-wr, 2\-\-rd, 3\-\-none \*/ int reserved[DCMI\_QOS\_CFG\_RESERVED\_LEN]; }; | sizeof(dcmi\_qos\_gbl\_config) | enable：是否使能QoS功能。 0表示不使能。 1表示使能。 autoqos\_fuse\_en：qos的融合开关。当前不支持设置autoqos\_fuse\_en，默认值为1。 0表示关闭qos融合。 1表示开始qos融合。 mpamqos\_fuse\_mode：qos的融合模式，autoqos\_fuse\_en开启的条件下生效。 0表示均值融合。 1表示取随路qos和mpamqos之间的最大值作为融合结果。 2表示使用随路qos替换mpamqos。 mpam\_subtype：带宽统计的模式。 0表示统计读+写带宽。 1表示统计写带宽。 2表示统计读带宽。 |


**表2 不同部署场景下的支持情况**

| 产品形态 | 物理机场景（裸机）root用户 | 物理机场景（裸机）运行用户组（非root用户） | 物理机+普通容器场景root用户 | 物理机+容器AVI场景root用户 |
| --- | --- | --- | --- | --- |
| Atlas 900 A2 PoD 集群基础单元 | Y | N | N | N |
| Atlas 800T A2 训练服务器 | Y | N | N | N |
| Atlas 800I A2 推理服务器 | Y | N | N | N |
| Atlas 200T A2 Box16 异构子框 | Y | N | N | N |
| A200I A2 Box 异构组件 | Y | N | N | N |
| A300I A2 推理卡 | Y | N | N | N |
| 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 | 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 | 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 | 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 | 注：Y表示支持；N表示不支持；NA表示不涉及，当前未规划此场景。 |


#### 调用示例

```
…
int32_t ret;
int card_id = 0;
int device_id = 0;
// 配置mpamid上下水线，用于带宽限制
struct dcmi_qos_mata_config mataCfg = {0};
mataCfg.mpamid = 0; // 举例，mpamid配置为0
mataCfg.bw_high = 20;
mataCfg.bw_low = 10;
mataCfg.hardlimit = 1;
ret = dcmi_set_device_info(card_id, device_id, DCMI_MAIN_CMD_QOS,static_cast<uint32_t>(DCMI_QOS_SUB_MATA_CONFIG),
static_cast<void *>(&mataCfg), sizeof(struct dcmi_qos_mata_config));
if (ret != 0) {
printf("[dev:%d]set mata qos config failed, ret = %d\n", devId, ret);
return ret;
}
// 配置master对应的mpamid、qos、pmg
struct dcmi_qos_master_config masterCfg = {0};
masterCfg.master = 0;
masterCfg.mpamid = 1; // 举例，mpamid配置为1
masterCfg.qos = 3;
masterCfg.pmg = 0;
masterCfg.bitmap[0] = 0xffff0000;
masterCfg.bitmap[1] = 0xffff;
ret = dcmi_set_device_info(card_id, device_id, DCMI_MAIN_CMD_QOS, static_cast<uint32_t>(DCMI_QOS_SUB_MASTER_CONFIG),
static_cast<void *>(&mastercfg), sizeof(struct dcmi_qos_master_config));
if (ret != 0) {
printf("[dev:%d]set master qos config failed, ret = %d\n", devId, ret);
return ret;
}
// 以手动模式开启带宽监控：需指定监控对象
struct dcmi_qos_bw_config bwCfg = {0};
bwCfg.mode = 1;
bwCfg.state = 2;
bwCfg.target_set[0] = 1; // 举例,监控对象[0]配置为1
bwCfg.target_set[1] = 2; // 举例,监控对象[1]配置为2
bwCfg.cnt = 2;
bwCfg.interval = 1000;
ret = dcmi_set_device_info(card_id, device_id, DCMI_MAIN_CMD_QOS, DCMI_QOS_SUB_BW_DATA, \
static_cast<void *>(&(bwCfg)), sizeof(struct dcmi_qos_bw_config));
if (ret != 0) {
printf("[dev:%d]set mbwu failed, ret = %d\n", devId, ret);
return ret;
}
// 终止带宽监控
bwCfg.state = 0;
ret = dcmi_set_device_info(card_id, device_id, DCMI_MAIN_CMD_QOS, DCMI_QOS_SUB_BW_DATA, \
static_cast<void *>(&(bwCfg)), sizeof(bwCfg));
if (ret != 0) {
printf("[dev:%d]set mbwu failed, ret = %d\n", devId, ret);
return ret;
}
// 以自动模式开启带宽监控：无需指定监控对象，程序自动读取配置过的监控对象
bwCfg.mode = 0;
bwCfg.interval = 1000;
ret = dcmi_set_device_info(card_id, device_id, DCMI_MAIN_CMD_QOS, DCMI_QOS_SUB_BW_DATA, \
static_cast<void *>(&(bwCfg)), sizeof(bwCfg));
if (ret != 0) {
printf("[dev:%d]set mbwu failed, ret = %d\n", devId, ret);
return ret;
}
// 终止带宽监控
bwCfg.state = 0;
ret = dcmi_set_device_info(card_id, device_id, DCMI_MAIN_CMD_QOS, DCMI_QOS_SUB_BW_DATA, \
static_cast<void *>(&(bwCfg)), sizeof(bwCfg));
if (ret != 0) {
printf("[dev:%d]set mbwu failed, ret = %d\n", devId, ret);
return ret;
}
// 配置全局开关：开启qos功能
struct dcmi_qos_gbl_config gblCfg = {0};
gblCfg.enable = 1;
ret = dcmi_set_device_info(card_id, device_id, DCMI_MAIN_CMD_QOS, static_cast<uint32_t>(DCMI_QOS_SUB_GLOBAL_CONFIG),
static_cast<void *>(&gblCfg), sizeof(struct dcmi_qos_gbl_config));
if (ret != 0) {
QOS_LOG_ERROR("[dev:%d]set gbl qos config failed, ret = %d\n", devId, ret);
return ret;
}
…
```
