当前位置: 首页 > article >正文

CANN学习中心:AddCustom算子工程示例

完整示例AddCustom 算子工程【免费下载链接】cann-learning-hubCANN 学习中心仓支持在线互动运行、边学边练提供教程、示例与优化方案一站式助力昇腾开发者快速上手。项目地址: https://gitcode.com/cann/cann-learning-hub1. 创建算子原型定义文件add_custom.json:[{ op: AddCustom, input_desc: [ { name: x, param_type: required, format: [ND, ND], type: [float16, float] }, { name: y, param_type: required, format: [ND, ND], type: [float16, float] } ], output_desc: [ { name: z, param_type: required, format: [ND, ND], type: [float16, float] } ] }]2. 创建算子工程msopgen gen -i add_custom.json \ -c ai_core-ascend910b1 \ -lan cpp \ -out custom_op生成的目录结构:custom_op/ ├── framework/ ├── op_host/ │ ├── add_custom.cpp │ └── CMakeLists.txt ├── op_kernel/ │ ├── add_custom_tiling.h │ ├── add_custom.cpp │ └── CMakeLists.txt ├── CMakeLists.txt ├── CMakePresets.json └── build.sh3. Tiling 数据结构op_kernel/add_custom_tiling.h:#ifndef ADD_CUSTOM_TILING_H #define ADD_CUSTOM_TILING_H #include cstdint struct TilingData { uint32_t totalLength; uint32_t tileNum; }; #endif4. Host 侧实现op_host/add_custom.cpp:#include register/op_def_registry.h #include ../op_kernel/add_custom_tiling.h namespace optiling { static ge::graphStatus TilingFunc(gert::TilingContext *context) { uint32_t totalLength context-GetInputShape(0)-GetOriginShape().GetShapeSize(); context-SetBlockDim(8); TilingData *tiling context-GetTilingDataTilingData(); tiling-totalLength totalLength; tiling-tileNum 1; return ge::GRAPH_SUCCESS; } } // namespace optiling namespace ge { static graphStatus InferShape(gert::InferShapeContext *context) { const gert::Shape *inputShape context-GetInputShape(0); gert::Shape *outputShape context-GetOutputShape(0); *outputShape *inputShape; return GRAPH_SUCCESS; } static graphStatus InferDataType(gert::InferDataTypeContext *context) { context-SetOutputDataType(0, context-GetInputDataType(0)); return ge::GRAPH_SUCCESS; } } // namespace ge namespace ops { class AddCustom : public OpDef { public: explicit AddCustom(const char *name) : OpDef(name) { this-Input(x) .ParamType(REQUIRED) .DataType({ge::DT_FLOAT16, ge::DT_FLOAT}) .Format({ge::FORMAT_ND, ge::FORMAT_ND}); this-Input(y) .ParamType(REQUIRED) .DataType({ge::DT_FLOAT16, ge::DT_FLOAT}) .Format({ge::FORMAT_ND, ge::FORMAT_ND}); this-Output(z) .ParamType(REQUIRED) .DataType({ge::DT_FLOAT16, ge::DT_FLOAT}) .Format({ge::FORMAT_ND, ge::FORMAT_ND}); this-SetInferShape(ge::InferShape) .SetInferDataType(ge::InferDataType); this-AICore() .SetTiling(optiling::TilingFunc) .AddConfig(ascend910b); } }; OP_ADD(AddCustom); } // namespace ops5. Kernel 侧实现op_kernel/add_custom.cpp:#include kernel_operator.h #include add_custom_tiling.h constexpr int32_t BUFFER_NUM 1; template class dtypeX, class dtypeY, class dtypeZ class KernelAdd { public: __aicore__ inline void Init( GM_ADDR x, GM_ADDR y, GM_ADDR z, uint32_t totalLength, uint32_t tileNum) { this-blockLength totalLength / AscendC::GetBlockNum(); this-tileNum tileNum; this-tileLength this-blockLength / tileNum / BUFFER_NUM; xGm.SetGlobalBuffer((__gm__ dtypeX *)x this-blockLength * AscendC::GetBlockIdx(), this-blockLength); yGm.SetGlobalBuffer((__gm__ dtypeY *)y this-blockLength * AscendC::GetBlockIdx(), this-blockLength); zGm.SetGlobalBuffer((__gm__ dtypeZ *)z this-blockLength * AscendC::GetBlockIdx(), this-blockLength); pipe.InitBuffer(inQueueX, BUFFER_NUM, this-tileLength * sizeof(dtypeX)); pipe.InitBuffer(inQueueY, BUFFER_NUM, this-tileLength * sizeof(dtypeY)); pipe.InitBuffer(outQueueZ, BUFFER_NUM, this-tileLength * sizeof(dtypeZ)); } __aicore__ inline void Process() { int32_t loopCount this-tileNum * BUFFER_NUM; for (int32_t i 0; i loopCount; i) { CopyIn(i); Compute(i); CopyOut(i); } } private: __aicore__ inline void CopyIn(int32_t progress) { AscendC::LocalTensordtypeX xLocal inQueueX.AllocTensordtypeX(); AscendC::LocalTensordtypeY yLocal inQueueY.AllocTensordtypeY(); AscendC::DataCopy(xLocal, xGm[progress * this-tileLength], this-tileLength); AscendC::DataCopy(yLocal, yGm[progress * this-tileLength], this-tileLength); inQueueX.EnQue(xLocal); inQueueY.EnQue(yLocal); } __aicore__ inline void Compute(int32_t progress) { AscendC::LocalTensordtypeX xLocal inQueueX.DeQuedtypeX(); AscendC::LocalTensordtypeY yLocal inQueueY.DeQuedtypeY(); AscendC::LocalTensordtypeZ zLocal outQueueZ.AllocTensordtypeZ(); AscendC::Add(zLocal, xLocal, yLocal, this-tileLength); outQueueZ.EnQuedtypeZ(zLocal); inQueueX.FreeTensor(xLocal); inQueueY.FreeTensor(yLocal); } __aicore__ inline void CopyOut(int32_t progress) { AscendC::LocalTensordtypeZ zLocal outQueueZ.DeQuedtypeZ(); AscendC::DataCopy(zGm[progress * this-tileLength], zLocal, this-tileLength); outQueueZ.FreeTensor(zLocal); } private: AscendC::TPipe pipe; AscendC::TQueAscendC::TPosition::VECIN, BUFFER_NUM inQueueX; AscendC::TQueAscendC::TPosition::VECIN, BUFFER_NUM inQueueY; AscendC::TQueAscendC::TPosition::VECOUT, BUFFER_NUM outQueueZ; AscendC::GlobalTensordtypeX xGm; AscendC::GlobalTensordtypeY yGm; AscendC::GlobalTensordtypeZ zGm; uint32_t blockLength; uint32_t tileNum; uint32_t tileLength; }; extern C __global__ __aicore__ void add_custom( GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling) { REGISTER_TILING_DEFAULT(TilingData); GET_TILING_DATA_WITH_STRUCT(TilingData, tiling_data, tiling); KernelAddDTYPE_X, DTYPE_Y, DTYPE_Z op; op.Init(x, y, z, tiling_data.totalLength, tiling_data.tileNum); op.Process(); }6. 编译安装# 编译 cd custom_op bash build.sh # 安装 ./build_out/custom_opp_*.run --install-path${HOME}/ # 设置环境 source ${HOME}/vendors/customize/bin/set_env.bash7. 测试代码test/main.cpp:#include algorithm #include cstdint #include iostream #include vector #include acl/acl.h #include aclnn_add_custom.h // 自动生成的头文件 #define SUCCESS 0 #define FAILED 1 #define CHECK_RET(cond, return_expr) \ do { \ if (!(cond)) { \ return_expr; \ } \ } while (0) #define LOG_PRINT(message, ...) \ do { \ printf(message, ##__VA_ARGS__); \ } while (0) int64_t GetShapeSize(const std::vectorint64_t shape) { int64_t shapeSize 1; for (auto i : shape) { shapeSize * i; } return shapeSize; } int Init(int32_t deviceId, aclrtStream *stream) { auto ret aclInit(nullptr); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclInit failed. ERROR: %d\n, ret); return FAILED); ret aclrtSetDevice(deviceId); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSetDevice failed. ERROR: %d\n, ret); return FAILED); ret aclrtCreateStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtCreateStream failed. ERROR: %d\n, ret); return FAILED); return SUCCESS; } template 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, LOG_PRINT(aclrtMalloc failed. ERROR: %d\n, ret); return FAILED); ret aclrtMemcpy(*deviceAddr, size, hostData.data(), size, ACL_MEMCPY_HOST_TO_DEVICE); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtMemcpy failed. ERROR: %d\n, ret); return FAILED); *tensor aclCreateTensor(shape.data(), shape.size(), dataType, nullptr, 0, aclFormat::ACL_FORMAT_ND, shape.data(), shape.size(), *deviceAddr); return SUCCESS; } void DestroyResources(std::vectorvoid * tensors, std::vectorvoid * deviceAddrs, aclrtStream stream, int32_t deviceId, void *workspaceAddr nullptr) { for (uint32_t i 0; i tensors.size(); i) { if (tensors[i] ! nullptr) { aclDestroyTensor(reinterpret_castaclTensor *(tensors[i])); } if (deviceAddrs[i] ! nullptr) { aclrtFree(deviceAddrs[i]); } } if (workspaceAddr ! nullptr) { aclrtFree(workspaceAddr); } aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); } int main(int argc, char **argv) { // 1. 初始化设备和 stream int32_t deviceId 0; aclrtStream stream; auto ret Init(deviceId, stream); CHECK_RET(ret 0, LOG_PRINT(Init acl failed. ERROR: %d\n, ret); return FAILED); // 2. 创建输入输出张量 std::vectorint64_t inputXShape {8, 2048}; std::vectorint64_t inputYShape {8, 2048}; std::vectorint64_t outputZShape {8, 2048}; void *inputXDeviceAddr nullptr; void *inputYDeviceAddr nullptr; void *outputZDeviceAddr nullptr; aclTensor *inputX nullptr; aclTensor *inputY nullptr; aclTensor *outputZ nullptr; // 准备 host 数据 std::vectoraclFloat16 inputXHostData(inputXShape[0] * inputXShape[1]); std::vectoraclFloat16 inputYHostData(inputYShape[0] * inputYShape[1]); std::vectoraclFloat16 outputZHostData(outputZShape[0] * outputZShape[1]); for (int i 0; i inputXShape[0] * inputXShape[1]; i) { inputXHostData[i] aclFloatToFloat16(1.0); inputYHostData[i] aclFloatToFloat16(2.0); outputZHostData[i] aclFloatToFloat16(0.0); } std::vectorvoid * tensors {inputX, inputY, outputZ}; std::vectorvoid * deviceAddrs {inputXDeviceAddr, inputYDeviceAddr, outputZDeviceAddr}; // 创建 aclTensor ret CreateAclTensor(inputXHostData, inputXShape, inputXDeviceAddr, aclDataType::ACL_FLOAT16, inputX); CHECK_RET(ret ACL_SUCCESS, DestroyResources(tensors, deviceAddrs, stream, deviceId); return FAILED); ret CreateAclTensor(inputYHostData, inputYShape, inputYDeviceAddr, aclDataType::ACL_FLOAT16, inputY); CHECK_RET(ret ACL_SUCCESS, DestroyResources(tensors, deviceAddrs, stream, deviceId); return FAILED); ret CreateAclTensor(outputZHostData, outputZShape, outputZDeviceAddr, aclDataType::ACL_FLOAT16, outputZ); CHECK_RET(ret ACL_SUCCESS, DestroyResources(tensors, deviceAddrs, stream, deviceId); return FAILED); // 3. 调用算子 API二段式 uint64_t workspaceSize 0; aclOpExecutor *executor; // 第一段获取 workspace 大小 ret aclnnAddCustomGetWorkspaceSize(inputX, inputY, outputZ, workspaceSize, executor); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnAddCustomGetWorkspaceSize failed. ERROR: %d\n, ret); DestroyResources(tensors, deviceAddrs, stream, deviceId); return FAILED); // 分配 workspace void *workspaceAddr nullptr; if (workspaceSize 0) { ret aclrtMalloc(workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(allocate workspace failed. ERROR: %d\n, ret); DestroyResources(tensors, deviceAddrs, stream, deviceId, workspaceAddr); return FAILED); } // 第二段执行算子 ret aclnnAddCustom(workspaceAddr, workspaceSize, executor, stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclnnAddCustom failed. ERROR: %d\n, ret); DestroyResources(tensors, deviceAddrs, stream, deviceId, workspaceAddr); return FAILED); // 4. 同步等待 ret aclrtSynchronizeStream(stream); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(aclrtSynchronizeStream failed. ERROR: %d\n, ret); DestroyResources(tensors, deviceAddrs, stream, deviceId, workspaceAddr); return FAILED); // 5. 获取输出结果 auto size GetShapeSize(outputZShape); std::vectoraclFloat16 resultData(size, 0); ret aclrtMemcpy(resultData.data(), resultData.size() * sizeof(resultData[0]), outputZDeviceAddr, size * sizeof(aclFloat16), ACL_MEMCPY_DEVICE_TO_HOST); CHECK_RET(ret ACL_SUCCESS, LOG_PRINT(copy result failed. ERROR: %d\n, ret); DestroyResources(tensors, deviceAddrs, stream, deviceId, workspaceAddr); return FAILED); // 6. 销毁资源 DestroyResources(tensors, deviceAddrs, stream, deviceId, workspaceAddr); // 7. 验证结果 std::vectoraclFloat16 goldenData(size, aclFloatToFloat16(3.0)); LOG_PRINT(result is:\n); for (int64_t i 0; i 10; i) { LOG_PRINT(%.1f , aclFloat16ToFloat(resultData[i])); } LOG_PRINT(\n); if (std::equal(resultData.begin(), resultData.end(), goldenData.begin())) { LOG_PRINT(test pass\n); } else { LOG_PRINT(test failed\n); return FAILED; } return SUCCESS; }8. 编译运行测试# 编译测试代码 g -I$ASCEND_TOOLKIT_HOME/include \ -I${HOME}/vendors/customize/op_api/include \ -L$ASCEND_TOOLKIT_HOME/lib64 \ -L${HOME}/vendors/customize/op_api/lib \ test/main.cpp \ -lcust_opapi -lnnopbase -lacl_rt \ -o test_add # 运行测试 source ${HOME}/vendors/customize/bin/set_env.bash ./test_add预期输出:result is: 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.0 test pass【免费下载链接】cann-learning-hubCANN 学习中心仓支持在线互动运行、边学边练提供教程、示例与优化方案一站式助力昇腾开发者快速上手。项目地址: https://gitcode.com/cann/cann-learning-hub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

