智能网卡之hinic3 WQE(Work Queue Element)结构梳理

news2025/6/9 6:26:52

hinic3 WQE(Work Queue Element)结构详解

本文基于 hinic3 驱动源码,对 WQE(Work Queue Element)做详细讲解。如需查阅完整源码和结构体定义可参考hinic3_nic_qp.h等文件。


1. WQE 的作用

  • WQE(Work Queue Element):网卡芯片可识别的数据格式。
  • sk_buff:Linux 协议栈中的数据结构,硬件不可直接识别。
  • 驱动作用:负责将 sk_buff 转换为 WQE,供硬件使用。

类比

+---------------------+        转换        +------------------+        交互
|   上层 sk_buff      |  ------------->    |      WQE         |  ---->  网卡芯片
+---------------------+        驱动        +------------------+        硬件

2. SQ队列与wqebb

  • SQ:发送队列(Send Queue)。
  • wqebb(Work Queue Element Basic Block):SQ的最小分配单元,每个大小为16字节(16B)。
  • 最大深度:16K(16384)个 wqebb。
  • 一个WQE 可以包括多个 wqebb。
+---------+---------+---------+ ... +---------+
| wqebb 0 | wqebb 1 | wqebb 2 | ... | wqebb N |
+---------+---------+---------+ ... +---------+
      |<---  一个WQE由多个wqebb组成  --->|

相关宏定义见 hinic3_nic_io.h:

#define HINIC3_SQ_WQEBB_SHIFT 4
#define HINIC3_SQ_WQEBB_SIZE  BIT(HINIC3_SQ_WQEBB_SHIFT) // 16B

3. SQ WQE 的三种类型

设计目的

为提升端到端性能,hinic3 的 SQ WQE 结构支持三种类型:

  • 1. Extended SQ WQE with normal TS(支持无状态卸载,结构最复杂,支持各种 offload)
  • 2. Extended SQ WQE with small TS(不支持无状态卸载,支持多SGE)
  • 3. Compact SQ normal WQE(不支持无状态卸载,且只含单SGE,结构最简单)

4. WQE 结构与bit详细解析

4.1 Extended SQ WQE with normal TS(支持无状态卸载)

结构组成
  • CTRL(Control Segment):描述WQE属性、部分卸载信息
  • TASK:状态卸载标志(16B)
  • BDSL(Buffer Descriptor Segment List):指向数据块的指针数组
  • QSF:卸载相关任务字段
结构框图

在这里插入图片描述

CTRL字段详细bit位解释(来自hinic3_nic_qp.h)
字段含义
OOwner bit,在队列翻转时,需要进行 obit 的翻转
ECwqe type: 1’b1 - extended wqe type;1’b0 - compact wqe type
DN1’b1 - Direct wqe type;1’b0 - Normal wqe type,NIC 默认设置为 0
DFData format:1’b0 – SGL;1’b1 - inline data,NIC 使用 SGL 方式
TSTask section size:1’b1 - 16B;1’b0 - 46bit
BDSLSGE number(包括 wqe header 和 BDSL section 中的 sge 数量)

相关宏定义:

#define SQ_CTRL_BD0_LEN_SHIFT 0
#define SQ_CTRL_RSVD_SHIFT 18
#define SQ_CTRL_BUFDESC_NUM_SHIFT 19
#define SQ_CTRL_TASKSECT_LEN_SHIFT 27
#define SQ_CTRL_DATA_FORMAT_SHIFT 28
#define SQ_CTRL_DIRECT_SHIFT 29
#define SQ_CTRL_EXTENDED_SHIFT 30
#define SQ_CTRL_OWNER_SHIFT 31

#define SQ_CTRL_BD0_LEN_MASK 0x3FFFFU
#define SQ_CTRL_RSVD_MASK 0x1U
#define SQ_CTRL_BUFDESC_NUM_MASK 0xFFU
#define SQ_CTRL_TASKSECT_LEN_MASK 0x1U
#define SQ_CTRL_DATA_FORMAT_MASK 0x1U
#define SQ_CTRL_DIRECT_MASK 0x1U
#define SQ_CTRL_EXTENDED_MASK 0x1U
#define SQ_CTRL_OWNER_MASK 0x1U
TASK字段结构(16B)

在这里插入图片描述
相关宏定义:

