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

CANN Runtime进程间通信

# 进程间通信【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime由某个主机线程创建的任意设备内存、Event资源或Notify资源都可以在同一进程内被该进程中的其他线程直接引用。但这些指针或句柄在进程之外是无效的因此不能被其他进程的线程直接使用。若要在不同进程之间共享设备内存、Event资源或Notify资源需要应用程序使用Runtime提供的进程间通信相关API以实现如下典型场景由一个主进程生成一批输入数据并将这些数据提供给多个从属进程使用而无需在每个进程中重新生成或复制数据。不同资源涉及的IPCInter-Process Communication接口不同可查看下文中的调用示例。需要注意的是通过aclrtMalloc接口分配设备内存时出于性能考虑可能会从更大的底层内存块中切分出来。在这种情况下IPC接口会检查共享内存是否页表对齐若未对齐API将拦截并报错以防止跨进程多映射内存导致的信息泄露风险。因此建议使用aclrtMalloc接口根据内存分配规则申请内存。申请不同类型的内存时其页表大小会有所不同普通页内存的页表大小为4K大页内存的页表大小支持2M或1G。进程间共享内存此处以A进程内存出借方、B进程内存借入方为例说明两个进程间的内存共享接口调用流程以下为A、B进程之间共享内存的示例代码不可以直接拷贝编译运行仅供参考。完整样例代码请参见Link。在A进程中分配内存生成共享keyuint keyLen 65; char[keyLen] key; void *ptrA nullptr; aclrtSetDevice(0); // 进程A使用Device 0 aclrtMalloc(ptrA, size); aclrtIpcMemGetExportKey(ptrA, size, key, keyLen, ACL_RT_IPC_MEM_EXPORT_FLAG_DISABLE_PID_VALIDATION); // 跨进程通信交换key以写文件方式交互) writeFile(file/ipc_mem, key, keyLen); // 对共享内存进行读写操作 ...... // 待共享内存使用完成后借出方关闭IPC共享内存 aclrtIpcMemClose(key); aclrtFree(ptrA); aclrtResetDeviceForce(0);在B进程中通过共享key导入共享内存uint keyLen 65; char[keyLen] key; void *ptrB; // 跨进程通信交换key以写文件方式交互) readFile(file/ipc_mem, key, keyLen); aclrtSetDevice(1); // 进程B使用Device 1 // AB进程使用不同的Device导入共享内存访问要开启两个Device之间的数据交互 aclrtIpcMemImportByKey(ptrB, key, ACL_RT_IPC_MEM_IMPORT_FLAG_ENABLE_PEER_ACCESS); // 对ptrB内存读写操作 ...... // 使用完成后借入方关闭IPC共享内存 aclrtIpcMemClose(key); aclrtResetDeviceForce(1);进程间共享Event进程之间通过共享Event可以实现进程间的事件同步。此处以A进程创建Event共享给B进程为例说明两个进程间任务同步的示例代码不可以直接拷贝编译运行仅供参考。在A进程中创建Event生成共享handleaclrtEvent event; aclrtStream stream; aclrtIpcEventHandle handle; aclrtSetDevice(0); // 进程A使用Device 0 aclrtCreateEventExWithFlag(event, ACL_EVENT_IPC); // 创建IPC Event aclrtCreateStream(stream); // 创建Stream // 导出进程间共享handle aclrtIpcGetEventHandle(event, handle); // 跨进程通信交换key以写文件方式交互) writeFile(file/ipc_event, handle, ACL_IPC_EVENT_HANDLE_SIZE); // 下发record任务 aclrtEventRecord(event, stream); // Event使用完, 销毁共享Event aclrtDestroyEvent(event); aclrtResetDeviceForce(0);在B进程中通过共享handle导入共享EventaclrtStream stream; aclrtEvent event; aclrtIpcEventHandle handle; aclrtCreateStream(stream); // 创建Stream // 跨进程获取共享handle以写文件方式交互) readFile(file/ipc_event, handle, ACL_IPC_EVENT_HANDLE_SIZE); aclrtSetDevice(1); //进程B使用Device 1 // 导入handle返回共享event // AB进程使用不同的Device aclrtIpcOpenEventHandle(handle, event); // 下发wait任务 aclrtStreamWaitEvent(stream, event); // 同步Stream上的任务 aclrtSynchonizeStream(stream); // Event使用完销毁共享Event aclrtDestroyEvent(event); aclrtResetDeviceForce(1);进程间共享Notify进程之间通过共享Notify可以实现进程间的通知。此处以A进程创建Notify共享给B进程为例说明两个进程间任务同步的示例代码不可以直接拷贝编译运行仅供参考。完整样例代码请参见Link。注意创建端会分配Notify硬件资源因此只能由创建端硬件进行Wait。为此共享Notify有使用约束只能在创建端调aclrtNotifyWait进行Wait不能在共享端Wait。在A进程中创建Notify生成共享keyuint keyLen 65; char key[keyLen]; aclrtNotify notify; aclrtStream stream; // 进程A使用Device 0 aclrtSetDevice(0); aclrtCreateStream(stream); aclrtNotifyCreate(notify); // 导出key即Notify共享名称 aclrtNotifyGetExportKey(notify, key, keyLen, ACL_RT_NOTIFY_EXPORT_FLAG_DISABLE_PID_VALIDATION); // 跨进程通信交换key以写文件方式交互) writeFile(file/ipc_notify, key, keyLen); // 下发wait任务 aclrtNotifyWait(notify, stream); // Notify使用完, 销毁共享Notify aclrtNotifyDestroy(notify); aclrtResetDeviceForce(0);在B进程中通过共享key导入共享Notifyuint keyLen 65; char key[keyLen]; aclrtNotify notify; aclrtStream stream; // 跨进程通信交换key以写文件方式交互) readFile(file/ipc_notify, key, keyLen); //进程B使用Device 1 aclrtSetDevice(1); aclrtCreateStream(stream); // 导入key返回共享Notify // AB进程使用不同的Device导入共享Notify要开启两个Device之间的数据交互 aclrtNotifyImportByKey(notify, key, ACL_RT_NOTIFY_IMPORT_FLAG_ENABLE_PEER_ACCESS); // 下发record任务 aclrtNotifyRecord (notify, stream); // Notify使用完销毁共享Notify aclrtNotifyDestroy(notify); aclrtResetDeviceForce(1);通过VMM接口实现进程间共享内存除IPC Mem共享内存外Runtime还提供了另外一套内存管理和内存共享接口。VMMVirtual Memory Management这套接口提供更灵活的功能支持虚拟地址申请、物理内存申请和跨进程物理内存共享还支持虚拟地址与物理内存之间的映射操作。此处以A、B进程为例说明一个Device上、两个进程间的物理内存共享的示例代码不可以直接拷贝编译运行仅供参考完整样例代码请参见Link。若A、B进程使用不同的Device还需配合使用aclrtDeviceEnablePeerAccess接口开启跨Device的数据交互详细描述请参见跨Device的数据交互。在A进程中// 查询内存申请粒度 const size_t dataSize 1024 * sizeof(float); aclrtPhysicalMemProp prop {}; prop.handleType ACL_MEM_HANDLE_TYPE_NONE; prop.allocationType ACL_MEM_ALLOCATION_TYPE_PINNED; prop.location.type ACL_MEM_LOCATION_TYPE_DEVICE; prop.location.id 0; prop.memAttr ACL_HBM_MEM_NORMAL; size_t granularity 0UL; aclrtMemGetAllocationGranularity(prop, ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM, granularity); // 基于内存申请粒度申请物理内存 size_t alignedSize ((dataSize granularity - 1U) / granularity) * granularity; aclrtDrvMemHandle handle nullptr; aclrtMallocPhysical(handle, alignedSize, prop, 0); // 预留虚拟内存 void *virPtr; aclrtReserveMemAddress(virPtr, alignedSize, 0, nullptr, 0); // 将虚拟内存映射到物理内存 aclrtMapMem(virPtr, alignedSize, 0, handle, 0); aclrtMemAccessDesc desc {}; desc.flags ACL_RT_MEM_ACCESS_FLAGS_READWRITE; desc.location.id 0; desc.location.type ACL_MEM_LOCATION_TYPE_DEVICE; aclrtMemSetAccess(virPtr, alignedSize, desc, 1); // 使用virPtr进行复制、读、写等操作 ...... // 导入共享handle uint64_t shareableHandle 0ULL; aclrtMemExportToShareableHandle(handle, ACL_MEM_HANDLE_TYPE_NONE, ACL_RT_VMM_EXPORT_FLAG_DISABLE_PID_VALIDATION , shareableHandle); // 将共享handle传递给进程B writeFile(file/vmm_mem, shareableHandle, sizeof(shareableHandle)); // 取消虚拟内存与物理内存之间的映射关系 aclrtUnmapMem(virPtr); // 释放虚拟内存和物理内存 aclrtReleaseMemAddress(virPtr); aclrtFreePhysical(handle);在B进程中uint64_t shareableHandle 0ULL; // 从文件中获取共享handle readFile(file/vmm_mem, shareableHandle, sizeof(shareableHandle)); aclrtDrvMemHandle handle nullptr; int32_t deviceId0; aclrtMemImportFromShareableHandle(shareableHandle, deviceId, handle); // 查询内存申请粒度 const size_t data_size 1024 * sizeof(float); aclrtPhysicalMemProp prop {}; prop.handleType ACL_MEM_HANDLE_TYPE_NONE; prop.allocationType ACL_MEM_ALLOCATION_TYPE_PINNED; prop.location.type ACL_MEM_LOCATION_TYPE_DEVICE; prop.location.id 0; prop.memAttr ACL_HBM_MEM_NORMAL; size_t granularity 0UL; aclrtMemGetAllocationGranularity(prop, ACL_RT_MEM_ALLOC_GRANULARITY_MINIMUM, granularity); size_t alignedSize ((dataSize granularity - 1U) / granularity) * granularity; // 基于内存申请粒度预留虚拟内存 void *virPtr nullptr; aclrtReserveMemAddress(virPtr, alignedSize, 0, nullptr, 0); // 将虚拟内存映射到物理内存 aclrtMapMem(virPtr, alignedSize, 0, handle, 0); aclrtMemAccessDesc desc {}; desc.flags ACL_RT_MEM_ACCESS_FLAGS_READWRITE; desc.location.id 0; desc.location.type ACL_MEM_LOCATION_TYPE_DEVICE; aclrtMemSetAccess(virPtr,alignedSize, desc, 1); // 使用virPtr进行复制、读、写等操作 ...... // 取消虚拟内存与物理内存之间的映射关系 aclrtUnmapMem(virPtr); // 释放虚拟内存和物理内存 aclrtReleaseMemAddress(virPtr); aclrtFreePhysical(handle);【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关文章:

