CUDA到CANN迁移:异构计算范式转变与算子转换实战
1. 项目概述从CUDA到CANN的迁移一场深刻的范式转变最近在折腾一个挺有意思的项目核心是把一堆原本跑在NVIDIA GPU上的CUDA代码迁移到华为的昇腾AI处理器上用CANNCompute Architecture for Neural Networks这套异构计算架构来跑。这个项目标题叫“CANN/cannbot-skills CUDA迁移规则模式”听起来有点拗口但说白了就是总结一套从CUDA生态“搬家”到CANN生态的“套路”或“模式”。这活儿我干过不少从早期的摸索到现在的体系化踩过的坑、总结的经验今天想系统地聊聊。为什么这事儿重要随着AI算力需求爆炸式增长和硬件平台的多元化单一依赖CUDA的“舒适区”正在被打破。很多团队手里有成熟的CUDA代码资产可能是训练框架的算子、高性能计算库或者是特定的加速应用。当业务需要扩展到昇腾平台时重写成本太高直接运行又不可能这时候一套清晰、可复用的迁移规则就成了救命稻草。这个“cannbot-skills”项目我理解就是一个承载这些迁移规则、工具和最佳实践的“技能包”或“工具箱”。它要解决的绝不仅仅是语法替换而是从编程模型、内存管理、执行调度到精度调优等一系列深层差异的适配。适合谁来关注如果你是一名AI框架开发者、高性能计算工程师、或者正在负责将AI应用从N卡平台向华为昇腾Ascend平台移植那么这篇文章就是为你准备的。即使你现在还没开始迁移了解这些差异和模式也能让你在编写新的CUDA代码时更有前瞻性写出更“便携”的代码。接下来我会拆解整个迁移过程中的核心思路、关键技术点、实操步骤以及那些文档里不会写的“坑”。2. 迁移的核心思路与范式差异解析迁移不是简单的“翻译”而是深刻理解两套体系的设计哲学后进行的“转译”和“重构”。CUDA和CANN代表了两种不同的异构计算范式。2.1 编程模型从线程层次结构到任务流图CUDA的编程模型大家很熟悉了它围绕一个层次化的线程组织展开Grid - Block - Thread。你写的核函数Kernel会被成千上万个线程执行通过threadIdx,blockIdx这些内置变量来索引数据。它的思维模式是“数据并行”和“细粒度控制”程序员需要显式地管理线程间的同步如__syncthreads()和通信。而CANN的编程模型更偏向于“任务图”和“异步流水线”。它的核心抽象是计算任务Task和数据流。你通过AscendCLAscend Computing Language接口将算子Operator组织成一个计算图Graph然后提交给运行时Runtime去调度执行。昇腾芯片如Ascend 910/310内部有强大的任务调度器和硬件执行单元程序员的工作更多是定义“要做什么”算子及其依赖关系而不是“具体怎么做”每个线程干什么。这是一种更高层次的抽象。迁移时的核心转变你需要将CUDA Kernel中“每个线程做什么”的逻辑重新组织为CANN中“每个算子做什么”。原来在一个Kernel里通过线程ID分支处理的不同情况现在可能需要拆分成多个串联或并联的算子。例如一个复杂的元素级操作后接一个归约操作在CUDA里可能写在一个Kernel里用共享内存优化在CANN里更典型的做法是先用一个Element-wise算子再调用一个Reduce算子。2.2 内存模型从统一虚拟地址到物理内存管理CUDA提供了统一虚拟地址UVA使得主机CPU和设备GPU内存在一个统一的地址空间中配合托管内存Managed Memory可以简化编程。但其底层仍然是离散的物理内存显式拷贝cudaMemcpy对于性能关键路径依然重要。CANN的内存模型更为显式。它严格区分了HostCPU内存和Device昇腾芯片内存。数据在两者之间的移动必须通过AscendCL接口明确指定。更重要的是CANN引入了“内存池”和“内存复用”的概念。为了极致性能尤其是在动态形状或流式处理场景下预先申请和复用设备内存块是常见做法。这与CUDA中习惯的cudaMalloc/cudaFree的按需分配模式有显著区别。迁移时的关键动作识别内存生命周期仔细分析原CUDA代码中每个数据缓冲区的分配、使用、释放时机。设计内存复用策略对于中间临时缓冲区考虑在Graph级别或应用级别进行内存复用减少动态分配的开销。显式管理数据流将隐式的cudaMemcpy调用替换为AscendCL中明确的数据传输接口如aclrtMemcpy并合理安排异步操作。2.3 执行模型从即时执行到图编译与执行CUDA的执行基本是“即时”的调用核函数立即在流Stream中排队执行。动态性很强但调度开销相对较大。CANN推崇“图执行”模式。你先构建一个计算图其中包含了算子及其依赖。然后编译这个图这是一个相对耗时的过程生成一个高效的、硬件友好的执行计划。最后可以反复执行这个已编译的图输入数据即可。这种模式对于计算结构固定、需要反复执行的场景如模型推理性能极高因为调度开销被前置的编译过程消除了。迁移模式选择图模式Graph Mode适用于算子固定、流程确定的场景如大多数神经网络的前向推理。这是CANN的主推和高性能模式。单算子模式Single-Operator Mode适用于动态性极强的场景或者作为迁移初期的调试手段。但性能通常不如图模式。迁移时我们应优先考虑将CUDA的多个Kernel调用序列组合成一个CANN计算图。这需要对原计算流程进行静态化分析将动态条件如循环次数可变尽可能转化为图内的控制流算子如IfWhile。3. 实操迁移从CUDA Kernel到CANN算子的转换规则这是最核心的实操部分。我们不可能为每个CUDA Kernel手动重写一个等价的昇腾算子那样成本无法承受。因此需要建立一套规则化的转换模式。3.1 模式一直接映射——利用内置算子库许多基础的、标准的计算操作在CANN的算子库如GEMM、Convolution、Element-wise operations中都有高度优化的实现。第一步永远是查找CANN算子库。操作流程解析CUDA Kernel功能明确该Kernel完成的数学计算是什么例如矩阵乘、向量加法、ReLU激活。查询CANN算子清单查阅AscendCL API文档或算子支持列表寻找功能匹配的算子。接口适配将CUDA Kernel的参数指针、维度、步长等映射到CANN算子的输入输出张量描述符Tensor Desc和属性上。示例向量加法CUDAvector_add_kernelgrid, block(d_a, d_b, d_c, n);CANN 使用aclopCreateTensorDesc创建输入输出TensorDesc然后调用aclopInferShape和aclopExecuteV2执行内置的Add算子。注意事项内置算子的性能通常远优于手写代码应优先使用。但需要注意算子的精度FP16, FP32, INT8和数据格式NCHW, NHWC是否完全符合你的要求。3.2 模式二组合替换——用多个内置算子拼接当单个CUDA Kernel实现的功能较为复杂没有直接对应的内置算子时可以尝试将其分解为多个标准算子的组合。操作流程功能分解将复杂Kernel的计算步骤拆解。例如一个计算sigmoid(x) * log(y)的Kernel可以拆成Sigmoid、Log和Mul三个步骤。构建计算子图使用AscendCL接口按顺序创建这三个算子并正确连接它们的输入输出。优化中间内存这种模式会产生中间结果。需要评估是否可以将这些中间结果设置为临时Tensor或者利用内存复用技术避免不必要的存储。实操心得 这种模式的关键在于平衡性能与便利性。过多的算子拆分会增加内核启动开销和图调度开销。如果拆解后的算子序列是固定的那么将它们封装成一个自定义算子见模式三可能是更好的选择。在迁移初期为了快速验证功能组合模式是非常有效的。3.3 模式三自定义算子——TIK C/C编程对于性能极其关键、或者算法极其特殊、无法用现有算子组合实现的功能就必须走自定义算子Custom Operator的道路。CANN提供了TIKTensor Iterator KernelC和TIK C两种编程方式。TIK C vs TIK CTIK C更底层更接近硬件指令需要对昇腾芯片的架构如Cube Unit, Vector Unit有较深理解能榨取极限性能。TIK C基于C的模板库提供了更高层次的抽象如张量切片、迭代器编程更友好但性能可能略逊于精心优化的TIK C。迁移开发步骤算子分析详细分析原CUDA Kernel的数据访问模式连续、间隔、广播、计算类型标量、向量、矩阵和并行度。设计数据切块Tiling根据昇腾AI处理器的内存层次Global Memory, L1/L2 Buffer, Unified Buffer设计数据搬运策略。这与CUDA的共享内存使用思路类似但具体硬件参数不同。编写核函数使用TIK API编写计算逻辑。你需要将CUDA中基于threadIdx的并行循环转化为TIK中基于block_idx和data_idx的循环并利用vec_xxx等向量化指令。编译与部署使用ATCAscend Tensor Compiler工具将TIK代码编译成昇腾芯片可执行的二进制文件.o文件并封装成自定义算子插件。一个典型的“坑” CUDA中习惯使用float进行单精度计算。在昇腾上为了充分发挥算力很多计算单元如Cube Unit对FP16半精度有更高的吞吐。在自定义算子时需要仔细评估精度要求。如果允许将部分计算转换为FP16可以带来显著的性能提升但这可能引入精度损失需要测试验证。3.4 模式四第三方库迁移——寻找替代或重实现很多CUDA代码依赖了cuBLAS、cuDNN、cuFFT等第三方库。CANN生态提供了对应的实现数学库CANN提供了aclblas类似cuBLAS和aclnn神经网络算子库。通信库替代NCCL的是华为的HCCLHuawei Collective Communication Library用于多卡通信。其他库对于没有直接替代的库如某些特定的cuSPARSE函数可能需要基于CANN的基础算子重新实现其功能。迁移策略接口兼容层如果原有代码对CUDA库调用封装良好可以考虑编写一个薄薄的适配层将cublasGemmEx调用转发到aclblasGemmEx。这能最小化业务代码改动。功能验证切换库后必须进行严格的数值一致性测试。不同库的底层实现算法可能不同即使遵循同一标准在边界条件或精度上也可能有细微差异。4. 工程实践与调试技巧实录理论规则清楚了真正动手时会遇到一堆具体问题。分享几个实战中总结的要点。4.1 环境配置与工具链迁移开发环境通常包含x86开发机用于编码和编译 昇腾设备用于运行调试。确保你的CANN Toolkit版本、驱动版本、固件版本匹配。一个常见错误是Toolkit版本高于设备侧运行时的版本导致编译出的算子无法运行。工具使用ATC编译器用于将自定义算子或ONNX模型编译成om模型。熟悉其--input_shape、--output_type等参数对于处理动态形状至关重要。msprofiler性能分析工具类似于NVIDIA的nsight。用于分析算子的执行时间、内存拷贝开销、AI Core和AI CPU的利用率是性能调优的利器。Ascend-DMI设备管理接口工具可以查看芯片的详细状态、温度、功耗和错误信息。4.2 精度问题调试从CUDA迁移到CANN即使数学公式一样计算结果也可能有微小差异。这源于计算顺序并行计算中浮点数加法的结合律不成立求和顺序不同会导致结果不同。底层实现三角函数如sin、exp等超越函数的实现算法不同在尾数精度上可能有差异。精度模式昇腾芯片支持FP16、FP32、混合精度等。如果部分计算被自动降为FP16累积误差会变化。调试方法分层对比不要一次性迁移整个应用。先迁移一个最简单的算子与CUDA结果对比。使用相对误差abs(a-b) / (abs(a)abs(b)eps)而非绝对误差判断。精度溯源开启算子的调试模式输出中间结果。或者在自定义算子中强制使用FP32进行计算排除FP16的影响。设置误差容忍度在测试框架中针对不同的操作设置合理的误差容忍范围。例如矩阵乘法的误差可以比逐元素操作稍大。4.3 性能调优要点功能正确后下一步就是追求性能。性能瓶颈可能出现在数据搬运Host与Device之间的数据拷贝H2D/D2H是巨大的开销。尽可能减少拷贝次数和数量使用异步拷贝重叠计算。内存带宽昇腾芯片有独立的内存体系。优化数据排布如将NCHW转为更适合计算的格式、利用连续访问、避免Bank Conflict在TIK C编程中类似CUDA共享内存的问题是关键。计算资源利用率使用msprofiler查看AI Core的利用率。如果利用率低可能是任务粒度不均衡某些算子计算量太小无法填满硬件。内存瓶颈计算单元在等待数据。依赖关系过紧算子间串行依赖严重无法流水并行。调优技巧图融合利用ATC的图融合优化能力将多个小算子自动融合成一个更大的算子减少内核启动开销和中间内存读写。流水线并行对于处理流式数据的应用构建多级流水线使数据准备、计算、结果回传同时进行。内存池预热在应用启动阶段预先分配好所需的各种尺寸的内存块在运行期直接复用避免动态分配延迟。4.4 常见错误与排查表错误现象可能原因排查步骤ACL_ERROR_RT_FEATURE_NOT_SUPPORT设备能力不支持如算子要求的AI Core算力版本高于当前芯片1. 检查芯片型号Ascend 310P? 910B?。2. 检查算子编译时指定的soc_version是否与设备匹配。ACL_ERROR_RT_INVALID_DEVICEID设备ID无效1. 调用aclrtSetDevice或aclrtGetDevice检查设备ID范围。2. 确认设备是否被其他进程独占占用。图执行报错但单算子模式正常计算图中算子间的Tensor形状推导错误或内存冲突1. 使用aclrtMalloc分配内存时检查大小是否足够。2. 使用aclopInferShape接口预先推理每个算子的输出形状确保前后匹配。3. 检查是否存在同一块内存既作为输入又作为输出的情况原地操作这在图模式下需要特殊声明。自定义算子性能远低于预期数据切块策略不佳或内存访问模式低效1. 使用msprofiler分析算子的内存吞吐和计算单元利用率。2. 检查Global Memory访问是否连续是否合并。3. 调整Tiling大小使其与硬件计算单元如Cube的16x16矩阵对齐。多线程/多进程下资源冲突AscendCL上下文、流、内存管理在多线程环境下需谨慎1. 确保每个线程使用独立的aclrtContext和aclrtStream。2. 避免跨线程直接传递或释放由另一线程创建的ACL资源如aclrtMem。3. 考虑使用线程池管理计算任务。5. 迁移策略与项目管理建议对于一个大中型项目全盘迁移不可能一蹴而就。需要一个渐进式的策略。5.1 渐进式迁移路径评估与选型首先对现有CUDA代码库进行盘点识别出核心的、计算密集的模块。使用性能分析工具如nvprof找出热点Kernel。优先迁移这些热点。搭建双跑框架设计一个框架使得同一份输入数据既能走原有的CUDA路径也能走新的CANN路径。在关键节点对比结果和性能确保功能正确和性能达标。分模块替换以模块为单位进行迁移、测试和集成。一个模块稳定后再切入下一个。回归测试建立完善的自动化测试集包括单元测试针对单个算子、集成测试针对计算图和端到端测试针对整个应用。每次迁移后都进行回归。5.2 代码结构设计为了长期维护和可能的跨平台支持建议对计算核心进行抽象// 伪代码示例计算后端抽象 class ComputeBackend { public: virtual Tensor add(const Tensor a, const Tensor b) 0; virtual Tensor matmul(const Tensor a, const Tensor b) 0; // ... 其他算子 }; class CUDABackend : public ComputeBackend { ... }; class CANNBackend : public ComputeBackend { ... }; // 应用中通过工厂或配置选择后端 std::unique_ptrComputeBackend backend create_backend(CANN); auto result backend-matmul(input_a, input_b);这样业务逻辑与底层硬件加速实现解耦未来适配新的硬件平台如其他AI芯片也会更容易。5.3 团队技能培养迁移不仅是技术活也是对人的挑战。团队需要补充以下知识昇腾硬件架构基础了解DaVinci Core、Memory Hierarchy。AscendCL编程掌握基本的资源管理、算子调用、图构建API。TIK基础至少有一小部分人能进行自定义算子开发。性能分析工具团队需要有人能熟练使用msprofiler等工具进行深度性能剖析。从CUDA到CANN的迁移是一个从“线程级编程”思维转向“任务图级编程”思维的过程。初期会感到束缚但一旦适应了这种声明式的、以数据流为中心的编程范式并能结合图编译优化和强大的内置算子库往往能在昇腾硬件上获得非常可观的性能收益。这个过程最忌讳的是“硬翻译”而是要多思考“在CANN的范式下这个问题的最佳表达方式是什么”。多利用社区资源多阅读官方的最佳实践能少走很多弯路。最后保持耐心严谨测试迁移之路虽有关隘但终点值得期待。

