微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)

文章目录

  • 1. 背景
  • 2. 设置参数的主要流程
    • 2.1 初始化
    • 2.2 注册某个params的处理方式以及回调函数
    • 2.4 定义好前面的params以及init指定config地点后start处理argv
  • 3. 其他
  • 4. DOCA ARGP包相关
    • 4.1 主要接口
    • 4.2 DOCA ARGP的2个rpm包
      • 4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm
      • 4.2.2 doca-sdk-argp-devel-2.9.0072-1.el8.x86_64.rpm
      • 4.2.3 头文件和so库
  • 5. 综述

1. 背景

DOCA: Data Center-on-a-Chip Architecture,片上数据中心架构。是NVIDIA针对DPU的软件框架。DOCA之于DPU,就相当于CUDA之于GPU。本文介绍的是DOCA SDK中的DOCA ARGP模块的机制原理,他是DOCA程序的一个标准参数处理框架。

DOCA ARGP (DOCA Arg Parser)是doca中给用户程序提供的一个处理用户参数的模块。基本原理是提供一个后端处理服务,将-v -vv这种参数以及遇到这种参数给一个回调函数(该回调函数用户提供),然后在回调函数中将用户输入数据存入正确的config数据中。
在doca argp中主要有2种内存,一个是config内存(就是用户在整个模块中的config参数);另一个是params内存,这个内存是用来给argp用的,它定义了多个参数匹配模式元组的表示,也就是后面提到的params的多个接口设置的目的。
然后doca argp使用多个API接口,注册用户期望的多个params,然后根据用户输入的多个参数一一的进入用户定制的处理函数将数据存入用户config空间。
要真正理解本文的流程建议拿一个实际的DOCA samples进行查看。本文使用的源码是doca sapmle中的\doca\samples\doca_devemu\devemu_pci_device_dma\dpu\devemu_pci_device_dma_dpu_main.c

全局关键点预览:
在这里插入图片描述

2. 设置参数的主要流程

  • 先创建一个 param的句柄: doca_argp_param_createstruct doca_argp_param *param。 doca_argp后端提供这个服务,让后端创建相关资源。这里doca后端应该仅仅是使用类似malloc创建资源,后面整整reg才会初始化。可以看到这些params的的本质是KV的方式,key就是前面几个set的key,v是存在通过param_create的内存中。
  • 然后设置参数的几件套:包括-x,–xxx这些指定方式。其中 -x短模式用:doca_argp_param_set_short_name,长模式用:doca_argp_param_set_long_name
  • 然后设置这个参数的description:doca_argp_param_set_description
  • 指定函数处理的调用函数:毁掉函数中从params中指定的参数,送到config中去。也就可以直接从输入参数拷贝到创建的params的资源中去。
  • 设置param的参数类型
  • 指定这些参数后,就能够使用doca_argp_register_param将指定的几个参数赋值到create的资源里面去。并且应该后台有一个-和–的全局链,然后给后面匹配的时候遍历对比。

那么接下来的问题是,在argp后端创建了资源,也给资源进行了赋值。用户程序如何将运行时刻的参数赋值到这些资源上呢?
答案是:doca_argp_start(argc, argv);
当程序运行后,指定了类似–vuid之后,doca_argp_start会从argc和argv中获取这些参数,然后判断比如和前面register的-或者–的参数对比,如果对比上了,就会调用对应的param注册的callback,然后callback中将参数给到用户程序的config里面。这里callback的函数调用的时候,因为有指定param的参数类型,会作为参数传入callback的第二个参数,另外就是前面

那么用户程序的config里面是如何存储到用户参数的呢?

doca_argp_param_create
doca_argp_param_set_short_name
doca_argp_param_set_long_name
doca_argp_param_set_description
doca_argp_param_set_callback
doca_argp_param_set_type
doca_argp_init
将定义的buf注册到argp后端
后端在遍历回调的时候config内存点
doca_argp_register_param
指定参数-x或者--xx
doca_argp_start
将数据给argp后端
memory
【param】test_reg_params1
参数kv结构化表示数据
主要目的是通过-等找到callback
经过callback设置到config
short
-u
long
--vuid
desc
this is a test vuid
callback
function_xxx(params, config)
type
string
argp_backend
argp后端的大概结构
test_reg_params2
test_reg_params1
【config】全局配置数据
参数结构:struct devemu_pci_cfg
APP
APP被调用
argc_argv
将用户输入argc argv的值从params匹配后
配置到config中
回调函数中使用config的结构转义出来

也就是说当doca_argp_start执行后,从用户-等参数就设置到init指定的地址里面。

2.1 初始化

使用doca_argp_init会创建argp的资源
用法:

	result = doca_argp_init("doca_devemu_pci_device_dma_dpu", &devemu_pci_cfg);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to init ARGP resources: %s", doca_error_get_descr(result));goto sample_exit;}