CANN Runtime进程间通信

# 进程间通信 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime 由某个主机线程创建的任意设备内存、Event资源或Notify资源,都可以在同一进程内被该进程中的其他线程直接引用。但…...

VR+AI赋能阅读障碍干预:个性化学习系统设计与实践

1. 项目概述:当技术成为阅读的“拐杖”作为一名长期关注教育技术与特殊教育交叉领域的从业者,我见过太多被“阅读障碍”这个标签困住的孩子。他们智力正常,甚至在某些方面天赋异禀,但面对书本上那些跳跃、扭曲的文字,却…...

生成式AI在软件质量保障中的应用:从测试生成到智能维护

1. 生成式AI如何重塑软件质量保障的底层逻辑在软件开发的漫长周期里,质量保障(SQA)一直是那个既关键又繁重的环节。传统上,它高度依赖工程师的经验、严谨的流程和大量重复性的人工操作——从编写测试用例、执行回归测试&#xff0…...

056、步进电机加减速曲线:梯形曲线

步进电机加减速曲线:梯形曲线 从一次丢步事故说起 去年做一台三轴点胶机,Z轴用57步进电机带丝杆,升降频率设成固定2000Hz。客户反馈点胶到第37个点的时候,针头突然扎歪,胶水涂到PCB板外面去了。我连夜赶去现场,用示波器抓驱动器的STEP脉冲——好家伙,电机在启动瞬间脉…...