相关新闻

Python Minifier完全指南:如何将Python代码压缩到极致?

Python Minifier完全指南:如何将Python代码压缩到极致?

Python Minifier完全指南:如何将Python代码压缩到极致? 【免费下载链接】python-minifier Transform Python source code into its most compact representation 项目地址: https://gitcode.com/gh_mirrors/py/python-minifier Python Minifier是…

2026/8/3 23:29:24 阅读更多 →
PyTorch_CIFAR10完全指南:预训练模型如何革新图像分类任务

PyTorch_CIFAR10完全指南:预训练模型如何革新图像分类任务

PyTorch_CIFAR10完全指南:预训练模型如何革新图像分类任务 【免费下载链接】PyTorch_CIFAR10 Pretrained TorchVision models on CIFAR10 dataset (with weights) 项目地址: https://gitcode.com/gh_mirrors/py/PyTorch_CIFAR10 PyTorch_CIFAR10是一个基于Py…

2026/8/3 23:29:24 阅读更多 →
如何使用VsCode Live Server++提升前端开发效率:完整入门指南

如何使用VsCode Live Server++提升前端开发效率:完整入门指南

如何使用VsCode Live Server提升前端开发效率:完整入门指南 【免费下载链接】vscode-live-server-plus-plus VsCode Live Server : Its Truly Live 😊 (BETA) -- [NOT RELEASED YET] 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-live-server-…

