AscendCL运行资源管理
申请运行管理资源时,需按顺序依次申请: Device、Context、Stream,然后根据实际需求调用aclrtGetRunMode接口获取软件栈的运行模型(当同一个应用既支持在Host运行,也支持在Device运行时,在编程时需要就需要根据运行模式来判断后续的接口调用逻辑,这时需要提前获取运行模式。)。
调用aclrtSetDevice接口显式指定用于运算的Device。调用aclrtCreateContext接口显式创建Context,调用aclrtCreateStream接口显式创建Stream。
不显式创建Context和Stream,系统会使用默认Context、默认Stream该默认Context、默认Stream是在调用aclrtSetDevice接口时隐式创建的默认Context、默认Stream作为接口入参时,直接传NULL。不显式指定用于运算的Device。
调用aclrtCreateContext接口显式创建Context,调用aclrtCreateStream接口显式创建Stream。 系统在显式创建Context时,系统内部会调用acirtSetDevice接口指定运行的Device,Device ID通过aclrtCreateContext接口传入。
接口命名规则
Device管理
Context管理
Stream管理
原理介绍
在ACL中,Stream是一个任务队列,应用程序通过Stream来管理任务的并行,一个Stream内部的任务保序执行,即Stream根据发送过来的任务依次执行;不同Stream中的任务并行执行。一个默认Context下会挂一个默认Stream,如果不显式创建Stream,可使用默认Stream。
AscendCL内存管理&数据传输
ACL是有一套自己的内存管理逻辑的,任何用于参与ACL运算的内存(Device侧)都不能是C/C++原生内存管理接口(Malloc、new) 申请的内存,而是调用ACL提供的内存管理专用接口回忆一下: ACL在设备的管理上,是要区分Host和Device的 (还记得aclrtGetRunMode接口吗? )所有的加速计算最终都是要在Device上执行的,也就是说所有的数据(数据集、模型等)最终都会在Device侧参与计算,这里分两种场景:
Host&Device分设,如Atlas300场景 (虽然在同一台机器上,但是是通过PCle接口交的,本质上是两个设备)此时数据、模型都在host侧加载,然后将这些数据传输到device侧进行计算,计算完毕后将结果回传至host侧进行使用
Host&Device合设,如Atlas200Dk场景,此时不区分Host与Device,只有Device,数据、模型都在device上直接加载、计算、使用
本模块就是要跟大家分享如何在Host侧和Device侧分别申请内存,并将数据在两端进行传输(复制)