【Atlas200】Host?Device?RC?EP?
因此,在Atlas200DK上运行推理应用时,进程是在NPU上启动的,数据也是直接加载到Device内存中的,没有Host侧的参与,因此不存在Host->Device的数据传输过程。需要注意的是,使用aclrtMallocHost申请的内存必须由aclrtFreeHost来释放,二者是强对应的,不能用于其他内存。它的实际含义是“申请本端内存”,也就是说,如果进程运行在Host上,它将申请Host内
atlas500的ep模式

如上图所示,cpu+内存一侧为host侧;而gpu+显存一侧为device侧。
Atlas 200 DK的

在昇腾310AI处理器(NPU)中,Davinci Core负责专用计算,而Control CPU则负责通用计算。因此,在Atlas200DK上运行推理应用时,进程是在NPU上启动的,数据也是直接加载到Device内存中的,没有Host侧的参与,因此不存在Host->Device的数据传输过程。这种形态被称为RC(Root Complex)模式,即计算设备直接承担主控任务,自身即为“根”。这种模式的优点在于内存管理简单,无需考虑Host侧的事情。但是缺点也很明显,即无法平行接入同类设备。也就是说,如果一个Atlas200做主控,则无法平行接入另一个Atlas200进行并行计算,从而失去了扩展性。
host侧内存地址的分配
aclError aclrtMallocHost(void **hostPtr, size_t size);
aclError aclrtFreeHost(void *hostPtr);
需要注意的是,使用aclrtMallocHost申请的内存必须由aclrtFreeHost来释放,二者是强对应的,不能用于其他内存。虽然这听起来有些拗口,但实际上很简单。另外,在Host侧申请内存时,并不一定非要使用aclrtMallocHost接口,也可以使用new或malloc等接口。但需要满足以下要求:
每段内存的大小必须向上对齐成32的整数倍再加上32字节,并且内存的起始地址必须满足64字节对齐。
如果使用new或malloc等接口申请内存,需要自己实现对齐操作,而aclrtMallocHost已经自动完成了对齐操作。
Device侧内存管理
申请和释放两个接口的配套关系和Host类似,aclrtMalloc和aclrtFree要成对出现。
用aclrtMalloc申请出来的内存也是对齐过的,对齐方式和Host侧一致。针对大块内存的操作方法也和Host一样。
aclError aclrtMalloc(void **devPtr, size_t size, aclrtMemMallocPolicy policy);
aclError aclrtFree(void *devPtr);
内存的拷贝
接下来就是内存的拷贝了。内存有两种,而拷贝这个动作又分“源地址”和“目的地址”,所以在AscendCL的内存拷贝动作中,共有4种拷贝方向:
• Host -> Host
• Host -> Device
• Device -> Host
• Device -> Device
判断进程是在host上还是device上:
AscendCL提供了一个接口,用于判断当前进程是跑在Host上还是Device上:
aclError aclrtGetRunMode(aclrtRunMode *runMode);
其中runMode参数是接口调用后输出的一个枚举值,有两种可能:
• ACL_DEVICE, //昇腾AI软件栈运行在Device的Control CPU或板端环境上
• ACL_HOST, //昇腾AI软件栈运行在Host CPU上 如果是运行在Device上,那就直接申请Device内存来使用就行了;如果是运行在Host上,要两侧内存都申请,并且将数据从Host拷贝到Device上。
相关判断代码示例:
aclrtRunMode runMode;
aclrtGetRunMode(&runMode);
if(runMode==ACL_DEVICE)
{
printf("working on device\n");
}
else if(runMode==ACL_HOST)
{
printf("working on host\n");
}
以此来判断程序是运行在device上还是host上。
复用方案
aclrtMallocHost有一个特殊之处。它的实际含义是“申请本端内存”,也就是说,如果进程运行在Host上,它将申请Host内存,而如果进程运行在Device上,则将申请Device内存。如果您不想让应用程序变得过于复杂,可以考虑以下方法:
aclrtMallocHost->aclrtMalloc->aclrtMemcpy(host-device)
如果应用运行在Host侧,就跟正常执行逻辑一样;如果应用运行在Device侧,上边这个过程相当于:
aclrtMalloc->aclrtMalloc->aclrtMemcpy(device-device)
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐

所有评论(0)