点云前处理介绍
为了更好地帮助您理解DSP示例包提供的 CenterPoint 五维点云前处理,本章节从算法原理出发,分析CPU和DSP参考实现,同时对CPU和DSP参考实现进行一致性校验和性能评测。示例包中同时也提供了 PointPillars 四维点云前处理,与 CenterPoint 类似,
两者前处理的主要特点是通过体素化生成柱体( pillars )。本章节主要介绍 CenterPoint 前处理实现,并使用单独的一节介绍 PointPillars 前处理在实现上的不同之处。
原理介绍
本章节使用五维 CenterPoint 模型作为示例介绍,其相应的原理和前处理算法实现也可适用于四维的 PointPillars 模型。模型的输入为五维点云数据,最大点数为30万。前处理主要由体素化,特征编码,量化和转置组成。前处理输出 1x5x20x40064(nchw) 的特征图和 1x1x40000x4(nhwc) 的坐标信息。
体素化
根据输入的五维点云数据的 x , y 坐标计算出柱体的坐标,最大的柱体数目为 40000 ,每个柱体最大支持的点数为 20 。柱体坐标的计算原理如下:
-
判断点云的
x,y,z是否在有效的范围内,跳过无效的点云数据。 -
点云的
x,y信息可以被视为伪图像,伪图像中的每一个像素对应一个柱体坐标。 -
输入点云的坐标是无序的,因此需要按照坐标的输入顺序确定柱体坐标,当柱体数超过模型限制的最大值之后,不会生成新的柱体,而是将点写入到最后一个柱体中。
-
相同坐标的点会放入同一个柱体中,模型限制每一个柱体中点的数目,当超过最大限制时,则直接跳过该点。
特征编码
点云数据的特征编码使用如下的公式:
量化
量化的scale可以通过模型获取,使用以下公式完成量化:
转置
模型输入的特征图 layout 模式为 NCHW ,转置将特征图的 shape 从 1x40000x20x5 转换为 1x5x20x40064。
CPU参考实现
CPU参考实现的源码位于 AI Benchmark 中,其前处理基本流程与原理介绍部分保持一致,其中量化合并到特征编码步骤中。
体素化
特征编码 & 量化
转置
DSP优化加速
主要从两个方面考虑算子在DSP上的加速实现,第一是算子的计算部分, J6上的DSP支持1024bit的SIMD ,因此将计算部分尽可能向量化可以充分利用DSP的算力。第二是算子的访存部分,J6上的DSP有两个256kB的TCM ,其访存性能接近CPU上的cache,因此将数据尽可能搬移到TCM上 ,能有效地节约访存的开销。同时DSP也提供向量化的访存指令,也可以提高访存的效率。
DSP加速思路
向量化
对于五维模型,可以将计算过程分为5个cycle,每个cycle计算一个维度,使用IVP向量指令完成运算。
具体到 CenterPoint 点云前处理算法,在计算伪图像的坐标,特征编码以及量化等计算过程,都可以将每个维度独立计算,因此很容易转换成向量化的计算。
访存优化
点云输入数据从x,y维度来看是无序的,导致计算出的柱体坐标和柱体中点的索引也是无序的,从而导致访存是随机而不是效率更高的顺序操作。由于DSP上没有data cache,随机访存非常不友好,因此需要充分利用DSP上的TCM。DSP上可用的TCM只有两个256kB,而特征数据输出的地址空间为40000x20=781.25kB,远大于TCM的内存大小。同时计算体素坐标时,也需要一个伪图像坐标与柱体坐标的查找表,该表所需的内存为512x512x4=1MB(512为伪图像的宽和高,4为柱体坐标所需的字节数),也是远远超出TCM的内存大小。考虑到将随机访存搬移到DSP代价太大,因此将前处理算法中的计算和访存进行分离,计算部分放到DSP上,而把部分随机访存放到CPU上执行。同时为了减少访存的数据量,DSP加速实现调整了CPU实现的步骤,将特征编码和量化提前到计算伪图像坐标之后。通过这样的处理,后续的体素化和转置步骤访存所需的数据量将大大减少。 虽然这会增加更多的计算量,但是通过实际评测可见,减少访存数据量带来的收益会更大,特别是在有效点云数较大的情况下。
分块策略
虽然有两个256kB的TCM,但是每一个计算周期只使用其中一个,原因主要有以下两个:
-
需要使用Pingpong buffer,减少等待数据拷贝完成的时间;
-
Pingpong buffer需要位于不同的TCM中,减少data bank conflict。
DSP上的计算被拆为两个部分,一个是计算伪图像坐标,另一个是特征编码,量化和转置:
-
计算伪图像坐标,每个计算周期,输入为五维的点云数据,输出为单个维度的数据,输入与输出比为5:1,因此输入与输出的TCM内存大小比例也为5:1;
-
特征编码,量化和转置,每个计算周期,输入为五维点云数据,输出为量化后的单维度数据,输入与输出比为20:1。
DSP优化实现
DSP的IVP指令可以参考cadence提供的文档 ISA/NewISAhtml/index.html ,TCM内存管理接口的详细介绍可以参考 Xtensa Vision Tile Manager Library User's Guide ,IDMA相关接口详细介绍可以参考 Xtensa System Software Reference Manual 。
伪图像坐标计算,特征编码和转置(DSP计算部分)
与CPU参考实现中计算伪图像坐标方法基本一致,主要区别有以下几点:
-
去掉一维坐标的计算,通过32位的高低16位存储伪图像x和y坐标(示例模型伪图像的宽高为512,16位已足够存储),同时以二维坐标作为索引,用于查找对应的柱体坐标;
-
在过滤无效的点云数据时,使用mask move取代条件判断语句。因为在内循环中使用条件判断会明显降低运算性能;
体素化(CPU访存部分)
计算逻辑和CPU参考实现基本一致,主要有以下几点区别:
-
使用二维数组查找表,并且直接使用伪图像的x,y作为索引;
-
输出voxel_data的索引计算方式不同,因为DSP gather/scatter不能超出64kB的地址空间限制,因此提前按照最终特征数据的shape进行计算输出索引;
转置
将 AoS 格式的点云转置为 SoA 格式。
一致性校验
分别导出CPU和DSP参考实现的点云前处理输出特征数据和坐标信息到文件,比对文件内容是否一致,如果一致则通过一致性校验。
在AI Benchmark中,可以执行完整的全流程精度评测,当前DSP参考实现与CPU参考实现精度完全一致。
如果您不要求DSP实现的精度与CPU实现具有完全一致的精度,那么可以通过优化浮点运算来进一步提升性能。例如,通过将耗时的除法运算替换为乘法运算。
性能评测
在AI Benchmark中,执行CenterPoint模型的延时测试,比较CPU和DSP参考实现的单帧延时。通过实际测试发现,voxel_num对点云前处理的耗时影响较大,因此这里选择几组不同voxel_num的数据,以对比CPU参考实现和DSP参考实现的性能。
单线程单帧延时测试结果如下:
PointPillars前处理实现简介
PointPillars四维点云前处理与CenterPoint五维点云前处理的基本处理逻辑相同,主要有以下两点区别:
-
点云输入维度不同;
-
点云前处理后的输出
layout不同。
针对以上两点差异,以下将分别阐述DSP加速实现上的不同之处:
- 点云输入维度不同
-
PointPillars四维点云输入经过量化后,其数据大小正好适配int32_t类型,无需像CenterPoint那样对第五维量化后的数据进行padding操作以适配int32_t类型。 -
第一步计算伪图像坐标,特征编码和量化步骤的输入输出
TCM大小比例不同。CenterPoint为5:3,PointPillar为2:1,输入为四维浮点点云数据(float32_t),输出为伪图像坐标(int32_t)和量化后的xyzr数据(int32_t)。 -
由于维度的差异,对输入点云的
gather操作所需的offset计算不同。
- 点云前处理后的输出
layout不同
-
在体素化(CPU访存)步骤中,
voxel_data的offset计算方式存在差异。 -
由于输出
layout不同,转置部分的输入输出TCM大小比例存在差异。CenterPoint的比例为5:1,而PointPillars的比例为4:1。 -
转置的处理逻辑不同,具体的差异参见下图。


根据图示,CenterPoint和PointPillars在max_point_in_voxel和max_voxel_num的顺序上存在差异,这导致了无效数据的分别不同。
具体来说,PointPillars的无效数据呈现出较为集中的分布特点,这有助于进行连续处理。相反,CenterPoint的无效数据则散布在各个voxel之间,呈现出交叉分布的特点。前处理的参数对算子的实现效率会有一定影响,可以进一步考虑根据不同的参数实现特定的逻辑。