定义:

struct devemu_pci_cfg {char devemu_manager_pci_address[DOCA_DEVINFO_PCI_ADDR_SIZE]; /* Emulated device manager PCI address */char dma_dev_name[DOCA_DEVINFO_IBDEV_NAME_SIZE];	     /* DMA device name */char vuid[DOCA_DEVINFO_REP_VUID_SIZE];			     /* VUID of emulated device */uint64_t host_dma_mem_iova;				     /* IOVA of host DMA memory */char write_data[MEM_BUF_LEN];				     /* Data to write to host memory */
};

2.2 注册某个params的处理方式以及回调函数

	result = register_vuid_param("DOCA Devemu emulated device VUID.", vuid_callback);if (result != DOCA_SUCCESS)return result;doca_error_t register_vuid_param(const char *description, doca_argp_param_cb_t vuid_callback)
{struct doca_argp_param *param;doca_error_t result;/* Create and register VUID param */result = doca_argp_param_create(&param);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to create ARGP param: %s", doca_error_get_descr(result));return result;}doca_argp_param_set_short_name(param, "u");doca_argp_param_set_long_name(param, "vuid");doca_argp_param_set_description(param, description);doca_argp_param_set_callback(param, vuid_callback);doca_argp_param_set_type(param, DOCA_ARGP_TYPE_STRING);result = doca_argp_register_param(param);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to register program param: %s", doca_error_get_descr(result));return result;}return DOCA_SUCCESS;
}## 2.3 回调函数:
static doca_error_t vuid_callback(void *param, void *config)
{struct devemu_pci_cfg *conf = (struct devemu_pci_cfg *)config;const char *vuid = (char *)param;return parse_vuid(vuid, conf->vuid);
}

2.4 定义好前面的params以及init指定config地点后start处理argv

从入参中直接赋值到定义的参数中:

	result = doca_argp_start(argc, argv);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to parse sample input: %s", doca_error_get_descr(result));goto argp_cleanup;}if (*devemu_pci_cfg.vuid == 0) {DOCA_LOG_ERR("The VUID parameter is missing");goto argp_cleanup;}

3. 其他

该文章中主要的主要流程的全流程代码

/** Sample main function** @argc [in]: command line arguments size* @argv [in]: array of command line arguments* @return: EXIT_SUCCESS on success and EXIT_FAILURE otherwise*/
int main(int argc, char **argv)
{struct devemu_pci_cfg devemu_pci_cfg;doca_error_t result;struct doca_log_backend *sdk_log;int exit_status = EXIT_FAILURE;/* Set the default configuration values (Example values) */strcpy(devemu_pci_cfg.devemu_manager_pci_address, "0000:03:00.0");strcpy(devemu_pci_cfg.dma_dev_name, "");strcpy(devemu_pci_cfg.vuid, "");strcpy(devemu_pci_cfg.write_data, "This is a sample piece of data from DPU!");devemu_pci_cfg.host_dma_mem_iova = 0x1000000;/* Register a logger backend */result = doca_log_backend_create_standard();if (result != DOCA_SUCCESS)goto sample_exit;/* Register a logger backend for internal SDK errors and warnings */result = doca_log_backend_create_with_file_sdk(stderr, &sdk_log);if (result != DOCA_SUCCESS)goto sample_exit;result = doca_log_backend_set_sdk_level(sdk_log, DOCA_LOG_LEVEL_WARNING);if (result != DOCA_SUCCESS)goto sample_exit;DOCA_LOG_INFO("Starting the sample");#ifdef DOCA_ARCH_DPUresult = doca_argp_init("doca_devemu_pci_device_dma_dpu", &devemu_pci_cfg);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to init ARGP resources: %s", doca_error_get_descr(result));goto sample_exit;}result = register_devemu_pci_params();if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to register sample command line parameters: %s", doca_error_get_descr(result));goto argp_cleanup;}result = doca_argp_start(argc, argv);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to parse sample input: %s", doca_error_get_descr(result));goto argp_cleanup;}if (*devemu_pci_cfg.vuid == 0) {DOCA_LOG_ERR("The VUID parameter is missing");goto argp_cleanup;}result = devemu_pci_device_dma_dpu(devemu_pci_cfg.devemu_manager_pci_address,devemu_pci_cfg.dma_dev_name,devemu_pci_cfg.vuid,devemu_pci_cfg.host_dma_mem_iova,devemu_pci_cfg.write_data);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("devemu_pci_device_dma_dpu() encountered an error: %s", doca_error_get_descr(result));goto argp_cleanup;}exit_status = EXIT_SUCCESS;argp_cleanup:doca_argp_destroy();#else // DOCA_ARCH_DPU(void)argc;(void)argv;DOCA_LOG_ERR("PCI Emulated Device DMA DPU can run only on the DPU");exit_status = EXIT_FAILURE;#endif // DOCA_ARCH_DPUsample_exit:if (exit_status == EXIT_SUCCESS)DOCA_LOG_INFO("Sample finished successfully");elseDOCA_LOG_INFO("Sample finished with errors");return exit_status;
}# 定义params的地方:
/** Register the command line parameters for the sample** @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise*/
static doca_error_t register_devemu_pci_params(void)
{doca_error_t result;result = register_devemu_manager_pci_address_param(pci_callback);if (result != DOCA_SUCCESS)return result;result = register_dma_device_name_param(device_name_callback);if (result != DOCA_SUCCESS)return result;result = register_vuid_param("DOCA Devemu emulated device VUID.", vuid_callback);if (result != DOCA_SUCCESS)return result;result = register_mem_address_param(mem_address_callback);if (result != DOCA_SUCCESS)return result;result = register_write_data_param(write_data_callback);if (result != DOCA_SUCCESS)return result;return DOCA_SUCCESS;
}# 将parmas存入到config中的回调函数(config是init函数的时候存入的)
/** ARGP Callback - Handle VUID parameter** @param [in]: Input parameter* @config [in/out]: Program configuration context* @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise*/
static doca_error_t vuid_callback(void *param, void *config)
{struct devemu_pci_cfg *conf = (struct devemu_pci_cfg *)config;const char *vuid = (char *)param;return parse_vuid(vuid, conf->vuid);
}