055 步进电机控制:整步、半步、细分

055 步进电机控制:整步、半步、细分 一、从一次现场调试说起 去年在调试一台桌面型3D打印机时,遇到一个让人头疼的问题:打印到一半,电机突然发出尖锐的啸叫声,随后丢步,整个模型报废。客户用的是42步进电机,驱动器是A4988,设置的是1/16细分。我第一反应是电流设置不对…...

054、反电动势检测与无感控制

054、反电动势检测与无感控制 一、从一次电机“飞车”事故说起 去年调试一个无刷直流电机驱动器,客户要求去掉霍尔传感器,只留三根相线。我信心满满地移植了之前在某开源项目上跑过的反电动势检测方案,结果电机刚转起来就“嗡”的一声失控了——转速直接飙到标称值的两倍,…...

053、BLDC有感控制与无感控制

053、BLDC有感控制与无感控制 一、从一次电机“抽风”说起 去年调试一台工业风机,六步换相跑得挺顺,一换FOC就原地抽搐。示波器抓霍尔信号,波形干净得像教科书——但电机就是抖。折腾三天,最后发现是霍尔安装角度偏了0.5度。这0.5度在六步换相下根本看不出来,到了FOC的连…...

手机电源管理芯片技术演进与设计实践

1. 手机电源管理芯片的技术演进作为一名在电源管理领域工作多年的工程师,我见证了手机电源管理芯片从简单分立元件到高度集成PMU的完整发展历程。早期的手机电源设计采用大量分立元件,不仅占用宝贵的PCB空间,还导致整体效率低下。记得2000年初…...

