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

时间:2024-10-05 22:49:14

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

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

在这里插入图片描述