异构计算

使用Ascend C进行编程时,会涉及到在两个不同的平台(Host、Device)上开发代码。本章简单介绍Host、Device之间的差异,便于开发者宏观的了解这个异构系统;同时给出算子相关的数据流,结合异构架构的特点,开发者可以进一步了解应该如何合理安排算子代码的执行位置,便于得到更好的性能。

Host侧CPU和Device侧NPU的主要区别

如何合理安排算子代码

开发者进行Ascend C算子开发时,可以将Host和Device视为一个协同的异构系统,为每个处理单元分配其擅长的工作。在Host侧推荐执行非计算密集型任务,一般为标量计算任务。在Device侧推荐进行计算密集型任务,利用Device侧NPU的SIMD(Single Instruction Multiple Data)指令可以高效的实现批量数据的矩阵运算、向量运算等。

Ascend C算子的实现主要包含两个部分:

算子数据流

算子执行过程中涉及到Host和Device的数据交换。这里仅针对Tiling参数的传递,给出具体的数据流:Host侧Tiling算法根据算子具体输入输出的信息,完成Tiling参数的计算,并存放在Tiling结构体中;将Host侧的Tiling结构体发送到Device侧,Device侧的算子获取并解析Tiling结构体,基于该信息执行后续的算子计算逻辑。

图1 算子Tiling传递数据流