#define SQ_TASK_INFO0_TUNNEL_FLAG_SHIFT 19
#define SQ_TASK_INFO0_ESP_NEXT_PROTO_SHIFT 22
#define SQ_TASK_INFO0_INNER_L4_EN_SHIFT 24
#define SQ_TASK_INFO0_INNER_L3_EN_SHIFT 25
#define SQ_TASK_INFO0_INNER_L4_PSEUDO_SHIFT 26
#define SQ_TASK_INFO0_OUT_L4_EN_SHIFT 27
#define SQ_TASK_INFO0_OUT_L3_EN_SHIFT 28
#define SQ_TASK_INFO0_OUT_L4_PSEUDO_SHIFT 29
#define SQ_TASK_INFO0_ESP_OFFLOAD_SHIFT 30
#define SQ_TASK_INFO0_IPSEC_PROTO_SHIFT 31

#define SQ_TASK_INFO0_TUNNEL_FLAG_MASK 0x1U
#define SQ_TASK_INFO0_ESP_NEXT_PROTO_MASK 0x3U
#define SQ_TASK_INFO0_INNER_L4_EN_MASK 0x1U
#define SQ_TASK_INFO0_INNER_L3_EN_MASK 0x1U
#define SQ_TASK_INFO0_INNER_L4_PSEUDO_MASK 0x1U
#define SQ_TASK_INFO0_OUT_L4_EN_MASK 0x1U
#define SQ_TASK_INFO0_OUT_L3_EN_MASK 0x1U
#define SQ_TASK_INFO0_OUT_L4_PSEUDO_MASK 0x1U
#define SQ_TASK_INFO0_ESP_OFFLOAD_MASK 0x1U
#define SQ_TASK_INFO0_IPSEC_PROTO_MASK 0x1U
QSF 字段(主要和卸载相关)
FieldRangeComments
pri[31:29]RSV
Uc[28]RSV
sctp[27]Sctp packet.
mss[26:13]mss
tcp_udp_cs[12]RSV
tso[11]Transmit segmentation offload is activated when the tso flag is set.
Not support TSO, when pkt_type=2’b01;
ufo[10]For UDP packet, engine reads the whole UDP packet from host by 1 DMA read, and IPSU calculates UDP checksum, uCode does IP segment.
Pld_ofs[9:2]Pkt_type = 2’b00:
Payload offset. It is the start position to calculate tcp/udp checksum or sctp CRC.
Unit is 2B, the max value is 239 (239*2=478B)
Pkt_type = 2’b01:
Bit9:5 – RSV
Bit4:2 – cmd_code to AAD
Pkt_type[1:0]pkt_type:
2’b00 – normal sq WQE;
2’b01 – sq direct-forward WQE;
Others – RSV;

相关宏定义:

#define SQ_CTRL_QUEUE_INFO_PKT_TYPE_SHIFT 0
#define SQ_CTRL_QUEUE_INFO_PLDOFF_SHIFT 2
#define SQ_CTRL_QUEUE_INFO_UFO_SHIFT 10
#define SQ_CTRL_QUEUE_INFO_TSO_SHIFT 11
#define SQ_CTRL_QUEUE_INFO_TCPUDP_CS_SHIFT 12
#define SQ_CTRL_QUEUE_INFO_MSS_SHIFT 13
#define SQ_CTRL_QUEUE_INFO_SCTP_SHIFT 27
#define SQ_CTRL_QUEUE_INFO_UC_SHIFT 28
#define SQ_CTRL_QUEUE_INFO_PRI_SHIFT 29

#define SQ_CTRL_QUEUE_INFO_PKT_TYPE_MASK 0x3U
#define SQ_CTRL_QUEUE_INFO_PLDOFF_MASK 0xFFU
#define SQ_CTRL_QUEUE_INFO_UFO_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_TSO_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_TCPUDP_CS_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_MSS_MASK 0x3FFFU
#define SQ_CTRL_QUEUE_INFO_SCTP_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_UC_MASK 0x1U
#define SQ_CTRL_QUEUE_INFO_PRI_MASK 0x7U
BDSL(Buffer Descriptor Segment List)

由若干个 struct hinic3_sq_bufdesc 组成,每个struct hinic3_sq_bufdesc 结构体可以包含一个SGE 数据:

