CANN ops-math NotEqual 算子全解析:NPU 上的逐元素不等于比较实现与调用指南
CANN ops-math NotEqual 算子全解析NPU 上的逐元素不等于比较实现与调用指南【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-math导读NotEqual 是 CANN ops-math 数学算子库中负责逐元素比较两个张量是否不相等的二元逻辑算子对两个输入张量逐元素执行x1 ! x2输出布尔BOOL张量。本文以 math/not_equal/README.md 为核心结合该目录下的算子定义、构图原型、tiling/kernel 实现与测试用例系统讲解 NotEqual 的产品支持范围、计算公式、参数约束、aclnn 单算子 API 与图模式两种调用方式并深入剖析其底层计算链路帮助开发者在 Ascend NPU 上正确、高效地使用该算子。产品支持情况NotEqual 算子对不同硬件产品的支持情况如下表所示与 math/not_equal/README.md 保持一致产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品×Atlas 推理系列产品√Atlas 训练系列产品√从源码配置可以印证这一支持矩阵op_host/not_equal_def.cpp 中为算子注册了ascend950与ascend350两个 AICore 配置并且存在 op_host/config/ascend950/not_equal_binary.json 与 op_host/config/ascend350/not_equal_binary.json 两份不同昇腾平台的二进制配置清单说明算子主要面向 950 系列与 A3arch35系列产品交付。同时目录中还提供 op_kernel_aicpu/not_equal_aicpu.cpp 的 AICPU 实现为不支持场景或其他执行路径提供兜底能力。功能说明与计算公式NotEqual 的算子功能为逐元素比较两个输入张量是否不相等。对于两个输入张量 x1、x2输出 y 的计算公式为$$ \text{y}i \begin{cases} True,\text{if }x{i, 1} \ne x_{i,2} \ False,\text{otherwise} \end{cases} $$即对应位置元素不相等时输出True相等时输出False。输出张量 y 的每个元素为布尔值BOOL 类型因此该算子天然适合作为掩码mask生成、条件过滤、梯度保护等场景的基础构件。在 op_graph/not_equal_proto.h 的算子原型注释中明确将其描述为 Returns the truth value of (x1 ! x2) element-wise. Support broadcasting operations.并注明与 TensorFlow 框架的NotEqual算子兼容。参数说明NotEqual 算子的核心参数如下表所示信息来自 math/not_equal/README.md 参数说明参数名输入/输出/属性描述数据类型数据格式x1输入公式中的输入 x1DOUBLE、FLOAT16、FLOAT、BFLOAT16、INT64、INT32、INT8、UINT8、BOOL、INT16、COMPLEX64、COMPLEX128、UINT64NDx2输入公式中的输入 x2DOUBLE、FLOAT16、FLOAT、BFLOAT16、INT64、INT32、INT8、UINT8、BOOL、INT16、COMPLEX64、COMPLEX128、UINT64NDy输出公式中的 yBOOLND参数使用要点数据类型推导x1 与 x2 的数据类型必须满足 数据类型推导规则两者类型需要一致或可推导。这一约束在 tiling 实现中有硬性校验见 op_host/arch35/not_equal_tiling_arch35.cpp 的DoOpTiling当x1与x2的DataType不一致时会直接返回GRAPH_FAILED并打印 The dtypes of x1 and x2 must be the same。shape 广播x1 与 x2 的 shape 需要满足 broadcast 关系。输出 y 的 shape 为 x1 与 x2 广播后的 shape形状推导复用通用广播逻辑见 op_host/not_equal_infershape.cpp 中InferShape4NotEqual调用Ops::Base::InferShape4Broadcast(context)。数据格式输入输出均为 ND 格式支持 0-8 维张量支持非连续 Tensor见下文 aclnn 接口参数表。确定性计算aclnnNeTensor / aclnnInplaceNeTensor 默认是确定性实现见 math/not_equal/docs/aclnnNeTensoraclnnInplaceNeTensor.md 的约束说明。调用说明NotEqual 算子支持两种调用方式对应目录下的两个调用样例调用方式调用样例说明aclnn 调用test_aclnn_ne_tensor.cpp通过 aclnnNeTensor / aclnnInplaceNeTensor 接口调用 NotEqual 算子图模式调用test_geir_not_equal.cpp通过 算子 IR 构图方式调用 NotEqual 算子此外同一算子目录下还提供标量比较变体 aclnnNeScalar / aclnnInplaceNeScalar 以及逻辑异或接口aclnnLogicalXor对应 op_api/aclnn_logical_xor.h说明该模块围绕比较语义构建了一组完整 API 家族。方式一aclnn 单算子 API 调用两段式接口aclnn 方式遵循 CANN 通用的 两段式接口 范式即每个算子拆分为两个接口第一段接口aclnnNeTensorGetWorkspaceSize完成入参校验并根据计算流程计算出本次调用所需的 workspace 大小第二段接口aclnnNeTensor使用第一段接口返回的 workspace 与 executor 真正执行计算。函数原型定义见 op_api/aclnn_ne_tensor.haclnnStatus aclnnNeTensorGetWorkspaceSize( const aclTensor *self, const aclTensor *other, aclTensor *out, uint64_t *workspaceSize, aclOpExecutor **executor); aclnnStatus aclnnNeTensor( void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream);其中self输入NPU Device 侧的 aclTensor即公式中的 x1other输入NPU Device 侧的 aclTensor即公式中的 x2out输出NPU Device 侧的 aclTensor输出 BOOL 类型结果workspaceSize输出需要在 Device 侧申请的 workspace 临时内存大小executor输出op 执行器封装了算子计算流程由第一段接口生成供第二段接口使用workspace输入在 Device 侧申请的 workspace 内存起始地址stream输入指定执行任务的 aclrtStream 流。注意第二段接口aclnnNeTensor(...)不可重复调用重复调用同一 executor 会出现异常。同一场景需重新走一遍第一段 → 申请 workspace → 第二段流程。入参校验与错误码第一段接口完成入参校验出现以下场景时返回对应错误码错误码详细说明参见 aclnn 返回码返回值错误码描述ACLNN_ERR_PARAM_NULLPTR161001传入的 self、other、out 是空指针时ACLNN_ERR_PARAM_INVALID161002self、other 或 out 的数据类型不在支持范围之内时ACLNN_ERR_PARAM_INVALID161002self、other 或 out 的维度大于 8 时ACLNN_ERR_PARAM_INVALID161002self 和 other 的数据类型无法进行推导时ACLNN_ERR_PARAM_INVALID161002self 和 other 的 shape 无法进行 broadcast 时ACLNN_ERR_PARAM_INVALID161002out 的 shape 与 broadcast 后的 shape 不一致时接口参数详表aclnnNeTensorGetWorkspaceSize完整参数说明摘自 math/not_equal/docs/aclnnNeTensoraclnnInplaceNeTensor.md参数名输入/输出描述使用说明数据类型数据格式维度(shape)非连续TensorselfaclTensor*输入公式中的 self数据类型需要与 other 满足数据类型推导规则shape 需要与 other 满足 broadcast 关系DOUBLE、FLOAT16、FLOAT、BFLOAT16、INT64、INT32、INT8、UINT8、BOOL、INT16、COMPLEX64、COMPLEX128、UINT64ND0-8√otheraclTensor*输入公式中的 other数据类型需要与 self 满足数据类型推导规则shape 需要与 self 满足 broadcast 关系DOUBLE、FLOAT16、FLOAT、BFLOAT16、INT64、INT32、INT8、UINT8、BOOL、INT16、COMPLEX64、COMPLEX128、UINT64ND0-8√outaclTensor*输出公式中的 out数据类型需要是 BOOL 可转换的数据类型shape 为 self 与 other 广播后的 shapeDOUBLE、FLOAT16、FLOAT、BFLOAT16、INT64、INT32、INT8、UINT8、BOOL、INT16、COMPLEX64、COMPLEX128、UINT64、UINT32、UINT16ND0-8√workspaceSizeuint64_t*输出返回需要在 Device 侧申请的 workspace 大小-----executoraclOpExecutor**输出返回 op 执行器包含了算子计算流程-----Inplace 变体aclnnInplaceNeTensoraclnnNeTensor与aclnnInplaceNeTensor实现相同功能区别在于aclnnNeTensor需新建一个输出张量对象存储计算结果aclnnInplaceNeTensor无需新建输出张量对象直接在输入张量 selfRef 的内存中存储计算结果原地更新。aclnnStatus aclnnInplaceNeTensorGetWorkspaceSize( aclTensor *selfRef, const aclTensor *other, uint64_t *workspaceSize, aclOpExecutor **executor); aclnnStatus aclnnInplaceNeTensor( void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream);Inplace 接口的计算公式为selfRef_i (selfRef_i ! other_i) ? 1 : 0。需要注意inplace 场景下selfRef同时是输入与输出因此要求 broadcast 后的 shape 必须等于 selfRef 自身的 shape否则第一段接口会返回ACLNN_ERR_PARAM_INVALID161002。完整 aclnn 调用示例仓库提供了可直接编译运行的完整示例 examples/test_aclnn_ne_tensor.cpp核心流程拆解如下第一步初始化 ACL 环境固定写法int Init(int32_t deviceId, aclrtStream* stream) { auto ret aclInit(nullptr); CHECK_RET(ret ACL_SUCCESS, ...); ret aclrtSetDevice(deviceId); CHECK_RET(ret ACL_SUCCESS, ...); ret aclrtCreateStream(stream); CHECK_RET(ret ACL_SUCCESS, ...); return 0; }第二步构造输入与输出 aclTensor通过aclrtMalloc申请 Device 侧内存aclrtMemcpy将 Host 数据拷贝到 Device再调用aclCreateTensor创建 aclTensorND 格式、连续 stridestemplate typename T int CreateAclTensor(const std::vectorT hostData, const std::vectorint64_t shape, void** deviceAddr, aclDataType dataType, aclTensor** tensor) { auto size GetShapeSize(shape) * sizeof(T); auto ret aclrtMalloc(deviceAddr, size, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, ...); ret aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE); CHECK_RET(ret ACL_SUCCESS, ...); // 计算连续 tensor 的 strides std::vectorint64_t strides(shape.size(), 1); for (int64_t i shape.size() - 2; i 0; i--) { strides[i] shape[i 1] * strides[i 1]; } *tensor aclCreateTensor(shape.data(), shape.size(), dataType, strides.data(), 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), *deviceAddr); return 0; }第三步两段式调用 aclnnNeTensoruint64_t workspaceSize 0; aclOpExecutor* executor; // 第一段计算 workspace 大小 ret aclnnNeTensorGetWorkspaceSize(self, other, out, workspaceSize, executor); CHECK_RET(ret ACL_SUCCESS, ...); // 按需申请 workspace 内存 void* workspaceAddr nullptr; if (workspaceSize 0) { ret aclrtMalloc(workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, ...); } // 第二段执行计算 ret aclnnNeTensor(workspaceAddr, workspaceSize, executor, stream); CHECK_RET(ret ACL_SUCCESS, ...); // 同步等待任务执行结束 ret aclrtSynchronizeStream(stream); CHECK_RET(ret ACL_SUCCESS, ...);第四步结果回拷与资源释放将 Device 侧输出通过aclrtMemcpyACL_MEMCPY_DEVICE_TO_HOST拷贝回 Host 并打印随后依次aclDestroyTensor、aclrtFree、aclrtDestroyStream、aclrtResetDevice、aclFinalize完成资源清理。示例中使用的输入数据为self {0,1,2,3,4,5,6,7}、other {1,1,1,2,2,2,3,3}shape 均为{4,2}读者可自行推导输出验证逻辑正确性。若需同时体验 inplace 变体可参考同一文档 aclnnNeTensoraclnnInplaceNeTensor.md 中test aclnnInplaceNeTensor部分将self直接作为selfRef传入注意重新申请 workspace 前需先释放上一轮申请的 workspace避免内存泄漏。示例编译与运行的整体流程可参考 编译与运行样例。方式二图模式GEIR调用图模式通过算子 IR 构图方式调用 NotEqual对应示例 examples/test_geir_not_equal.cpp 与算子原型 op_graph/not_equal_proto.h。算子原型使用REG_OP宏注册输入为两个RealNumberType类型 Tensorx1、x2输出为DT_BOOL类型 TensorREG_OP(NotEqual) .INPUT(x1, TensorType::RealNumberType()) .INPUT(x2, TensorType::RealNumberType()) .OUTPUT(y, TensorType({DT_BOOL})) .OP_END_FACTORY_REG(NotEqual)图模式示例的核心构图逻辑见CreateOppInGraph// 自定义代码添加单算子定义到图中 auto notequalop op::NotEqual(notequalop); std::vectorint64_t xShape {4, 4}; ADD_INPUT(1, x1, inDtype, xShape); // 通过 op::Data 创建占位输入并挂到算子 x1 输入 ADD_INPUT(2, x2, inDtype, xShape); // 通过 op::Data 创建占位输入并挂到算子 x2 输入 ADD_OUTPUT(1, y, DT_BOOL, xShape); // 声明输出 desc outputs.push_back(notequalop);随后通过graph.SetInputs(inputs).SetOutputs(outputs)绑定图输入输出创建ge::Sessionsession-AddGraph(graph_id, graph, graph_options)添加计算图session-RunGraph(graph_id, input, output)执行最后调用aclgrphDumpGraph可将构图结果 dump 成文本便于调试。全局初始化使用ge::GEInitialize示例传入ge.exec.deviceId0、ge.graphRunMode1收尾调用ge::GEFinalize。另外framework/not_equal_tf_plugin.cpp 展示了框架层适配方式通过REGISTER_CUSTOM_OP(NotEqual).FrameworkType(TENSORFLOW).OriginOpType(NotEqual)将 TensorFlow 的NotEqual算子映射到本实现这也是其与 TF 框架兼容见 proto 注释的底层机制。源码级原理从算子定义到 NPU 计算算子定义层OpDefop_host/not_equal_def.cpp 中完成了 NotEqual 的完整定义注册输入 x1、x2 支持DT_BF16 / DT_FLOAT16 / DT_FLOAT / DT_INT8 / DT_UINT8 / DT_INT32 / DT_INT64 / DT_UINT64 / DT_BOOL九种数据类型注意实际 AICore 二进制支持范围以 op_host/config/ascend950/not_equal_binary.json 等配置文件为准COMPLEX/UINT32 等扩展类型主要由 aclnn 接口层覆盖输出 y 恒为DT_BOOL输入输出格式均为FORMAT_NDAICore 配置开启DynamicCompileStaticFlag(true)、DynamicRankSupportFlag(true)、DynamicShapeSupportFlag(true)、PrecisionReduceFlag(true)并注册ascend950、ascend350两个平台的核函数入口not_equal_apt。形状推导层op_host/not_equal_infershape.cpp 将 shape 推导委托给通用广播工具Ops::Base::InferShape4Broadcast即输出 shape broadcast(x1.shape, x2.shape)与 README 及 aclnn 文档中关于 broadcast 关系的描述完全一致。Tiling 层op_host/arch35/not_equal_tiling_arch35.cpp 的DoOpTiling按输入数据类型分派到对应的模板实例DT_INT64→NotEqualComputeint64_tDT_INT32→NotEqualComputeint32_tDT_FLOAT16 / DT_BF16→NotEqualComputehalfDT_FLOAT→NotEqualComputefloatDT_UINT8→NotEqualComputeuint8_tDT_INT8 / DT_BOOL→NotEqualComputeint8_tDT_UINT64→NotEqualComputeuint64_t所有分支统一调用BroadcastBaseTiling...::DoTiling()完成基于广播语义的切分tiling并校验 x1 与 x2 数据类型必须一致。Kernel 计算层核函数入口在 op_kernel/not_equal_apt.cpp通过BroadcastSchschMode, OpDag sch(tiling); sch.Process(x1, x2, y);驱动计算。实际计算图DAG定义在 op_kernel/arch35/not_equal_dag.h// 通过 Compute 构造计算图 using ConstOne MAKE_CONST(uint8_t, 1); using ConstZero MAKE_CONST(uint8_t, 0); using InputX1 BindVec::CopyInBrcT, Placeholder::In0T; using InputX2 BindVec::CopyInBrcT, Placeholder::In1T; using DataOne BindVec::Duplicateuint8_t, ConstOne; using DataZero BindVec::Duplicateuint8_t, ConstZero; using CompareMask BindVec::Compareuint8_t, T, CMP_MODE, InputX1, InputX2; using SelectRes BindVec::Selectuint8_t, uint8_t, SELECT_MODE, CompareMask, DataOne, DataZero; using OpCopyOut BindVec::CopyOutuint8_t, Placeholder::Out0uint8_t, SelectRes; using Outputs ElemsOpCopyOut; using MemCfg MemOptCfgMemLevel::LEVEL_2; using OpDag DAGSchOutputs, void, MemCfg;从 DAG 结构可以清晰还原 NotEqual 的计算语义两个输入经CopyInBrc带广播的搬运读入 →Vec::Compare比较模式CMP_MODE5即不等于生成比较掩码 →Vec::Select选择模式SELECT_MODE2依据掩码在常量1True与0False之间选择 →CopyOut以uint8_tBOOL 存储形态写出。对于 BOOL 类型输入kernel 会先将其转换为int8_t参与比较见not_equal_apt.cpp中的特判分支。MemCfg MemOptCfgMemLevel::LEVEL_2表明该计算图针对 L2 内存层级做了访存优化。测试与质量保障单元测试tests/ut/覆盖 aclnn 接口层test_aclnn_neTensor.cpp、test_aclnn_neScalar.cpp、test_aclnn_inplace_neTensor.cpp、test_logical_xor.cpp等、host 层 infershapetest_not_equal_infershape.cpp、arch35 tilingtest_not_equal_tiling_arch35.cpp以及 AICPU kerneltest_not_equal.cpp。以test_aclnn_neTensor.cpp为例分别构造 INT8、UINT8、INT32 等多种数据类型输入并断言GetWorkspaceSize返回ACL_SUCCESS验证了接口层对不同 dtype 的支持。系统测试tests/st/atk_aclnnNeTensor.json以torch.ne为对标接口aclnn_name: NeTensor配置 bool 类型输入、high_precision精度标准说明该算子与 PyTorchtorch.ne语义对齐arch35/ttk_kernel_not_equal_st.csv为 arch35 平台的 kernel 级系统测试用例。典型使用场景与注意事项掩码生成NotEqual 常用于生成哪些位置需要处理的布尔掩码例如判断label ! 0、input ! padding_value等输出可直接用于后续MaskedFill、条件选择等算子。broadcast 语义利用 x1 与 x2 之间的广播关系可以用标量扩展方式实现张量与常量比较例如[4,2]张量与[2]向量比较输出 shape 自动广播为[4,2]。数据类型一致性x1 与 x2 类型必须一致或满足推导规则tiling 层会硬校验不同类型请先用 Cast 算子对齐。inplace 语义限制aclnnInplaceNeTensor要求广播后的 shape 等于 selfRef 的 shape否则报错 161002。两段式接口规范第二段接口不可重复调用每次调用前先通过第一段接口获取新的 workspaceSize 与 executor。平台差异Atlas 200I/500 A2 推理产品不支持该算子开发前请先确认目标硬件的支持情况参见产品支持情况表。参考资料NotEqual 算子 READMEaclnnNeTensor aclnnInplaceNeTensor 接口文档aclnnNeScalar aclnnInplaceNeScalar 接口文档aclnn 调用示例图模式调用示例算子 IR 原型两段式接口说明数据类型推导规则broadcast 关系aclnn 返回码【免费下载链接】ops-math本项目是CANN提供的数学类基础计算算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-math创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TensorFlow-Course 开源教程仓库全指南:从环境安装到 CNN 分类器的完整学习路径

