开发者
资源
[object Object]
[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%。