联网汽车测试技术:从协议到安全的全面解析

1. 联网汽车测试技术全景解析在汽车智能化浪潮中,联网汽车测试技术正成为确保行车安全与通信可靠性的关键防线。现代车辆已演变为移动的物联网终端,集成超过1.5亿行代码和上百个ECU(电子控制单元),其复杂程度远超智能手…...

物理信息AI与神经拉格朗日大涡模拟:CFD湍流建模新范式

1. 项目概述:当湍流遇见AI,一场计算流体力学的静默革命如果你在计算流体动力学(CFD)领域摸爬滚打过几年,一定会对湍流建模又爱又恨。爱的是,它几乎是所有工业设计——从飞机机翼到汽车外形,从燃…...

mcp-use:统一工具管理与工作流编排的模块化平台实践

1. 项目概述:一个“元”工具集的核心价值在软件开发与系统运维的日常里,我们常常会陷入一种循环:为了解决一个具体问题,我们寻找或编写一个工具;当遇到下一个类似但略有不同的问题时,我们又得重复这个过程。…...

法律领域可论证AI:从可解释到可信推理的工程实践

1. 项目概述:当法律遇上大语言模型,可信是唯一的通行证最近几年,大语言模型(LLM)在法律领域的应用讨论热度不减。从辅助合同审查、法律文书生成,到案情分析、法律咨询,似乎每个环节都能看到它的…...

AI编程助手必备:claude-code-lsps语言服务器集合配置指南

1. 项目概述:当Claude遇上LSP,一个为AI编程助手量身定制的语言服务器集合如果你和我一样,日常重度依赖像Cursor、Claude Code这类AI驱动的代码编辑器,那你肯定遇到过这样的场景:AI助手给你生成了一段看起来不错的代码&…...

KVQuant技术解析:量化KV Cache实现大模型百万级长上下文推理

1. KVQuant:如何让大模型“记住”百万字对话?如果你尝试过在本地运行像LLaMA这样的大语言模型,并且把对话上下文拉得稍微长一点,比如超过几千个token,大概率会遇到一个让人头疼的问题:显存爆炸。这背后的“…...

多智能体协同框架:从概念到实践,构建AI智能体集群的空中交通管制塔

1. 项目概述:一个面向AI智能体集群的“空中交通管制塔”最近在开源社区里,我注意到一个名为ofershap/agents-control-tower的项目,这个名字本身就很有意思,直译过来是“智能体控制塔”。如果你和我一样,正在探索如何将…...

GitHub代码搜索实战:精准挖掘AI编程助手配置文件与最佳实践

1. 为什么你需要这份AI助手配置搜索指南如果你正在使用Claude Code、Cursor、Windsurf或者GitHub Copilot这类AI编程助手,并且已经不止一次地对着空白的配置文件发呆,思考着“别人到底是怎么配置这玩意的?”,那么这份指南就是为你…...

KnowLM开源框架:知识增强大模型在信息抽取与对话中的实践指南

1. 项目概述:一个为知识而生的开源大语言模型框架 如果你正在寻找一个能够处理中文和英文、专注于知识增强与信息抽取、并且提供从数据处理到模型部署完整流程的开源大语言模型框架,那么 zjunlp/KnowLM 绝对值得你花时间深入了解。这不是一个简单的模…...

目标导向DNN分割:实现边缘AI低能耗推理的动态聚焦技术