4. DOCA ARGP包相关

4.1 主要接口

在这里插入图片描述

4.2 DOCA ARGP的2个rpm包

4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm

在这里插入图片描述

4.2.2 doca-sdk-argp-devel-2.9.0072-1.el8.x86_64.rpm

在这里插入图片描述

4.2.3 头文件和so库

参考doca_argp.h

5. 综述

本文拆解了argp的编程模式。本质就是一个用户态命令输入流的pipe line。并且提出了2个内存块param和config,在pipe line里面通过param中的callback进入每个param的处理流程,处理流程中就是把用户输入的param存入config中

参考:
https://docs.nvidia.com/doca/api/2.9.0/pdf/doca-libraries-api.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#.Net筑基-字符串超全总结

字符串是日常编码中最常用的引用类型了,可能没有之一,加上字符串的不可变性、驻留性,很容易产生性能问题,因此必须全面了解一下。 01、字符与字符编码 1.1、字符Char 字符 char 表示为 Unicode字符,在C#中用 UTF-16 …

苍穹外卖-后端部分

软件开发整体介绍 前端搭建 在非中文目录中双击nginx.exe然后浏览器访问localhost即可 后端搭建 基础准备 导入初始文件 使用git进行版本控制 创建本地仓库和远程仓库,提交Git 连接数据库 连接数据库把资料中的文件放入运行即可 前后端联调测试 苍穹外卖项目接口文档…

剧本杀门店预约小程序,解锁沉浸式推理体验

一、开发背景 剧本杀作为一种热门娱乐游戏,深受大众的欢迎,但随着市场的快速发展,竞争也在不断加大,对于剧本杀线下商家来说面临着发展创新。 剧本杀线下门店数量目前正在逐渐增加,竞争激烈,而门店的获客…

【WPF】Prism学习(二)

Prism Commands 1.命令(Commanding) 1.1. ViewModel的作用: ViewModel不仅提供在视图中显示或编辑的数据,还可能定义一个或多个用户可以执行的动作或操作。这些用户可以通过用户界面(UI)执行的动作或操作…

学者观察 | 元计算、人工智能和Web 3.0——山东大学教授成秀珍

导语 成秀珍教授提出元计算是在开放的零信任环境下整合算力资源打通数据壁垒构建自进化智能的新质生产力技术,是一种新计算范式;区块链是Web3.0的核心技术之一,有助于保障开放零信任环境下,用户、设备和服务间去中心化数据流通的…

学习笔记022——Ubuntu 安装 MySQL8.0版本踩坑记录

目录 1、查看可安装 MySQL 版本 2、Ubuntu安装 MySQL8.0 3、MySQL8.0 区分大小写问题 4、MySQL8.0 设置sql_mode 5、MySQL8.0 改端口33060(个人遇到问题) 1、查看可安装 MySQL 版本 ## 列出可用的MySQL版本(列出所有可用的MySQL版本以…

「AI Infra 软件开源不是一个选项,而是必然」丨云边端架构和 AI Infra专场回顾@RTE2024

