在银河飞腾dsp下部署rpc应用有两种方式,一种是基于MindSpore ,使用高效便捷的python语言开发,一种是使用银河飞腾dsp提供的基于C语言的异构编程接口Hthreads。本文主要从程序员角度讲一下这两种方式的编程体验和这两种方式下部署的运行性能。
异构编程接口(Hthreads)由通用区域侧(如arm端)API和加速区域侧(如dsp端端)API组成,通过用户程序,通用区域中的arm核能够管理任务执行、运行操作系统以及处理通用任务,而加速区负责密集型计算任务。图1.1展示了Hthread控制加速区处理计算任务的主要流程。
图1.1 Hthread工作流程图
雷达脉冲压缩(RPC)的算法流程主要是:输入回波数据 → 数据重塑 → 截取有效部分 → 补零 → FFT → 频域相乘 → IFFT → 截取输出。在Hthread环境中开发rpc应用,前期的数据初始化在arm端进行,dsp端受arm核调用,进行密集计算任务。
编程对比
1. 内存管理差异
在内存管理上,python能自动内存管理(Tensor),无需显式分配/释放内存,使用预分配的张量操作,避免重复的内存分配和复制;Hthread-C语言版本,需要手动内存分配(Hthread_malloc/Hthread_free),需要管理数据对齐,显式的指针操作,具体差异如图1.2和1.3
Python中使用NumPy进行数组操作,不需要进行内存分配和释放,对整个数组或矩阵进行批量操作,不需要显式编写循环

图1.2 python循环体
Hthread-c中需要手动分配和释放内存,对变量明确声明且指定变量类型,且需要显式编写循环
图1.3 c循环体
2.向量化操作
Rpc应用中有大量的矩阵和向量操作(如FFT、乘法等),这些向量化操作在MindSpore中有优化实现。在C语言中,要么自己实现这些向量操作,要么使用第三方库(如FFTW),第三方库需要自己安装或者开发实现,大大增加了应用开发时间成本。
3.函数传参
rpc的主体流程如图1.4和1.5所示
图1.4 rpc 主体流程(python)
图1.5 rpc 主体流程(C)
在Python中,通过对象属性和方法调用传递参数,使得代码更加模块化和易于理解维护。对象内部的状态可以被对象的方法访问和修改,而无需将这些状态作为参数显式传递。这使得方法签名更简洁,并且对象的状态在多次方法调用之间可以保持。在C语言中,必须将数据和函数分离。数据存储在结构体中,函数接受结构体指针作为参数,从而模拟面向对象的行为。这需要更多的手动管理,并且代码更冗长。总的来说,Python的面向对象方式提供了更高的抽象级别,使得代码更易于理解和维护,而C语言的方式则更接近底层,提供了更多的控制权和更高的性能。
4.显式的异构管理流程
Hthread-c环境下开发rpc流程,需要按照图1.1所示的固有流程,手动进行初始化设备、设备资源管理以及设备资源释放,而基于MindSpore框架开发,该流程被隐藏,程序员不需要显式去管理。
5. 性能对比
Hthread-c环境下开发的rpc,在银河飞腾dsp开发板上主体流程运行开销是86ms,基于MindSpore 框架开发的运行开销是88ms,相比之下,使用框架开发不仅更具便捷,使得开发一个大型应用的时间大大缩短,而且因框架调用导致的性能损失也较小。