CANN学习中心:AddCustom算子工程示例

完整示例:AddCustom 算子工程 【免费下载链接】cann-learning-hub CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。 项目地址: https://gitcode.com/cann/cann-learning-…...

2025届必备的五大降重复率网站解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 将文本里的AIGC痕迹予以降格处理,其关键环节在于对AI所具备的规律性表达予以破除…...

CANN/社区安全发布指南

版本发布网络安全质量要求 【免费下载链接】community 本项目是CANN开源社区的核心管理仓库,包含社区的治理章程、治理组织、通用操作指引及流程规范等基础信息 项目地址: https://gitcode.com/cann/community 为保障版本网络安全质量,版本发布前…...

在Node.js后端服务中集成Taotoken实现多模型智能对话功能

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Node.js后端服务中集成Taotoken实现多模型智能对话功能 为Node.js后端服务添加智能对话能力,是现代应用开发中的常见…...

CANN/pypto设置Pass优化参数

pypto.set_pass_options 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 产品支持情况 产品是否支持Atlas A3 训练系列产品/Atlas A3 推理系列产…...

考PMP别乱报!双官方认证考试中心,合规有保障!

在PMP报考过程中,最核心的风险点在于机构资质。一旦误选非官方授权的机构,可能导致35小时培训证明不被认可、报名被驳回,甚至影响后续证书续期。而“双官方认证”是规避这些风险的根本保障。 才聚是国内少数同时持有PMI(美国项目管…...

CANN驱动带外通道状态查询

dcmi_get_device_outband_channel_state 【免费下载链接】driver 本项目是CANN提供的驱动模块,实现基础驱动和资源管理及调度等功能,使能昇腾芯片。 项目地址: https://gitcode.com/cann/driver 函数原型 int dcmi_get_device_outband_channel_s…...

CANN Cumsum算子测试题

决赛题目:Cumsum 算子测试用例设计 【免费下载链接】cann-competitions 本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。 项目地址: https://gitcode.com/cann/cann-competitions 任务说明 本题目要求参赛者为 CA…...

AI/ML学习持久性研究:社会归属感与职业信心的双重引擎效应

1. 项目概述:为什么我们要关心“学生持久性”? 在机器学习与人工智能这个炙手可热的领域,我们常常被顶尖会议的论文、刷榜的模型、高薪的职位所吸引。然而,一个容易被忽视却至关重要的问题是:那些满怀热情踏入这个领域…...

可视化后台轻松维护PC管理系统

一、概述总结蘑菇云响应式企业官网是基于微擎框架开发的 PC 端企业官网搭建系统,支持响应式布局、独立域名绑定、可视化内容管理,可快速搭建适配多终端的企业官方网站。系统具备官方正品保障、源码加密安全稳定,配备产品管理、新闻资讯、在线…...

Snowflake DATEADD函数实战指南:时间计算、性能优化与跨时区处理

1. 为什么 DATEADD 是 Snowflake 里最值得你花时间吃透的函数之一在 Snowflake 实际项目里跑过上百个调度任务、处理过 TB 级时序数据、给金融客户搭过三年滚动预测模型之后,我越来越确信一件事:DATEADD 不是“又一个日期函数”,而是你 SQL 能…...

4G无线RS485/232对传模块:远程数传,赋能智慧园区升级

4G无线RS485/232模块有效解决传统有线方案在老旧园区改造、设备分散区域的数据采集与设备控制难题,适用于智慧园区的建设和改造。 4G无线RS485/232对传模块完全可以用在智慧园区,而且是智慧园区物联网组网的常用核心设备。一、核心适配逻辑 智慧园区里大…...

SQL Server UPDATE JOIN 实战指南:高效安全的跨表更新技术

1. 项目概述:为什么 UPDATE JOIN 是 SQL Server 里最常被低估的“数据缝合术”在真实业务场景里,数据库从来不是一张张孤立的表格,而是一张张彼此咬合的齿轮。你刚在客户表里把王建国的邮箱从wangold.com改成wangnew.com,销售系统…...

通过curl命令直接测试taotoken大模型api的完整步骤

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令直接测试Taotoken大模型API的完整步骤 对于开发者而言,在集成或调试初期,直接使用curl命令测试…...

【3D】VTK教程:在Qt界面上加载3D画面

1、配置渲染环境 QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());在执行 QApplication app(argc, argv); 之前调用该接口,否则 Qt 可能已使用默认格式创建窗口,导致设置无效 QSurfaceFormat:是 Qt 中描述 OpenGL 渲染表面属性的类,包含OpenG…...