1. 项目概述:当边缘计算遇上深度学习分割这几年,我一直在边缘计算和嵌入式AI的交叉领域里折腾。从早期的树莓派跑YOLO,到后来的Jetson Nano部署语义分割模型,一个核心的矛盾始终横在面前:模型精度与推理能耗的拉锯战。…...

PromptCraft-Robotics:用大语言模型与提示工程控制机器人仿真

1. 项目概述:当大语言模型遇见机器人如果你和我一样,既对机器人技术着迷,又对ChatGPT这类大语言模型(LLM)的“涌现”能力感到好奇,那么微软开源的PromptCraft-Robotics项目绝对是一个不容错过的宝藏。这个项…...

多机器人协作运输系统的强化学习实现与优化

1. 项目概述在仓储物流、建筑施工等工业场景中,多机器人协作运输系统正展现出巨大的应用潜力。想象一下,当需要搬运超长钢管或重型设备时,传统单机器人系统往往力不从心。而由多个四足机器人组成的协作系统,就像一支训练有素的搬运…...

命令行交互革命:用Rust TUI工具cliclaw提升终端效率

1. 项目概述:一个为命令行注入灵魂的交互式工具如果你和我一样,每天的工作都离不开终端,那一定对命令行又爱又恨。爱的是它的高效和强大,一个命令就能完成图形界面里需要点半天鼠标的操作;恨的是那些冗长、复杂、需要反…...

基于Claude Code的多智能体协同系统:AI代码审查与修复实战

1. 项目概述:一个面向生产环境的AI多智能体代码协作系统 如果你和我一样,每天都要在代码编辑器、终端和浏览器之间来回切换,处理代码审查、重构和修复,那你肯定也幻想过能有一个“超级副驾”——它不仅能理解你的意图,…...

KeymouseGo终极指南:三步解放双手,告别重复工作的鼠标键盘自动化神器

KeymouseGo终极指南:三步解放双手,告别重复工作的鼠标键盘自动化神器 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke…...

ARM ITS寄存器架构与中断翻译机制详解

1. ARM ITS寄存器架构概述在ARMv8/v9架构中,中断翻译服务(Interrupt Translation Service, ITS)是通用中断控制器(GIC)的关键组件,负责将设备产生的中断事件(EventID)转换为对应的LPI(Locality-specific Peripheral Interrupt)中断。ITS通过一组精心设计…...

Claude驱动的ASO审计技能:AI自动化优化应用商店列表

1. 项目概述:Claude驱动的ASO审计技能最近在开发者社区里,看到不少朋友在讨论一个名为“claude-aso-audit-skill”的项目。乍一看这个标题,可能有点摸不着头脑,但作为一个在应用商店优化和AI工具应用领域摸爬滚打了十来年的老手&a…...

为 Claude Code 配置 TaoToken 解决密钥被封与额度不足问题

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为 Claude Code 配置 TaoToken 解决密钥被封与额度不足问题 基础教程类,指导因 Claude Code 原生 API 访问受限的用户&…...

基于MCP协议构建金融数据服务器:AI Agent与量化分析实践

1. 项目概述:一个面向金融数据处理的MCP服务器最近在折腾一个挺有意思的项目,叫imviky-ctrl/tickerr-mcp。乍一看这个名字,可能有点摸不着头脑,但如果你对金融量化、数据分析或者AI Agent开发感兴趣,那这个项目绝对值得…...

TradeClaw:基于大语言模型与深度学习的量化交易AI工具集实战解析

1. 项目概述:一个面向量化交易的AI工具集 最近在GitHub上闲逛,发现了一个挺有意思的项目,叫“TradeClaw”。光看名字,Trade(交易) Claw(爪子),就透着一股子要“抓取”市场…...

AI驱动优化算法选择:从梯度下降到列生成的工程实践指南

1. 项目概述:当优化问题遇上AI,我们如何选择与设计算法?在工业调度、物流规划、金融风控这些领域,我们每天都要和“优化”打交道。简单说,就是在一堆限制条件下,找到那个“最好”的方案。比如,怎…...

AI模型公平性挑战与缓解策略:从数据偏见到算法公正

1. 项目概述:当AI开始“看人下菜碟” 最近几年,AI模型在各个领域大放异彩,从筛选简历到审批贷款,从医疗诊断到司法量刑辅助,其决策的影响力日益深远。然而,一个幽灵正在AI的世界里徘徊——不公平的幽灵。你…...