这两天kerminal在做推广,我试用了一下他们的工具。有一些值得分享的感受。首先这个工具的前身是kernelcat,当时在几十分钟内写好了最新的DeepSeek mHc算子,还引起了一点轰动。据说写的加法能到官方baseline的九倍。这次不限量试用,我直接吃螃蟹。
编写算子
首先让他写了一个ScatterElements,能够写出来,验证也是通过的。我要求直接用pybind11,这样我用python就能调用,他写出来的工程看起来也比之前我们构建的aclnn工程要简洁很多,这个确实好评啊。
优化算子
我让他优化一下我写的算子,大概给了四个优化。一是使用DataCopy取代SetValue和GetValue,这个一般人都不会用SetValue吧(这里指的是原数据到目标数据的拷贝)。ScatterElements的更新还是只能用全局的操作,因为是Scatter的嘛。
第二个优化是利用DataCopy一次读一块index和update,这个见仁见智,小规模的场景还会占用UB,效果也并不一定好。
第三个优化是把坐标的递增逻辑从除法改成累加,这个对1D的效果不大,因为计算除法的部分可以被编译器优化掉。这个优化确实比较细节了,原理上听起来非常类似于,把除法换成移位操作。
第四个优化是把kernel从一个分裂成两个,一个kernel专门负责拷贝,一个kernel专门负责更新。
优化之后,我发现他搞错了我的910B3的AIV数目了,只用了20个AIV。这个确实有点出乎我意料了,比较简单能想起来的优化了算是。
用Triton-Ascend
这个确实出乎意料,我让他用了Triton-Ascend写算子,他也写出来了,而且测试也能过,确实很不错。不过在写的时候他说Triton-Ascend只支持int64,我让他检查了这个事情,又否认了,并且写出来了一版int32的。