异步执行【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit当开发者完成一个Kernel核函数的编写后需要通过特定的下发/启动语法将其提交到指定的Stream计算流上执行。例如kernelnumBlocks, ubufDynSize, stream(参数列表); // 或使用对应的APIaclrtLaunchKernel*(...)这些核Kernel核函数都是通过CANN Runtime完成Kernel的加载与运行。CANN Runtime是CANN软件栈中负责驱动硬件执行与管理AI计算任务的核心组件它通过提供Device、Memory、Context、Stream、Kernel管理等API使得上层应用和框架能够高效利用AI处理器的硬件计算资源。完成Kernel加载和运行的主要流程分以下几步1. 初始化aclInit。 2. 运行时资源申请通过aclrtSetDevice和aclrtCreateStream分别申请Device、Stream运行管理资源。 3. 如果需要Device内存参与计算使用aclrtMalloc分配Device内存通过aclrtMemcpy或aclrtMemcpyAsync将Host侧内存拷贝到Device侧。 4. 通过kernelnumBlocks, ubufDynSize, stream(参数列表)调用核函数完成核函数的异步执行。 5. 执行核函数后需要同步等待核函数的执行完成。 6. 如果Host需要Device内存的计算结果使用aclrtMemcpy或aclrtMemcpyAsync将Device侧内存拷贝到Host侧。 7. 资源释放通过aclrtDestroyStream和aclrtResetDevice分别释放Stream、Device运行管理资源。 8. 去初始化aclFinalize。在这个过程中我们提到了Stream创建与销毁内存申请与拷贝异步调用与同步等待。在本节的其余部分我们将解释这些CANN Runtime的元素和对应的API。Stream管理Stream计算流本质上是一个有序的任务队列为开发者提供了一种表示“先序执行”的抽象机制程序可向队列中提交各类操作例如内存拷贝、核函数下发等所有任务将按入队顺序依次执行。单个计算流内队列头部任务优先执行执行完成后自动出队后续队列任务依次前移等待调度执行。同一个计算流中的任务具备串行执行特性严格遵循入队先后顺序运行。应用程序可同时创建并使用多个计算流。多流场景下运行时会根据AI处理器的硬件资源占用状态从存有待处理任务的计算流中择优调度任务执行。开发者可为计算流配置优先级该优先级将作为运行时调度的参考依据用以调整任务调度策略但无法强制保证固定的执行顺序。绑定在指定计算流内的API接口调用、核函数下发操作相对于主机CPU线程均为异步执行。 应用程序可通过等待目标计算流清空所有任务完成流级同步也可在整个设备维度完成全局同步。CANN Runtime内置默认计算流所有未显式指定计算流的运算操作、核函数下发任务都会默认排入该流中执行。绝大多数未手动指定计算流的业务代码都在隐式使用默认计算流。创建与销毁StreamaclrtCreateStream(stream)与aclrtDestroyStream(stream)。指定Stream执行核函数kernelnumBlocks, 0, stream(...)。指定Stream异步拷贝aclrtMemcpyAsync(..., stream)。指定Stream同步aclrtSynchronizeStream(stream)。Memory内存管理在异构计算架构中系统由主机Host和设备Device组成。Host和Device各自拥有独立的内存Host内存是指AI处理器所在服务器的主机内存即CPU内存而Device内存则是指AI处理器自带的设备内存。内存管理中要做好的两件事是可以访问内存Runtime提供了一套内存管理API使开发者能够高效便捷地编写应用程序中的内存管理代码。由于Host和Device的内存相互独立Runtime提供了专门的接口来分别申请和释放Host内存及Device内存。例如申请和释放Host内存的接口为aclrtMallocHost和aclrtFreeHost而申请和释放Device内存的接口为aclrtMalloc和aclrtFree。高效访问内存算子在Device上执行过程中访问Device上的Device内存数据性能更高。为此Runtime提供了Host与Device之间互相拷贝内存的接口支持同步和异步方式例如aclrtMemcpy和aclrtMemcpyAsync等以便开发者更好地规划数据的存储与访问。异步调用为了能够更好的发挥CPU和AI处理器的硬件利用率CANN Runtime遵循“下发即返回”的异步执行策略使Host在提交H2D/D2H拷贝或Kernel计算任务后立即继续执行后续逻辑从而让主机侧调度、设备侧计算、主机与设备之间的数据传输尽可能重叠执行隐藏传输和调度开销提高端到端吞吐率。典型异步调用的场景是将主机与设备计算操作重叠执行从而提升主机侧与设备侧计算资源利用率。同样地将aclrtMemcpy替换成aclrtMemcpyAsync接口可以实现主机与设备的内存传输与计算操作重叠执行从而降低甚至消除内存传输带来的性能开销。同步等待核函数的调用是异步的在核函数调用结束之后控制权立刻返回给主机端需要在host等待核函数的执行完成可以通过以下接口强制Host程序等待核函数执行完毕 |同步接口|接口描述| |-|-| |aclrtSynchronizeDevice()| 阻塞Host侧当前线程直到与当前线程绑定的Context所对应的Device中的所有操作都已完成。| |aclrtSynchronizeStream()|阻塞Host侧当前线程直到指定Stream中的所有操作都已完成。 |更多的Runtime高级特性更多的Runtime编程方式及接口可以参考《应用开发CC》。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考