在人工智能和开源技术蓬勃发展的当下,AI Infra 项目正经历着日新月异的变革。从跨平台运行时到云边端 AI 基础设施,再到多模态知识助手,创新浪潮席卷而来。这些进步不仅显著提升了技术指标,也为实时音视频处理、边缘计算、大模型应…

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果: – 使用Pygame模拟粒子运动,粒子会以爱心的轨迹分布并运动。爱心公式: 爱心的数学公式: x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果: 粒子…

免费实时图片编辑工具:MagicQuill

参看: https://huggingface.co/spaces/AI4Editing/MagicQuill 人工智能交互式图像编辑:可以制定涂改增加删除

web——upload-labs——第九关——特殊字符::$DATA绕过

特殊字符::$DATA绕过 典型绕过场景 在一些系统中,::$DATA 被用于绕过文件路径的限制。比如: 路径过滤绕过:如果系统有某种机制来检查和限制文件路径(例如,禁止访问某些系统目录或敏感文件),通…

本地部署 excalidraw

本地部署 excalidraw 0. 引言1. 本地部署 excalidraw2. 访问 excalidraw 0. 引言 Excalidraw 编辑器是一款开源虚拟手绘白板,支持协作且端到端加密。 1. 本地部署 excalidraw git clone https://github.com/excalidraw/excalidraw.git; cd excalidrawvi docker-c…

《Java核心技术 卷I》用户界面AWT事件继承层次

AWT事件继承层次 EventObject类有一个子类AWTEvent,它是所有AWT事件类的父类。 Swing组件会生成更多其他事件对象,都直接拓展自EventObject而不是AWTEvent。 AWT将事件分为底层(low-level)事件和语义事件。 语义事件:表示用户的动作事件&…

三周精通FastAPI:42 手动运行服务器 - Uvicorn Gunicorn with Uvicorn

官方文档:Server Workers - Gunicorn with Uvicorn - FastAPI 使用 fastapi 运行命令 可以直接使用fastapi run命令来启动FastAPI应用: fastapi run main.py如创建openapi.py文件: from fastapi import FastAPIapp FastAPI(openapi_url&…

整理iPhone空间:iphone怎么删除相簿

随着时间的积累,我们的iPhone中不仅会堆积大量照片,还可能会有多个不再需要的相簿。这些相簿不仅占用存储空间,还可能使相册应用变得杂乱无章。本文将探讨iphone怎么删除相簿,并介绍精简iPhone相册的技巧,使你的相册管…

路漫漫其修远兮,吾将上下而求索---第一次使用github的过程记录和个人感受

文章目录 1.仓库位置2.新建仓库3.配置仓库4.克隆和上传5.推荐文章和我的感受 1.仓库位置 这个仓库的位置就是在我们的这个个人主页的右上角;如果是第一次注册账号的话,这个主页里面肯定是不存在仓库的,需要我们自己手动的进行创建&#xff1…

ICML24最新开源时序基础模型MOMENT

论文标题:MOMENT: A Family of Open Time-series Foundation Models 论文链接:https://arxiv.org/pdf/2402.03885 前言 当前时间序列数据上预训练大型模型面临以下挑战:(1) 缺乏大型且统一的公共时间序列数据集,(2) 时间序列特…

SpringBoot Data Redis连接Redis-Cluster集群

使用SpringBoot Data Redis无法连接Redis-Cluster集群 最近在研究系统高并发下的缓存架构,因此自己在自己买的云服务器上搭建好Redis 5.0 版本的集群后,使用springboot的 RedisTemplate连接是发现总是访问不到集群节点。上网百度了发现没有好的解决办法&…

鸿蒙中服务卡片数据的获取和渲染

1. 2.在卡片中使用LocalStorageProp接受传递的数据 LocalStorageProp("configNewsHead") configNewsHeadLocal: ConfigNewsHeadInfoItem[] [] 注意:LocalStorageProp括号中的为第一步图片2中的键 3.第一次在服务卡片的第一个卡片中可能会获取不到数据…

ARM64环境部署EFK8.15.3收集K8S集群容器日志

环境规划 主机IP系统部署方式ES版本CPU架构用户名密码192.168.1.225Ubuntu 22.04.4 LTSdockerelasticsearch:8.15.3ARM64elasticllodyi4TMmZD ES集群部署 创建持久化目录(所有节点) mkdir -p /data/es/{data,certs,logs,plugins} mkdir -p /data/es/certs/{ca,es01}服务器…

应用系统开发(12) Zync中实现数字相敏检波

在 Xilinx Zynq 系列(如 Zynq-7000 或 Zynq UltraScale+)中实现数字相敏检波(DSP,Digital Synchronous Detection)可以通过硬件(PL部分,FPGA逻辑)和软件(PS部分,ARM Cortex-A 处理器)的协同工作来实现。以下是一个详细的设计方法,包括基本原理和 Zynq 的实现步骤。…