struct hinic3_sq_bufdesc {
    u32 len;     // 31bit长度
    u32 rsvd;
    u32 hi_addr; // 高32位物理地址
    u32 lo_addr; // 低32位物理地址
};

4.2 Extended SQ WQE with small TS(不支持无状态卸载,多SGE)

  • 结构类似normal TS,但不能用offload。
  • BDSL部分要求sge_num >= 2,CTRL里可以带一个SGE指针。
    在这里插入图片描述

4.3 Compact SQ normal WQE(单SGE,极简)

  • 只占用1个wqebb(16B),极致精简。
  • 适用于不需要offload且报文只含1个SGE的场景。
    在这里插入图片描述

5. Doorbell 结构详解

驱动填充完WQE后,用doorbell机制通知硬件。hinic3采用64bit doorbell,结构如下:

Doorbell数据结构(hinic3_nic_io.h)

struct hinic3_nic_db {
	u32 db_info;
	u32 pi_hi;
};

db_info字段按位解释:
在这里插入图片描述

  • QID[12:0]:队列编号
  • CFLAG[23]:0表示SQ, 1表示RQ
  • Cos[26:24]:优先级
  • Type[31:27]:类型(一般1)
  • PI: Producer Index
    相关宏定义:
#define DB_INFO_QID_SHIFT          0
#define DB_INFO_NON_FILTER_SHIFT   22
#define DB_INFO_CFLAG_SHIFT        23
#define DB_INFO_COS_SHIFT          24
#define DB_INFO_TYPE_SHIFT         27

#define DB_INFO_QID_MASK           0x1FFFU
#define DB_INFO_NON_FILTER_MASK    0x1U
#define DB_INFO_CFLAG_MASK         0x1U
#define DB_INFO_COS_MASK           0x7U
#define DB_INFO_TYPE_MASK          0x1FU

6. RQ WQE 结构与bit详细解析

6.1 RQ WQE 结构体

hinic3 的 RQ(Receive Queue)WQE 主要有两种结构:普通模式和扩展模式。其核心结构体如下:

struct hinic3_rq_normal_wqe {
    u32 buf_hi_addr;
    u32 buf_lo_addr;
    u32 cqe_hi_addr;
    u32 cqe_lo_addr;
};

struct hinic3_rq_extend_wqe {
    struct hinic3_sge_sect buf_desc;
    struct hinic3_sge_sect cqe_sect;
};

struct hinic3_rq_wqe {
    union {
        struct hinic3_rq_normal_wqe normal_wqe;
        struct hinic3_rq_extend_wqe extend_wqe;
    };
};
  • buf_hi_addr / buf_lo_addr:数据缓冲区物理地址高/低 32 位。
  • cqe_hi_addr / cqe_lo_addr:CQE 缓冲区物理地址高/低 32 位。
  • buf_desc / cqe_sect:扩展模式下的 SGE 描述符。

由结构体可见,RQ WQE 也是16byte。其内存分配和管理与SQ WQE共用一套代码和接口。有差异的是结构体中每bit 的含义不一样。

6.2 RQ CQE 结构体

硬件收包后会写入 CQE(Completion Queue Element),结构如下:

struct hinic3_rq_cqe {
    u32 status;
    u32 vlan_len;
    u32 offload_type;
    u32 hash_val;
    u32 xid;
    u32 decrypt_info;
    u32 rsvd6;
    u32 pkt_info;
};

RQ WQE/CQE 结构框图

+-------------------+-------------------+-------------------+-------------------+
|   status (32b)    |  vlan_len (32b)   | offload_type (32b)|   hash_val (32b)  |
+-------------------+-------------------+-------------------+-------------------+
|    xid (32b)      | decrypt_info(32b) |   rsvd6 (32b)     |  pkt_info (32b)   |
+-------------------+-------------------+-------------------+-------------------+
主要字段说明
字段含义
status状态字段,包含校验和错误、LRO、RXDONE 等信息
vlan_len高 16 位为 VLAN Tag,低 16 位为包长度
offload_type硬件卸载类型,包含包类型、IP 类型、VLAN、RSS 等
hash_valRSS Hash 值
xid交换 ID
decrypt_info解密相关信息
pkt_info超级 CQE、包数、首包/尾包长度等

6.3 关键bit位与宏定义