TensorFlow-Course 开源教程仓库全指南:从环境安装到 CNN 分类器的完整学习路径

教程深度学习机器学习 【免费下载链接】TensorFlow-Course :satellite: Simple and ready-to-use tutorials for TensorFlow 项目地址: https://gitcode.com/gh_mirrors/te/TensorFlow-Course 点击查看 免费下载 TensorFlow-Course 是一个以“简单、即拿即用”为核…

2026/9/21 16:15:17 阅读更多 →
使用 browser-harness 绕过携程(ctrip)反爬门:酒店列表与价格的浏览器自动化抓取实战

使用 browser-harness 绕过携程(ctrip)反爬门:酒店列表与价格的浏览器自动化抓取实战

浏览器控制GUI 自动化AI Agent人工智能MCP 服务AI 技能 【免费下载链接】browser-harness Browser Harness | Self-healing harness that enables LLMs to complete any task. 项目地址: https://gitcode.com/gh_mirrors/br/browser-harness 点击查看 免费下载 本文…

2026/9/21 16:15:17 阅读更多 →
TOAST UI Editor 工具栏定制完全指南:从默认选项到自定义按钮与状态联动

TOAST UI Editor 工具栏定制完全指南:从默认选项到自定义按钮与状态联动

TOAST UI Editor 工具栏定制完全指南:从默认选项到自定义按钮与状态联动 【免费下载链接】tui.editor 🍞📝 Markdown WYSIWYG Editor. GFM Standard Chart & UML Extensible. 项目地址: https://gitcode.com/gh_mirrors/tu/tui.editor…