2026/8/3 23:29:24 阅读更多 →

最新新闻

如何快速掌握网盘直链下载助手:普通用户的高速下载终极指南

如何快速掌握网盘直链下载助手:普通用户的高速下载终极指南

如何快速掌握网盘直链下载助手:普通用户的高速下载终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…

2026/8/4 0:08:42 阅读更多 →
25岁转行网络安全工程师:技能树与学习路径

25岁转行网络安全工程师:技能树与学习路径

1. 25岁转行网络安全工程师的可行性分析25岁转行网络安全工程师不仅完全来得及,甚至可以说是黄金年龄。这个阶段你既保留了学习新知识的能力,又比应届生多了几分社会阅历和工作经验。网络安全行业最大的特点就是"英雄不问出处",技术…

2026/8/4 0:08:42 阅读更多 →
如何在3分钟内搭建个人B站视频下载器:解锁4K大会员和充电专属内容

如何在3分钟内搭建个人B站视频下载器:解锁4K大会员和充电专属内容

如何在3分钟内搭建个人B站视频下载器:解锁4K大会员和充电专属内容 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否曾…

2026/8/4 0:08:42 阅读更多 →
UE4SS终极指南:无需源码的Unreal Engine游戏修改平台

UE4SS终极指南:无需源码的Unreal Engine游戏修改平台

UE4SS终极指南:无需源码的Unreal Engine游戏修改平台 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4SS …

2026/8/4 0:08:42 阅读更多 →
5分钟完成QQ空间历史数据备份:GetQzonehistory完整解决方案

5分钟完成QQ空间历史数据备份:GetQzonehistory完整解决方案

5分钟完成QQ空间历史数据备份:GetQzonehistory完整解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾担心QQ空间里的珍贵回忆会随着时间流逝而消失&#xff1…

2026/8/4 0:08:42 阅读更多 →
国家中小学智慧教育平台电子课本下载终极方案:三步免费获取PDF教材

国家中小学智慧教育平台电子课本下载终极方案:三步免费获取PDF教材

国家中小学智慧教育平台电子课本下载终极方案:三步免费获取PDF教材 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。…

2026/8/4 0:07:42 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →