由于之前使用过Cuda和Triton在GPU上进行算子开发,有一个经验就是:用Cuda开发的算子经过全方位的非常深度的优化,性能才能追平用triton直接开发的算子,一旦优化不够,性能和triton差距往往很大。因为triton有很成熟的自动优化机制,但是cuda所有的优化都要自己来,而且当输入数据的尺寸不固定时,优化难度就更大了。而且triton的算子开发难度很小,也不需要怎么考虑优化的问题,就是简单将算子的计算逻辑实现了就够了,但是性能却能达到cuda经过很大程度优化的性能,性价比极高。
所以我看到华为在NPU上开发算子也提供了两套方案:TBE和Ascend C。前者基于python开发,后者基于C++开发。我目前的理解是TBE就相当于是NPU上的Triton,也可以自动优化,开发难度低,简单实现就能达到很高的性能。Ascend则相当于Cuda,开发难度大,往往需要非常深度的优化才能在性能上接近用TBE实现的算子,没有一定开发经验想要超过TBE基本不可能。
所以如果刚接触这两套开发工具链,想要开发NPU上的算子,而且算子的输入形状是可变的。但是不追求极致性能(但是性能也要过得去,最起码要达到极致性能的70%),使用哪一个更加容易达到呢?
由于之前使用过Cuda和Triton在GPU上进行算子开发,有一个经验就是:用Cuda开发的算子经过全方位的非常深度的优化,性能才能追平用triton直接开发的算子,一旦优化不够,性能和triton差距往往很大。因为triton有很成熟的自动优化机制,但是cuda所有的优化都要自己来,而且当输入数据的尺寸不固定时,优化难度就更大了。而且triton的算子开发难度很小,也不需要怎么考虑优化的问题,就是简单将算子的计算逻辑实现了就够了,但是性能却能达到cuda经过很大程度优化的性能,性价比极高。
所以我看到华为在NPU上开发算子也提供了两套方案:TBE和Ascend C。前者基于python开发,后者基于C++开发。我目前的理解是TBE就相当于是NPU上的Triton,也可以自动优化,开发难度低,简单实现就能达到很高的性能。Ascend则相当于Cuda,开发难度大,往往需要非常深度的优化才能在性能上接近用TBE实现的算子,没有一定开发经验想要超过TBE基本不可能。
所以如果刚接触这两套开发工具链,想要开发NPU上的算子,而且算子的输入形状是可变的。但是不追求极致性能(但是性能也要过得去,最起码要达到极致性能的70%),使用哪一个更加容易达到呢?