2026/9/21 16:15:17 阅读更多 →

最新新闻

Presto Exchange Materialization 实战指南:以物化 Shuffle 突破 MPP 内存瓶颈

Presto Exchange Materialization 实战指南:以物化 Shuffle 突破 MPP 内存瓶颈

大数据数据库后端 【免费下载链接】presto The official home of the Presto distributed SQL query engine for big data 项目地址: https://gitcode.com/gh_mirrors/pre/presto 点击查看 免费下载 Exchange Materialization 是 Presto 为内存密集型查询提供的一种…

2026/9/21 16:39:36 阅读更多 →
MCP Python SDK 服务端订阅机制全解析:从 `subscriptions/listen` 到跨进程扩展

MCP Python SDK 服务端订阅机制全解析:从 `subscriptions/listen` 到跨进程扩展

人工智能MCP 服务MCP Clients 【免费下载链接】python-sdk The official Python SDK for Model Context Protocol servers and clients 项目地址: https://gitcode.com/gh_mirrors/pythonsd/python-sdk 点击查看 免费下载 本篇文章以 Model Context Protocol 官方 …

2026/9/21 16:39:36 阅读更多 →
Cluster Scorecard: [Seed Keyword]

Cluster Scorecard: [Seed Keyword]

【免费下载链接】claude-seo Universal SEO skill for Claude Code. 25 sub-skills 18 sub-agents covering technical SEO, E-E-A-T, schema, GEO/AEO, backlinks, local SEO, maps intelligence, semantic clustering, e-commerce SEO, international SEO, Google APIs, and…