MoE与边缘AI融合:重塑元宇宙实时内容生成新范式

1. 项目概述:当MoE遇见边缘AI,元宇宙内容生成的新引擎最近和几个做游戏和数字孪生的朋友聊天,大家普遍在头疼一个问题:元宇宙内容的生产效率。无论是构建一个沉浸式的虚拟空间,还是为AR眼镜实时生成个性化的街景导航信…...

MoE、多模态与AGI:生成式AI的范式转移与核心技术融合

1. 项目概述:一场正在发生的范式转移最近和几位在头部大厂做预训练模型的朋友聊天,大家不约而同地都在讨论几个词:MoE、多模态、AGI。这感觉就像几年前大家言必称Transformer一样,整个生成式AI的研究风向,正在经历一场…...

AI算法黑箱的法律归责挑战:从技术原理到责任鸿沟

1. 项目概述:当算法成为“黑箱”,法律如何追责?在过去的几年里,从自动驾驶汽车做出紧急避让决策,到银行信贷系统自动拒绝贷款申请,再到像ChatGPT这样的生成式AI创造出令人惊讶的文本和图像,人工…...

cann/sip AsumOperation示例

信号处理加速库AsumOperation C Demo 【免费下载链接】sip 本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库,基于华为Ascend AI处理器,专门为信号处理领域而设计。 项目地址: https://gitcode.com/cann/sip 介绍 该目录下为信号处理…...