1. offload_type 字段
字段位宽/偏移说明
PKT_TYPE[4:0]包类型
IP_TYPE[6:5]IP 类型
ENC_L3_TYPE[7]封装 L3 类型
TUNNEL_FMT[11:8]隧道包格式
PKT_UMBCAST[20:19]组播/广播
VLAN_EN[21]VLAN 有效
RSS_TYPE[31:24]RSS 类型

相关宏定义:

#define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_SHIFT 0
#define RQ_CQE_OFFOLAD_TYPE_IP_TYPE_SHIFT 5
#define RQ_CQE_OFFOLAD_TYPE_ENC_L3_TYPE_SHIFT 7
#define RQ_CQE_OFFOLAD_TYPE_TUNNEL_PKT_FORMAT_SHIFT 8
#define RQ_CQE_OFFOLAD_TYPE_PKT_UMBCAST_SHIFT 19
#define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_SHIFT 21
#define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_SHIFT 24

#define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_MASK 0x1FU
#define RQ_CQE_OFFOLAD_TYPE_IP_TYPE_MASK 0x3U
#define RQ_CQE_OFFOLAD_TYPE_ENC_L3_TYPE_MASK 0x1U
#define RQ_CQE_OFFOLAD_TYPE_TUNNEL_PKT_FORMAT_MASK 0xFU
#define RQ_CQE_OFFOLAD_TYPE_PKT_UMBCAST_MASK 0x3U
#define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_MASK 0x1U
#define RQ_CQE_OFFOLAD_TYPE_RSS_TYPE_MASK 0xFFU
2. vlan_len 字段
  • 高 16 位为 VLAN Tag,低 16 位为包长度。

相关宏定义:

#define RQ_CQE_SGE_VLAN_SHIFT 0
#define RQ_CQE_SGE_LEN_SHIFT 16

#define RQ_CQE_SGE_VLAN_MASK 0xFFFFU
#define RQ_CQE_SGE_LEN_MASK 0xFFFFU
3. status 字段
字段位宽/偏移说明
CSUM_ERR[15:0]校验和错误
NUM_LRO[23:16]LRO 包数
LRO_PUSH[25]LRO 推送
LRO_ENTER[26]LRO 进入
LRO_INTR[27]LRO 中断
FLUSH[28]Flush 标志
DECRY_PKT[29]解密包
BP_EN[30]BP 使能
RXDONE[31]收包完成

相关宏定义:

#define RQ_CQE_STATUS_CSUM_ERR_SHIFT 0
#define RQ_CQE_STATUS_NUM_LRO_SHIFT 16
#define RQ_CQE_STATUS_LRO_PUSH_SHIFT 25
#define RQ_CQE_STATUS_LRO_ENTER_SHIFT 26
#define RQ_CQE_STATUS_LRO_INTR_SHIFT 27

#define RQ_CQE_STATUS_BP_EN_SHIFT 30
#define RQ_CQE_STATUS_RXDONE_SHIFT 31
#define RQ_CQE_STATUS_DECRY_PKT_SHIFT 29
#define RQ_CQE_STATUS_FLUSH_SHIFT 28

#define RQ_CQE_STATUS_CSUM_ERR_MASK 0xFFFFU
#define RQ_CQE_STATUS_NUM_LRO_MASK 0xFFU
#define RQ_CQE_STATUS_LRO_PUSH_MASK 0X1U
#define RQ_CQE_STATUS_LRO_ENTER_MASK 0X1U
#define RQ_CQE_STATUS_LRO_INTR_MASK 0X1U
#define RQ_CQE_STATUS_BP_EN_MASK 0X1U
#define RQ_CQE_STATUS_RXDONE_MASK 0x1U
#define RQ_CQE_STATUS_FLUSH_MASK 0x1U
#define RQ_CQE_STATUS_DECRY_PKT_MASK 0x1U
4. pkt_info 字段
  • 超级 CQE、包数、首包/尾包长度等。

相关宏定义:

#define RQ_CQE_SUPER_CQE_EN_MASK 0x1
#define RQ_CQE_PKT_NUM_MASK 0x1FU
#define RQ_CQE_PKT_FIRST_LEN_MASK 0x1FFFU
#define RQ_CQE_PKT_LAST_LEN_MASK 0x1FFFU
5. decrypt_info 字段
  • 解密状态、ESP next header。

相关宏定义:

#define RQ_CQE_DECRY_INFO_DECRY_STATUS_SHIFT 8
#define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_SHIFT 0

