[object Object]
【优先级】高
【描述】基于SIMD编程模型实现的批量数据计算性能很高,但在算子实现逻辑中涉及分支判断时,基于SIMD的计算操作会变得相对复杂,导致性能下降。此时,可以考虑采用SIMT方式,因为SIMT编程更为灵活,更适合处理分支判断的场景。
【样例介绍】以floor_mod算子为例,算子功能为将输入self的每个元素除以输入other的对应元素,获取余数。该余数应与除数other具有相同的符号,且其绝对值应小于other的绝对值。在计算过程中,需要判断other中每个元素的符号以及余数与该元素绝对值的大小关系。
【反例】
基于SIMD的floor_mod算子实现:由于SIMD无法直接实现分支判断逻辑,因此需要使用多个Reg矢量计算API来完成分支判断,相关代码如下。
[object Object]
【正例】
基于SIMT的floor_mod算子实现:采用SIMT编程方式实现计算过程,通过if else语句完成分支判断,代码如下所示,代码简洁且易于实现。完整的算子实现代码请参考。
[object Object]
【性能对比】
如下图所示,基于SIMD实现的floor_mod算子的Kernel执行耗时为4.03us。
图 1 SIMD实现floor_mod的耗时[object Object][object Object]
如下图所示,基于SIMT实现的floor_mod算子的Kernel执行耗时为3.444us。
图 2 SIMT实现floor_mod的耗时[object Object][object Object]
在核数不变、每个核处理的数据量相同且数据统一搬运到Unified Buffer上进行计算的情况下,使用SIMT实现分支判断的性能比使用SIMD实现的性能提升了14.6%。