CANN基础设施OAT使用指南

OAT开源审查工具 【免费下载链接】infrastructure 本仓库用于托管CANN社区基础设施团队的公开信息,包括不限于:会议日程,成员信息,服务文档和配置等信息 项目地址: https://gitcode.com/cann/infrastructure 目的 本文档旨…...

竞品分析(结合完美日记 × 花西子报告)

作为初学者,结合文档分析每一步的作用,先讲清楚概念,并附上完美日记和花西子的例子,帮助大家理解竞品分析(结合完美日记 花西子报告)一、分析目的没有目的的分析是瞎看,先定目标才能决定看什么…...

JAVA同城上门做饭系统家政上门同城服务系统源码小程序+APP+公众号+h5

一、系统架构总览与业务背景1.1 上门做饭系统业务场景分析上门做饭系统是一种创新的O2O生活服务平台,连接专业厨师与有烹饪需求的用户。系统核心业务包括:用户端App(下单、支付、评价)、厨师端App(接单、路线规划、服务…...

数据智能前沿:从过程分析到可信AI的跨学科研究与实践

1. 团队概览与核心研究方向在数据科学和人工智能领域,一个研究团队的深度和广度往往决定了其能否在基础理论与产业应用之间架起坚实的桥梁。今天要聊的,是围绕澳大利亚麦考瑞大学(Macquarie University)计算学院为核心&#xff0c…...

基于MCP协议构建AI助手与Google Docs的无缝集成方案

1. 项目概述:为AI助手打通Google Docs的“任督二脉” 如果你和我一样,日常重度依赖Google Docs来撰写技术文档、会议纪要或项目规划,同时又希望AI助手(比如Cursor或Claude Desktop)能直接读取、分析甚至帮你修改这些文…...

OpenSpeedy终极指南:5分钟掌握免费开源游戏变速技巧

OpenSpeedy终极指南:5分钟掌握免费开源游戏变速技巧 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy OpenSpeedy是一款专为Windows玩家设计的免费开源游戏加速工具…...

AI与数字孪生如何重塑智慧港口:从数据感知到元宇宙交互的实践

1. 项目概述:当港口遇见AI与元宇宙港口,这个连接全球贸易的古老节点,正在经历一场静默但深刻的革命。如果你还认为港口只是吊机、集装箱和拖车的简单组合,那可能已经落后于这个时代了。今天,我想以一个全球标杆——釜山…...

CANN/ops-rand贡献指南

贡献指南 【免费下载链接】ops-rand ops-rand是CANN (Compute Architecture for Neural Networks)算子库中提供的随机数生成库。 项目地址: https://gitcode.com/cann/ops-rand 本项目欢迎广大开发者体验并参与贡献,在参与社区贡献之前…...

CANN/xla-npu 示例指南

样例运行验证 【免费下载链接】xla-npu XLA-NPU 是一个面向华为昇腾NPU硬件的 XLA后端实现。本项目通过接入OpenXLA/XLA开源项目,将XLA开源生态与华为 CANN软件栈集成,对接JAX框架。JAX框架运行时可以直接加载XLA-NPU,使得基于JAX框架开发的模…...

电脑加密怎么设置?分享五个电脑加密小技巧,新手也能学会

在数字化办公时代,电脑里存储的不仅是文档,更是企业的核心资产。无论是个人隐私保护还是企业防泄密,掌握几种实用的加密方法都至关重要。今天分享五个加密小技巧,简单易懂,即学即用。方法一:利用洞察眼MIT系…...

B端后台工作台企业版ui设计

✅:资深设计师,擅长UI,UX,动效,三维模型制作等全能设计师; ✅:小红薯可搜 七瑞视觉设计; ✅:高质量/高要求/高性价/完美主义; ✅:合作(z63390681...