#define RQ_CQE_DECRY_INFO_DECRY_STATUS_MASK 0xFFU
#define RQ_CQE_DECRY_INFO_ESP_NEXT_HEAD_MASK 0xFFU

6.4 RQ CQE 字段解析流程示例

static inline u32 hinic3_get_pkt_len_for_super_cqe(const struct hinic3_rq_cqe *cqe, bool last)
{
    u32 pkt_len = hinic3_hw_cpu32(cqe->pkt_info);

    if (!last)
        return RQ_CQE_PKT_LEN_GET(pkt_len, FIRST_LEN);
    else
        return RQ_CQE_PKT_LEN_GET(pkt_len, LAST_LEN);
}

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

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

相关文章

力扣HOT100之二分查找:4. 寻找两个正序数组的中位数

这道题如果没有时间复杂度的限制的话&#xff0c;相当好做&#xff0c;但是这道题要求时间复杂度为O(log(m n))&#xff0c;思路很难想&#xff0c;我看了一圈题解&#xff0c;发现华南溜达虎的视频讲得还不错&#xff0c;我是参考他的思路写出来的&#xff0c;这里把他的思路…

PyTorch——损失函数与反向传播(8)

Loss Functions 越小越好 L1loss MSELoss 损失函数 CrossEntyopyLoss 损失函数 import torch from torch.nn import L1Loss from torch import nn# 创建输入和目标张量&#xff0c;用于后续的损失计算 inputs torch.tensor([1,2,3],dtypetorch.float32) targets torch.tenso…

macOS 升级 bash 到最新版本

macOS 的默认「终端」&#xff0c;千年不变的版本。 》〉bash --version GNU bash, version 3.2.57(1)-release (arm64-apple-darwin24) Copyright (C) 2007 Free Software Foundation, Inc. 官方 bash.git - bash 已经将 bash 升级到了 5.2的大版本。 macOS 最新版系统的 ba…

力扣面试150题--课程表

Day 63 题目描述 做法 初次思路&#xff1a;本质就是将所有前置课程和后置课程作为一个有向图&#xff08;前者指向后者&#xff09;&#xff0c;判断这个图是否是一个有向无环图&#xff08;即是否存在拓扑排序&#xff09;&#xff08;本质做法是dfs&#xff09; 做法&…

用通俗的话解释下MCP是个啥?

在AI领域&#xff0c;模型的开发、部署和迭代速度日益加快&#xff0c;但随之而来的挑战也愈发显著&#xff1a;如何高效管理不同版本的模型&#xff1f;如何在复杂环境中确保模型的可追溯性和可复用性&#xff1f;如何实现跨团队、跨平台的模型协作&#xff1f; 在计算机领域…

LeetCode 高频 SQL 50 题(基础版)之 【子查询】· 上

题目&#xff1a;1978. 上级经理已离职的公司员工 题解&#xff1a; select employee_id from Employees where salary<30000 and manager_id is not null and manager_id not in (select distinct employee_id from Employees ) order by employee_id题目&#xff1a;626.…

Spark流水线+Gravitino+Marquez数据血缘采集

1.Openlinage和Marquez简介 1.1 OpenLineage 概述 OpenLineage 是一个开放标准和框架&#xff0c;用于跨工具、平台和系统捕获数据血缘信息。它定义了通用的数据血缘模型和API&#xff0c;允许不同的数据处理工具&#xff08;如ETL、调度器、数据仓库&#xff09;以标准化格…

基于微信小程序的车位共享平台的设计与实现源码数据库文档

摘 要 近年来&#xff0c;随着国民经济的飞速发展&#xff0c;城镇化进程的步伐加快&#xff0c;城市人口急剧增长&#xff0c;人们的生活水平持续改善&#xff0c;特别是大中型城市&#xff0c;城市的交通规模日益增大&#xff0c;汽车的保有量不断提高&#xff0c;然而城市的…

多模态大语言模型arxiv论文略读(111)

SEA: Supervised Embedding Alignment for Token-Level Visual-Textual Integration in MLLMs ➡️ 论文标题&#xff1a;SEA: Supervised Embedding Alignment for Token-Level Visual-Textual Integration in MLLMs ➡️ 论文作者&#xff1a;Yuanyang Yin, Yaqi Zhao, Yaji…

怎么让自己ip显示外省?一文说清操作

