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

举报
Byyyi耀 发表于 2024/10/03 11:05:33 2024/10/03
【摘要】 Ascend C 算子运行资源管理简介在 Ascend C 平台上开发深度学习应用时,运行资源的管理是一个核心知识点。通过合理管理算子执行中的计算资源,能够有效提升模型的执行效率和硬件利用率。本文将简要介绍 Ascend C 算子运行时的资源管理。 1. AscendCL 初始化与去初始化在进行任何 AscendCL 的算子开发之前,必须首先初始化 AscendCL 环境。使用aclIni...

image.png
image.png

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();

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。