×

签到

分享到微信

打开微信,使用扫一扫进入页面后,点击右上角菜单,

点击“发送给朋友”或“分享到朋友圈”完成分享

【XXX产品/功能】一句话描述问题(字数限制25字以内) haozhou.wong2025-01-18 22:06:42 回复 查看 技术答疑
【XXX产品/功能】一句话描述问题(字数限制25字以内)
分享到:

我使用samples里面提供的devicequery代码来获取每个进程的利用率

当系统中只有一个进程时候,cndevGetProcessUtilization接口返回的mem_util是正确的,如下所示

image.png

当我有启动一个相同进程的时候,cndevGetProcessUtilization接口返回的mem_util异常,表现为其中一个进程的mem_util始终为0

image.png

代码如下

#include <cndev.h>
#include <stdio.h>

int main() {
  // init libcndev
  cndevRet_t ret = cndevInit(0);
  // you can compare cndevRet manually, or just use cndevCheckErrors
  if (CNDEV_SUCCESS != ret) {
    printf("cndev init failed: %s.\n", cndevGetErrorString(ret));
    // should exit now
    exit(0);
  }

  cndevDevice_t devHandle;
  ret = cndevGetDeviceHandleByIndex(0, &devHandle);
  cndevCheckErrors(ret);

  while (1) {
    // get card[x]'s process utilization
    // in most cases, the number of processes running on a card will not exceed 10
    // but if cndevProcessUtilization_t's space is not enough, CNDEV_ERROR_INSUFFICIENT_SPACE will be returned
    unsigned pCount = 10;
    cndevProcessUtilization_t *procUtil = NULL;
    procUtil = (cndevProcessUtilization_t *)malloc(pCount * sizeof(cndevProcessUtilization_t));
    procUtil->version = CNDEV_VERSION_5;
    ret = cndevGetProcessUtilization(&pCount, procUtil, devHandle);
    if (ret == CNDEV_ERROR_NOT_SUPPORTED) {
      printf("cndevGetProcessUtilization is not supported.\n");
    } else {
      // if ret is CNDEV_ERROR_INSUFFICIENT_SPACE, should get again
      while (ret == CNDEV_ERROR_INSUFFICIENT_SPACE) {
        procUtil = (cndevProcessUtilization_t *)realloc(procUtil, pCount * sizeof(cndevProcessUtilization_t));
        ret = cndevGetProcessUtilization(&pCount, procUtil, devHandle);
      }
      cndevCheckErrors(ret);
      printf("process: count: %d\n", pCount);
      for (unsigned int i = 0; i < pCount; i++) {
        printf(
            "process %d:pid:%u, IPU Util:%u %%, JPU Util:%u %%, VPU Decoder Util:%u %%, VPU Encoder Util:%u %%, Memory Util:%u "
            "%%\n",
            i, (procUtil + i)->pid, (procUtil + i)->ipuUtil, (procUtil + i)->jpuUtil, (procUtil + i)->vpuDecUtil,
            (procUtil + i)->vpuEncUtil, (procUtil + i)->memUtil);
      }
    }
    free(procUtil);

    usleep(1000000);
  }

  return 0;
}


版权所有 © 2025 寒武纪 Cambricon.com 备案/许可证号:京ICP备17003415号-1
关闭