在互联网时代&#xff0c;IP地址不仅关联网络连接&#xff0c;还可能影响IP属地显示。那么&#xff0c;手机和电脑用户怎么让自己IP显示外省&#xff1f;一文说清操作要点。 ‌ 二、4种主流方法详解 要让自己的IP显示为外省地址&#xff0c;主要有以下几种方法&#xff1a; …

【Docker】容器安全之非root用户运行

【Docker】容器安全之非root用户运行 1. 场景2. 原 Dockerfile 内容3. 整改结果4. 非 root 用户带来的潜在问题4.1 文件夹读写权限异常4.2 验证文件夹权限 1. 场景 最近有个项目要交付&#xff0c;第三方测试对项目源码扫描后发现一个问题&#xff0c;服务的 Dockerfile 都未指…

汽车车载软件平台化项目规模颗粒度选择的一些探讨

汽车进入 SDV 时代后&#xff0c;车载软件研发呈现出开源生态构建、电子架构升级、基础软件标准化、本土供应链崛起、AI 原生架构普及、云边协同开发等趋势&#xff0c;这些趋势促使车载软件研发面临新挑战&#xff0c;如何构建适应这些变化的平台化架构成为车企与 Tier 1 的战…

【八股消消乐】构建微服务架构体系—服务注册与发现

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本专栏《八股消消乐》旨在记录个人所背的八股文&#xff0c;包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

掌握Git核心:版本控制、分支管理与远程操作

前言 无论热爱技术的阅读者你是希望掌握Git的企业级应用&#xff0c;能够深刻理解Git操作过程及操作原理&#xff0c;理解工作区暂存区、版本库的含义&#xff1b;还是想要掌握Git的版本、分支管理&#xff0c;自由的进行版本回退、撤销、修改等Git操作方式与背后原理和通过分…

c#,Powershell,mmsys.cpl,使用Win32 API展示音频设备属性对话框

常识&#xff08;基础&#xff09; 众所周知&#xff0c;mmsys.cpl使管理音频设备的控制面板小工具&#xff0c; 其能产生一个对话框&#xff08;属性表&#xff09;让我们查看和修改各设备的详细属性&#xff1a; 在音量合成器中单击音频输出设备的小图标也能实现这个效果&a…

STM标准库-TIM旋转编码器

文章目录 一、编码器接口1.1简介1.2正交编码器1.3编码器接口基本结构**1. 模块与 STM32 配置的映射关系****2. 设计实现步骤&#xff08;核心流程&#xff09;****① 硬件规划****② 时钟使能****③ GPIO 配置&#xff08;对应架构图 “GPIO” 模块&#xff09;****④ 时基单元…

【原创】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道

AI视频处理系统功能总览 &#x1f3af; 系统概述 这是一个智能短视频自动化处理系统&#xff0c;专门用于视频搬运和二次创作。系统支持多赛道配置&#xff0c;可以根据不同的内容类型&#xff08;如"外国人少系列"等&#xff09;应用不同的处理策略。 &#x1f3d…

C++----剖析list

前面学习了vector和string&#xff0c;接下来剖析stl中的list&#xff0c;在数据库中学习过&#xff0c;list逻辑上是连续的&#xff0c;但是存储中是分散的&#xff0c;这是与vector这种数组类型不同的地方。所以list中的元素设置为一个结构体&#xff0c;将list设计成双向的&…

纳米AI搜索与百度AI搜、豆包的核心差异解析

一、技术定位与设计目标 1、纳米AI搜索&#xff1a;轻量化边缘计算导向
专注于实时数据处理与资源受限环境下的高效响应&#xff0c;通过算法优化和模型压缩技术&#xff0c;实现在物联网设备、智能终端等低功耗场景的本地化部署。其核心优势在于减少云端依赖&#xff0c;保障…

不到 2 个月,OpenAI 火速用 Rust 重写 AI 编程工具。尤雨溪也觉得 Rust 香!

一、OpenAI 用 Rust 重写 Codex CLI OpenAI 已用 Rust 语言重写了其 AI 命令行编程工具 Codex CLI&#xff0c;理由是此举能提升性能和安全性&#xff0c;同时避免对 Node.js 的依赖。他们认为 Node.js “可能让部分用户感到沮丧或成为使用障碍”。 Codex 是一款实验性编程代理…