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

Ascend C 算子运行资源管理简介

在这里插入图片描述
在这里插入图片描述

Ascend C 算子运行资源管理简介

在 Ascend C 平台上开发深度学习应用时,运行资源的管理是一个核心知识点。通过合理管理算子执行中的计算资源,能够有效提升模型的执行效率和硬件利用率。本文将简要介绍 Ascend C 算子运行时的资源管理。

1. AscendCL 初始化与去初始化

在进行任何 AscendCL 的算子开发之前,必须首先初始化 AscendCL 环境。使用aclInit()接口可以完成初始化。如果默认配置已经满足需求,直接传入NULL即可。

aclError ret = aclInit(NULL);

当所有 AscendCL 操作完成后,需要调用aclFinalize()进行去初始化,以释放所有相关资源。

ret = aclFinalize();
2. 资源申请与释放

在 Ascend C 上执行算子时,设备(Device)、上下文(Context)和流(Stream)是核心的运行资源。正确的资源管理流程对于保持程序稳定性至关重要。

2.1 资源申请流程

使用aclrtSetDevice指定运算设备。
通过aclrtCreateContext创建上下文。
使用aclrtCreateStream创建流,管理任务的执行。

int32_t deviceId = 0;
aclrtContext context;
aclrtStream stream;aclError ret = aclrtSetDevice(deviceId);
ret = aclrtCreateContext(&context, deviceId);
ret = aclrtCreateStream(&stream);
2.2 资源释放流程

使用aclrtDestroyStream销毁流。
通过aclrtDestroyContext销毁上下文。
使用aclrtResetDevice重置设备。

ret = aclrtDestroyStream(stream);
ret = aclrtDestroyContext(context);
ret = aclrtResetDevice(deviceId);
3. 数据传输

在算子执行时,Host(主机)和 Device(设备)之间的数据传输是必不可少的。AscendCL 提供了同步与异步两种传输模式。

3.1 同步与异步数据传输

同步数据传输通过 aclrtMemcpy 实现,适用于不需要并行处理的场景。异步数据传输通过 aclrtMemcpyAsync 实现,配合 aclrtSynchronizeStream 来确保流内的任务完成。

aclrtMemcpy(devPtr, size, hostPtr, size, ACL_MEMCPY_HOST_TO_DEVICE);
aclrtMemcpyAsync(devPtr, size, hostPtr, size, ACL_MEMCPY_HOST_TO_DEVICE, stream);
aclrtSynchronizeStream(stream);
4. Stream 管理

在 Ascend C 的开发中,Stream(流)是任务队列的抽象,管理任务的并行执行。通过合理利用 Stream,可以提升任务的并发执行效率。

4.1 单线程单 Stream

在单线程场景下,可以创建一个 Stream 来管理任务的顺序执行。任务在 Stream 中排队,依次执行。

4.2 多线程多 Stream

在多线程环境中,每个线程可以管理自己的 Stream,允许多个任务并行执行,显著提高计算效率。

aclrtStream stream1, stream2;
aclrtCreateStream(&stream1);
aclrtCreateStream(&stream2);
5. 同步与多 Device 切换

当多个 Device 协同工作时,需要在不同的设备之间切换执行环境。AscendCL 提供了 aclrtSetDevice 和 aclrtSetCurrentContext 来切换当前执行的设备和上下文。此外,aclrtSynchronizeDevice 接口用于等待设备上的所有任务执行完毕。

aclrtSetDevice(0);
aclrtSynchronizeDevice();

在这里插入图片描述


http://www.mrgr.cn/news/41403.html

相关文章:

  • TS(type,属性修饰符,抽象类,interface)一次性全部总结
  • 【MySQL】数据类型
  • 【C++】“list”的介绍和常用接口的模拟实现
  • 快餐时代读快书,十分钟左右就能读懂一本书
  • C++初学者指南-5.标准库(第二部分)–特殊迭代器
  • 成为AI产品经理,应该具备哪些条件?
  • 【JavaEE初阶】深入理解多线程阻塞队列的原理,如何实现生产者-消费者模型,以及服务器崩掉原因!!!
  • 【Linux进程间通信】Linux匿名管道详解:构建进程间通信的隐形桥梁
  • 二叉树进阶练习——根据二叉树创建字符串
  • 高斯消元 笔记
  • 110.WEB渗透测试-信息收集-ARL(1)
  • L8910 【哈工大_操作系统】CPU管理的直观想法多进程图像用户级线程
  • go结构体默认值和校验器(go-defaults、go-validator)
  • 【C++】C++基础
  • Redis: Sentinel节点管理,故障迁移一致性以及TILT模式
  • VPN简述
  • 基于YOLOv8的智能植物监测机器人
  • SQL:函数以及约束
  • 现在别买理想L7/L8,问界M8要来暴揍友商了
  • 胶片效果风格调色PS插件滤镜 VSCO PRO 中文版