微知-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.rhkb.cn/news/473973.html

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

相关文章

智能指针原理、使用和实现——C++11新特性(三)

目录 一、智能指针的理解 二、智能指针的类型 三、shared_ptr的原理 1.引用计数 2.循环引用问题 3.weak_ptr处理逻辑 四、shared_ptr的实现 五、定制删除器 六、源码 一、智能指针的理解 问题:什么是智能指针?为什么要有智能指针?智…

初识Linux · 信号处理 · 续

目录 前言: 可重入函数 重谈进程等待和优化 前言: 在前文,我们已经介绍了信号产生,信号保存,信号处理的主题内容,本文作为信号处理的续篇,主要是介绍一些不那么重要的内容,第一个…

IPTV智慧云桌面,后台服务器搭建笔记

环境CentOs7.9 ,安装宝塔yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 访问宝塔,修改服务器端口安全组端口 26029 注意!!!&#xff01…

模型的评估指标——IoU、混淆矩阵、Precision、Recall、P-R曲线、F1-score、mAP、AP、AUC-ROC

文章目录 预测框的预测指标——IoU(交并比)分类预测指标混淆矩阵(Confusion Matrix,TP、FP、FN、TN)Precision(精度)Recall(召回率)P-R曲线F1-scoreTPR、TNR、FPR、FNRROC曲线下面积…

本草智控:中药实验管理的智能时代

3系统分析 3.1可行性分析 通过对本中药实验管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本中药实验管理系统采用SSM框架,JAVA作为开发语…

父组件提交时让各自的子组件验证表格是否填写完整

项目场景: 提示:这里简述项目相关背景: 父组件中有三个表格,表格中时输入框,有些输入框是必填的,在父组件提交时需要验证这三个表格的必填输入框中是否有没填写的。 原因分析: 提示&#xff1a…

嘴尚绝卤味独特的口感

在餐饮行业里,嘴尚绝卤味无疑是一颗璀璨的明星。自2021年8月7日创立以来,这个品牌就以其独特的口感和制作工艺赢得了众多食客的青睐。嘴尚绝卤味,作为四川优优熊猫餐饮管理有限公司旗下的主打品牌,专注于提供高品质的休闲佐食&…

JDK17 安装使用

一、Java JDK(Java Development Kit) 它是开发、运行Java应用程序所需的各种工具和库的集合。 二、JDK 1.8(也称为Java 8)和JDK 17是两个重要的版本 这两个版本在语言特性、性能优化和安全性方面都有所不同。 1、语言特性 …

解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题

解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 Chapter1 解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 Chapter1 解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 目前使用的是三星4K显示屏,屏幕分辨率太高了,导致VMWare Workst…

uniapp 微信小程序地图标记点、聚合点/根据缩放重合点,根据缩放登记显示气泡marik标点

如图,如果要实现上方的效果: 上方两个效果根据经纬度标记点缩放后有重复点会添加数量 用到的文档地址https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addMarkers.htmlMapContext.addMarkers(Object object) 添加标记点Ma…

第6章详细设计 -6.7 PCB工程需求表单

6.7 PCB工程需求表单 PCB工程需求表是PCB设计的入口条件,以一块单板为例,表6.2所示的PCB工程需求表单明确了Signal Integrity(SI,信号完整性)和Power Integrity(PI,电源完整性)的要…

Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系

一.什么是Spring?它解决了什么问题? 1.1什么是Spring? Spring,一般指代的是Spring Framework 它是一个开源的应用程序框架,提供了一个简易的开发方式,通过这种开发方式,将避免那些可能致使代码…

重构Action-cli前端脚手架

一、概述 最近一年,为了满足公司业务开发,解决重复搭建项目繁琐过程,自己开发了一个前端脚手架,并发布到npm。随着时间的推移,发现之前的版本存在很多问题,有些功能做不到位,而且代码也不是很规…

Kotlin return与return@forEachIndexed

Kotlin return与returnforEachIndexed fun main() {val data arrayOf(0, 1, 2, 3, 4)println("a")data.forEachIndexed { index, v ->if (v 2) {//类似while循环中的continue//跳过,继续下一个forEachIndexed迭代returnforEachIndexed}println("…

Springboot基于GIS的旅游信息管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

《Django 5 By Example》阅读笔记:p645-p650

《Django 5 By Example》学习第8天,p645-p650总结,总计6页。 一、技术总结 1.django-rest-framework (1)serializer p648, Serializer: Provides serialization for normal Python class instances。Serializer又细分为Serializer, ModelSerializer,…

5个有效的华为(HUAWEI)手机数据恢复方法

5个有效的手机数据恢复方法 华为智能手机中的数据丢失比许多人认为的更为普遍。发生这种类型的丢失有多种不同的原因,因此数据恢复软件的重要性。您永远不知道您的智能手机何时会在这方面垮台;因此,预防总比哀叹好,这就是为什么众…

【微软:多模态基础模型】(4)统一视觉模型

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html)原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微…

鸿蒙网络编程系列48-仓颉版UDP回声服务器示例

1. UDP回声服务器简介 回声服务器指的是这样一种服务器,它接受客户端的连接,并且把收到的数据原样返回给客户端,本系列的第2篇文章《鸿蒙网络编程系列2-UDP回声服务器的实现》中基于ArkTS语言在API 9的环境下实现了UDP回声服务器&#xff0c…

微博短链接平台-项目测试用例设计(Xmind)

技术栈:Spring BootMyBatis-PlusRedisShardingSphereSentinel 项目描述:微博短链接平台,提供了一个高效、安全和可靠的短链接管理平台。完成较长链接转换为短链接场景。比 如,受微博发送博文长度限制,仅能发表150字&am…