2026/9/21 16:39:36 阅读更多 →
Diem Swiss Knife 实战指南:BCS 序列化交易生成、签名与验证命令行工具

Diem Swiss Knife 实战指南:BCS 序列化交易生成、签名与验证命令行工具

Diem Swiss Knife 实战指南:BCS 序列化交易生成、签名与验证命令行工具 【免费下载链接】diem Diem’s mission is to build a trusted and innovative financial network that empowers people and businesses around the world. 项目地址: https://gitcode.com/…

2026/9/21 16:39:36 阅读更多 →
easy-vibe 跨平台开发技术全景:React Native / Flutter / Electron / Tauri 架构流派与选型实战指南

easy-vibe 跨平台开发技术全景:React Native / Flutter / Electron / Tauri 架构流派与选型实战指南

教程文档 【免费下载链接】easy-vibe 从 0 到 1 学会 vibe coding,项目制学习 项目地址: https://gitcode.com/datawhalechina/easy-vibe 点击查看 免费下载 "Write once, run anywhere"(一次编写,处处运行&#xff09…

2026/9/21 16:39:36 阅读更多 →
VitePress 自定义主题完全指南:从零构建、分发与消费自己的主题

VitePress 自定义主题完全指南:从零构建、分发与消费自己的主题

前端文档 【免费下载链接】vitepress Vite & Vue powered static site generator. 项目地址: https://gitcode.com/gh_mirrors/vi/vitepress 点击查看 免费下载 VitePress 默认主题开箱即用,但当你需要完全掌控站点的外观与交互时,自定义…

2026/9/21 16:38:36 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →